如何把一个目录拖动到treectrl中并显示节点的变化(蓝色)? 本帖最后由 VisualEleven 于 2012-10-09 18:35:15 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你应该有个标记来表示当前的动作,是否是拖动还是只是简单的移动鼠标,应该也要处理WM_LBUTTONDOWN/WM_LBUTTONUP消息,DOWN的时候设置标记,UP的时候重置标记值。 本帖最后由 VisualEleven 于 2012-10-09 20:18:13 编辑 我以前做OLE拖拽,感觉只要处理一个事件就可以了啊。。我去翻下我老的代码 我当初是自己处理了3个事件DROPEFFECT CEX_RollupView::OnDragOver(WPARAM pDropInfoClass, LPARAM lParm){ COleDropInfo* pInfo = (COleDropInfo* )pDropInfoClass; ASSERT(pInfo->IsKindOf(RUNTIME_CLASS(COleDropInfo))); if( pInfo->m_pDataObject->IsDataAvailable( CF_TEXT ) ) return DROPEFFECT_COPY; else return DROPEFFECT_NONE;}DROPEFFECT CEX_RollupView::OnDropEx(WPARAM pDropInfoClass, LPARAM lParm){ return (DROPEFFECT)-1;}BOOL CEX_RollupView::OnDrop(WPARAM pDropInfoClass, LPARAM lParm){ COleDropInfo* pInfo = (COleDropInfo* )pDropInfoClass; ASSERT(pInfo->IsKindOf(RUNTIME_CLASS(COleDropInfo))); if( pInfo->m_pDataObject->IsDataAvailable( CF_TEXT ) ) { HGLOBAL hMem = pInfo->m_pDataObject->GetGlobalData( CF_TEXT ); char* lp = (char *)GlobalLock((HGLOBAL) hMem);//lock source if (lp != NULL) { ShowControl(lp); } GlobalUnlock( hMem );//unlock source return TRUE; } else return FALSE;} 以上我觉得都不行.我建立了一个对话框程序, 上面只放了一个treectrl控件.我不需要窗口内控件与控件之间的拖动 (他可以将setcapture()放在beginDrag()中).而我的需求是拖动资源管理器的目录(比如桌面上目录)到我的程序的treectrl中.我的treectrl是拖动目标而不是源(BeginDrop()无效). 1.程序要有:WS_EX_ACCEPTFILES 属性。2.响应:WM_DROPFILES。 case WM_DROPFILES:{char szFile[255];HDROP hdrop=(HDROP)wParam;UINT cFiles=DragQueryFile(hdrop,(UINT)-1,NULL,0);for(UINT u=0;u<cFiles;u++){DragQueryFile(hdrop,u,szFile,sizeof(szFile));OutputDebugString(szFile);DWORD dw=GetFileAttributes(szFile);if(dw & FILE_ATTIBUTE_DIRECTORY) OutputDebugString(" --- Is a Directory.\r\n");DragFinish(hdrop);return 0;} "拖动到树上时", 你的窗口是 未激活的!。WM_DROPFILES:时你的窗口才激活。 1.窗口非激活时只有一些消息可以运行,WM_TIMER为其一。所以打开TIMER (100ms)2.在Timer中HitTestTree:case WM_TIMER:{HWND whichTree=0;//我有2个TreeHTREEITEM hTarget=GetDropTarget(hWnd,&whichTree);//hWnd 是 mainif(hTarget) TreeView_SelectDropTarget(whichTree,hTarget);}break;// HTREEITEM HetDropTartget(HWND hMain,HWND *whichTree);//我有2个Tree就是 GetCursorPos()加 Tree的 HitTest 控件关联变量的问题 _T("") 为什么? 什么情况下会出现主线程退出了,但程序却退出不了? 如何让控制台应用程序不显示控制台界面? malloc()分配不成功? 关于mfc中类CMonthCalCtrl给出的日历控件问题? 数学问题,关于≡,见笑 如何在程序中载入.chm? 自己看程序,发现了几个不太明白的地方,请各位讲下 CHttpFile的ReadString返回乱码 如何删除单文档窗口的部分区域? 用dumpbin的问题
{
COleDropInfo* pInfo = (COleDropInfo* )pDropInfoClass;
ASSERT(pInfo->IsKindOf(RUNTIME_CLASS(COleDropInfo))); if( pInfo->m_pDataObject->IsDataAvailable( CF_TEXT ) )
return DROPEFFECT_COPY;
else
return DROPEFFECT_NONE;
}DROPEFFECT CEX_RollupView::OnDropEx(WPARAM pDropInfoClass, LPARAM lParm)
{
return (DROPEFFECT)-1;
}BOOL CEX_RollupView::OnDrop(WPARAM pDropInfoClass, LPARAM lParm)
{
COleDropInfo* pInfo = (COleDropInfo* )pDropInfoClass;
ASSERT(pInfo->IsKindOf(RUNTIME_CLASS(COleDropInfo))); if( pInfo->m_pDataObject->IsDataAvailable( CF_TEXT ) )
{
HGLOBAL hMem = pInfo->m_pDataObject->GetGlobalData( CF_TEXT );
char* lp = (char *)GlobalLock((HGLOBAL) hMem);//lock source
if (lp != NULL)
{
ShowControl(lp);
}
GlobalUnlock( hMem );//unlock source
return TRUE;
}
else
return FALSE;
}
而我的需求是拖动资源管理器的目录(比如桌面上目录)到我的程序的treectrl中.我的treectrl是拖动目标而不是源(BeginDrop()无效).
WS_EX_ACCEPTFILES 属性。
2.响应:
WM_DROPFILES。
{
char szFile[255];
HDROP hdrop=(HDROP)wParam;
UINT cFiles=DragQueryFile(hdrop,(UINT)-1,NULL,0);
for(UINT u=0;u<cFiles;u++)
{
DragQueryFile(hdrop,u,szFile,sizeof(szFile));
OutputDebugString(szFile);
DWORD dw=GetFileAttributes(szFile);
if(dw & FILE_ATTIBUTE_DIRECTORY) OutputDebugString(" --- Is a Directory.\r\n");
DragFinish(hdrop);
return 0;
}
WM_DROPFILES:时你的窗口才激活。
所以打开TIMER (100ms)
2.在Timer中HitTestTree:
case WM_TIMER:
{
HWND whichTree=0;//我有2个Tree
HTREEITEM hTarget=GetDropTarget(hWnd,&whichTree);//hWnd 是 main
if(hTarget) TreeView_SelectDropTarget(whichTree,hTarget);
}
break;// HTREEITEM HetDropTartget(HWND hMain,HWND *whichTree);//我有2个Tree就是 GetCursorPos()
加 Tree的 HitTest