我的程序中需要拖动一个资源,基本的流程都是一样的,但是有一个问题,就是将该资源拖动到任务栏上,激活某个应用程序之后,就无法继续拖动了,这会是什么原因啊?
现在我解决的方法是在函数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);
但现在这样做显然是不太合理的,我看得头都大了,也想不出来是什么原因造成的,希望各位高手帮帮忙!!!
现在我解决的方法是在函数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);
但现在这样做显然是不太合理的,我看得头都大了,也想不出来是什么原因造成的,希望各位高手帮帮忙!!!
CDropSource::QueryContinueDrag
CDropSource::GiveFeedback
CDropSource::QueryContinueDrag
CDropSource::GiveFeedback
……
好像并没有到DragEnter、DragOver、DragLeave里面去,而CDropSource::QueryContinueDrag正常的返回S_OK希望大家能帮我想想,谢谢了,本人就是菜鸟一个,实在是不会了。
我查过,而IDropSource : public IUnknown而IDropTarget : public IUnknown
不好意思,我现在是刚开始工作,让我改bug,所以很多可能很基础的东西都不懂,关于拖动这一块,也是这两天猛看了些东西。
而改这个bug可能我也不能改动它原始太多的地方吧,只是我实在想不明白这会是哪个地方出的问题,因为只要不拖动到任务栏上,到哪里都是好的。麻烦楼上Gness再帮我想想吧,谢谢了!
......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);
}
下面是我改过的地方,很小很小的一个地方,只是一个返回值的问题:
if(WM_NCACTIVATE == uMsg )
{
if(GetDragState())//如果正在拖动过程中
{
return FALSE;//pipi,BUG--Drag and Drop
}
else
{
return TRUE;//以前程序中是默认一直返回TRUE
}
}