包含两个头文件可以从网上下载 OleDropTargetEx.h OleDropTargetEx.cpp
在要实现拖动功能的的头文件添加函数:
virtual BOOL Register();
COleDropTargetEx m_dropEx;
virtual BOOL OnDrop(WPARAM pDropInfoClass, LPARAM lParm);
virtual DROPEFFECT OnDropEx(WPARAM pDropInfoClass, LPARAM lParm);
virtual DROPEFFECT OnDragOver(WPARAM pDropInfoClass,LPARAM lParm);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);//确定拖动动作的开始
在实现文件定义如下:
void CRosterTree::OnLButtonDown(UINT nFlags, CPoint point)
{
CTreeCtrl::OnLButtonDown(nFlags, point);
HTREEITEM hItem = GetSelectedItem();
if (hItem == NULL)
{
return;
}
if (ItemHasChildren(hItem))
{
return ;
}
Sleep(250);
MSG msg;
::PeekMessage(&msg,GetSafeHwnd(),WM_LBUTTONUP,WM_LBUTTONUP,PM_NOREMOVE);
if( msg.message==WM_LBUTTONUP )
return;
CRosterNode *pRoserNode = (CRosterNode*)GetItemData(hItem);
HGLOBAL hData = GlobalAlloc(GHND|GMEM_SHARE, sizeof(CRosterNode));
WCHAR *pS = (WCHAR *)GlobalLock( hData );
memcpy( pS, (LPCTSTR)pRoserNode, sizeof(CRosterNode));
GlobalUnlock( hData );
COleDataSource source;
source.CacheGlobalData( CF_TEXT, hData );
source.DoDragDrop( DROPEFFECT_COPY );
GlobalFree( hData );
}
DROPEFFECT CRosterTree::OnDropEx(WPARAM pDropInfoClass, LPARAM lParm)
{
return (DROPEFFECT)-1;
}
BOOL CRosterTree::OnDrop(WPARAM pDropInfoClass, LPARAM lParm)
{
COleDropInfo* pInfo = (COleDropInfo* )pDropInfoClass;
ASSERT(pInfo->IsKindOf(RUNTIME_CLASS(COleDropInfo)));
return TRUE;
}
DROPEFFECT CRosterTree::OnDragOver(WPARAM pDropInfoClass, LPARAM lParm)
{
COleDropInfo* pInfo = (COleDropInfo* )pDropInfoClass;
ASSERT(pInfo->IsKindOf(RUNTIME_CLASS(COleDropInfo)));
return DROPEFFECT_NONE;
}