本帖最后由 VisualEleven 于 2012-10-09 18:35:15 编辑

解决方案 »

  1.   

    你应该有个标记来表示当前的动作,是否是拖动还是只是简单的移动鼠标,应该也要处理WM_LBUTTONDOWN/WM_LBUTTONUP消息,DOWN的时候设置标记,UP的时候重置标记值。
      

  2.   

    本帖最后由 VisualEleven 于 2012-10-09 20:18:13 编辑
      

  3.   

    我以前做OLE拖拽,感觉只要处理一个事件就可以了啊。。我去翻下我老的代码
      

  4.   

    我当初是自己处理了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;
    }
      

  5.   

    以上我觉得都不行.我建立了一个对话框程序, 上面只放了一个treectrl控件.我不需要窗口内控件与控件之间的拖动 (他可以将setcapture()放在beginDrag()中).
    而我的需求是拖动资源管理器的目录(比如桌面上目录)到我的程序的treectrl中.我的treectrl是拖动目标而不是源(BeginDrop()无效).
      

  6.   

    1.程序要有:
    WS_EX_ACCEPTFILES 属性。
    2.响应:
    WM_DROPFILES。
      

  7.   

    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;
      

  8.   

    "拖动到树上时", 你的窗口是 未激活的!。
    WM_DROPFILES:时你的窗口才激活。
      

  9.   

    1.窗口非激活时只有一些消息可以运行,WM_TIMER为其一。
    所以打开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