程序有两个窗体——窗体1(主窗体),窗体2,拖动一些文字到窗体1上,发现鼠标是禁止的图标,怎样才能让窗体接收文字呢??接收后,如果想把文字传递给窗体2,让窗体2用canvas。txetout显示出来,应该怎么传递呢???
还请高手指教!

解决方案 »

  1.   

    应该是要用到钩子处理
    还要熟悉API函数
      

  2.   

    重写消息处理函数。
    Dispathch()
      

  3.   

    使用IDragDrop这个接口,很好的哦。
    有了它你可以在任何地方进行拖拽。
      

  4.   

    给你一段我写的CB的代码,还没有翻译到DELPHI的版本,不过差不多,你自己翻译一下吧。
    最好是你找一下相关资料或者VCL控件
    //---------------------------------------------------------------------------
    #pragma hdrstop#include "DropTarget.h"
    extern UINT g_iRegisterCFHtml;
    extern bool g_bSebDrag;
    //---------------------------------------------------------------------------#pragma package(smart_init)HRESULT __stdcall TMyDropTarget::DragEnter(IDataObject *pDataObj,
        DWORD grfKeyState,POINTL pt,DWORD *pdwEffect)
    {
        //当有数据拖进来时,判断是否接受该数据
        //bSebCanDrop=!g_bSebDrag;
        HRESULT hr;
        FORMATETC fm;
        fm.ptd = NULL;
        fm.tymed=TYMED_HGLOBAL;
        fm.dwAspect=DVASPECT_CONTENT;
        fm.lindex=-1;    fm.cfFormat =g_iRegisterCFHtml;     //html 类型
        hr=pDataObj->QueryGetData(&fm);
        if(hr!=S_OK)
        {
            fm.cfFormat=CF_TEXT;            //文本类型
            hr=pDataObj->QueryGetData(&fm);
        }
        if(hr==S_OK)
        {
            return 0;
        }else
        {
            *pdwEffect=DROPEFFECT_NONE;
            return E_INVALIDARG;
        }
    }HRESULT __stdcall TMyDropTarget::DragOver(DWORD grfKeyState,
        POINTL pt,DWORD *pdwEffect)
    {
        return 0;
    }HRESULT __stdcall TMyDropTarget::DragLeave( void)
    {
        //g_bSebDrag=false;
        //bSebCanDrop=true;
        return 0;
    }HRESULT __stdcall TMyDropTarget::Drop(IDataObject *pDataObj,
        DWORD grfKeyState,POINTL pt,DWORD *pdwEffect)
    {
        //在鼠标拖动放下的时候接收数据
        //if(!bSebCanDrop)
        //{
        //    *pdwEffect=DROPEFFECT_NONE;
        //    g_bSebDrag=false;
        //    return E_INVALIDARG;
        //}    HRESULT hr;
        FORMATETC fm;
        fm.ptd = NULL;
        fm.tymed=TYMED_HGLOBAL;
        fm.dwAspect=DVASPECT_CONTENT;
        fm.lindex=-1;    fm.cfFormat =g_iRegisterCFHtml;
        hr=pDataObj->QueryGetData(&fm);
        if(hr!=S_OK)
        {
            fm.cfFormat=CF_TEXT;
            hr=pDataObj->QueryGetData(&fm);
        }
        if(hr==S_OK)
        {
            STGMEDIUM sm;
            hr=pDataObj->GetData(&fm,&sm);  //从数据对象中得到数据
            if(hr!=S_OK) return hr;
            char* data=(char*)GlobalLock(sm.hGlobal);
            (dde)((long)this,(ULONG)fm.cfFormat,(long)data);    //处理函数
            GlobalUnlock(sm.hGlobal);
            return 0;
        }else
            return E_INVALIDARG;}HRESULT __stdcall TMyDropTarget::QueryInterface(REFIID riid,void __RPC_FAR *__RPC_FAR *ppvObject)
    {
        //只包含着两个接口
        if(riid==IID_IUnknown || riid==IID_IDropTarget)
        {
            *ppvObject=(void*)this;
            AddRef();
            return 0;
        }
        else
        {
            *ppvObject=NULL;
            return E_NOINTERFACE;
        }
    }ULONG __stdcall TMyDropTarget::AddRef( void)
    {
        m_RefCount++;
        return m_RefCount;
    }ULONG __stdcall TMyDropTarget::Release( void)
    {
        m_RefCount--;
        if(m_RefCount==0)
        {
            delete this;
            return 0;
        }
        return m_RefCount;
    }
      

  5.   

    还有一组控件,你可以搜一下DropSource.pas       TDropFileSource Drag files from your application.
    TDropTextSource Drag text from your application.
    DropTarget.pas TDropFileTarget       Accept files dragged to your application.
    TDropTextTarget       Accept text dragged to your application.
    TDropDummy Just displays a drag image.
    DropBMPSource.pas TDropBMPSource Drag bitmaps from your application.
    DropBMPTarget.pas TDropBMPTarget Accept bitmaps dragged to your application.
    DropURLSource.pas TDropURLSource Drag URLs from your application.
    DropURLTarget.pas TDropURLTarget       Accept URLs dragged to your application.
    DropPIDLSource.pas TDropPIDLSource Drag PIDLs from your application.
    DropPIDLTarget.pas TDropPIDLTarget Accept PIDLs dragged to your application.
      

  6.   

    如果自己解决呢就要熟悉一下IDragDrop这个接口以及一系列的函数,如:RegisterDragDrop
    否则你就直接用TDragDrop好了,这个控件包好多地方都有的。
      

  7.   

    Delphi中本身就 Drag Drop类的函数,怎么不用呀
      

  8.   

    我不是写过一篇文章么,比较详细,去看看,用delphi实现的
    http://www.csdn.net/develop/read_article.asp?id=21115