通用的控件之間的拖放方法(Drag and Drop)

由於不知道哪裏可以放源程序,所以只有在這裏說說思路了。

利用剪貼板,註冊一個剪貼板文件類型.

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);
這樣就實現了拖放。。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章