我的程序中需要拖动一个资源,基本的流程都是一样的,但是有一个问题,就是将该资源拖动到任务栏上,激活某个应用程序之后,就无法继续拖动了,这会是什么原因啊?
现在我解决的方法是在函数CDropSource::QueryContinueDrag里面加了一个判断
if( ::GetActiveWindow() != m_hwndMain ) 
{  //如果激活了其它窗口,拖动失败直接结束,但怎么让它不结束,仍然可以拖动直到有效窗口呢?
    return DRAGDROP_S_CANCEL;
 }
或者是在拖动过程中限制鼠标可拖动范围在桌面上,不给程序激活其它应用程序的机会:
RECT   rcWorkArea;  
SystemParametersInfo(SPI_GETWORKAREA,   0,   (LPVOID)&rcWorkArea,   0);
::ClipCursor(&rcWorkArea);

::DoDragDrop(pDataObj, pdsrc, DROPEFFECT_COPY|DROPEFFECT_MOVE, &dwEffect);::ClipCursor(NULL);
但现在这样做显然是不太合理的,我看得头都大了,也想不出来是什么原因造成的,希望各位高手帮帮忙!!!

解决方案 »

  1.   

    嗯,谢谢楼上的看我的问题^_^实际上当激活其它应用程序后也不是完全无法拖动,只要被激活的程序窗口没有覆盖自己的应用程序,那么还是可以继续拖动到可以放置资源的地方,只是如果拖回任务栏,无法再激活其它应用程序,鼠标的图形仍然是对的,但鼠标下拖着的那个透明的资源图片就停留在那个被激活的任务栏应用程序图标上动不了了,除非再将鼠标继续拖动至自己的程序窗口才恢复正常我跟踪过这个过程,当拖动到任务栏上的某个应用程序图标上之后,走的主要就是两个函数:
    CDropSource::QueryContinueDrag
    CDropSource::GiveFeedback
    CDropSource::QueryContinueDrag
    CDropSource::GiveFeedback
    ……
    好像并没有到DragEnter、DragOver、DragLeave里面去,而CDropSource::QueryContinueDrag正常的返回S_OK希望大家能帮我想想,谢谢了,本人就是菜鸟一个,实在是不会了。
      

  2.   

    楼主的CDropSource是继承COleDropSource的吗? 有没有试过COleDropTarget?
      

  3.   

    我程序里面的CDropSource : public IDropSource;CDropTarget : public IDropTarget
    我查过,而IDropSource : public IUnknown而IDropTarget : public IUnknown
    不好意思,我现在是刚开始工作,让我改bug,所以很多可能很基础的东西都不懂,关于拖动这一块,也是这两天猛看了些东西。
    而改这个bug可能我也不能改动它原始太多的地方吧,只是我实在想不明白这会是哪个地方出的问题,因为只要不拖动到任务栏上,到哪里都是好的。麻烦楼上Gness再帮我想想吧,谢谢了!
      

  4.   

    对了,我的程序不支持MFC,只用windows API函数拜托大家帮我想想啊!!
      

  5.   

    afx_msg void OnDropFiles(HDROP hDropInfo);
    ......BEGIN_MESSAGE_MAP(CDragFilesDlg, CDialog)
    //{{AFX_MSG_MAP(CDragFilesDlg)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_WM_DROPFILES()
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()......void CDragFilesDlg::OnDropFiles(HDROP hDropInfo) 
    {
    CDialog::OnDropFiles(hDropInfo);
    UINT nSize  = 0;
    _TCHAR szFileName[_MAX_PATH];
    int nDropFilesCnt = DragQueryFile(hDropInfo,0xffffffff,NULL,0);
    if (nDropFilesCnt > 0)
    {
    DragQueryFile(hDropInfo,0,szFileName,sizeof(szFileName)/sizeof(_TCHAR));
    AfxMessageBox(szFileName);
    } DragFinish(hDropInfo); 
    }
      

  6.   

    非MFC的程序,在windowproc中case WM_DROPFILES:既可!
      

  7.   

    嗯,好几天没来这啦,周末休息了一下,呵呵谢谢大家的回复哦还好,我已经找到问题所在了,不是拖动本身处理过程的问题,而是程序中处理了一个消息WM_NCACTIVE引起的问题,对这个地方改了一下之后就可以随意在任务栏拖动,并激活任何应用程序了
      

  8.   

    实在不好意思,现在才又回来看这个帖子,都过了两个月了。
    下面是我改过的地方,很小很小的一个地方,只是一个返回值的问题:
    if(WM_NCACTIVATE == uMsg )
    {
        if(GetDragState())//如果正在拖动过程中
       {
     return FALSE;//pipi,BUG--Drag and Drop
        }
        else
       {
     return TRUE;//以前程序中是默认一直返回TRUE
        }
    }