由於不知道哪裏可以放源程序,所以只有在這裏說說思路了。
利用剪貼板,註冊一個剪貼板文件類型.
RegisterClipboardFormat( LPCTSTR lpszFormat );
註冊一個自定義的剪貼板格式,可以實現拖放任何數據。
下面介紹一下拖放的實現:
要使控件支持拖放,首先要實現一個類,繼承於COleDropTarget.然後
重載COleDropTarget的幾個函數。
virtual DROPEFFECT OnDragEnter( CWnd* pWnd, COleDataObject* pDataObject,
DWORD dwKeyState, CPoint point );
virtual DROPEFFECT OnDragOver( CWnd* pWnd, COleDataObject* pDataObject,
DWORD dwKeyState, CPoint point );
virtual void OnDragLeave( CWnd* pWnd );
virtual BOOL OnDrop(CWnd* pWnd, COleDataObject* pDataObject,
DROPEFFECT dropEffect, CPoint point);
然後對於要拖放的目標對象,註冊這個類。
m_DropTarget.Register(this);
在源對象開始拖動的時候,建立一個COleDataSource對象,並把要拖放
的數據放到裏面。
COleDataSource *poleSourceObj = new COleDataSource ;
HGLOBAL hData=GlobalAlloc(GHND|GMEM_SHARE,str.GetLength()+1);
strcpy((LPSTR)GlobalLock(hData),str.LockBuffer());
GlobalUnlock(hData);
poleSourceObj->CacheGlobalData(CF_TEXT,hData);
DROPEFFECT dropeffect = poleSourceObj->DoDragDrop();
if ( dropeffect == DROPEFFECT_MOVE)
DeleteItem(hTSelItem);
delete poleSourceObj;
在我們重載的OnDrop()函數
virtual BOOL OnDrop(CWnd* pWnd, COleDataObject* pDataObject,
DROPEFFECT dropEffect, CPoint point);
中,把數據提取出來。
HGLOBAL hData = pDataObject->GetGlobalData(CF_TEXT);
CString strTxt = (LPTSTR)GlobalLock(hData);
這樣就實現了拖放。。