OnDrop:如何确定正在使用哪个鼠标按钮? 我试图实现一个“拖放”功能到一个程序(对于Windows,用C++编写,用MFC)。
类派生自OnDrop:如何确定正在使用哪个鼠标按钮? 我试图实现一个“拖放”功能到一个程序(对于Windows,用C++编写,用MFC)。,c++,mfc,drag-and-drop,C++,Mfc,Drag And Drop,类派生自COleDropTarget,它具有覆盖的OnDragOver和OnDrop函数。 在OnDragOver中,参数dwKeyState告诉我正在使用哪个鼠标按钮进行“拖动”,以及在键盘上按下了哪些“有趣”的键 在OnDrop中,未传递此参数(在OnDropEx中也未传递此参数) 现在的问题是:如果我“在droptime”需要知道这些信息,我如何确定 我发现的唯一方法是将它存储在OnDragOver中的静态变量中,然后在OnDrop中检索它。 但我不满意(即,我不敢相信我做得对),因为:
COleDropTarget
,它具有覆盖的OnDragOver
和OnDrop
函数。
在OnDragOver
中,参数dwKeyState
告诉我正在使用哪个鼠标按钮进行“拖动”,以及在键盘上按下了哪些“有趣”的键
在OnDrop
中,未传递此参数(在OnDropEx
中也未传递此参数)
现在的问题是:如果我“在droptime”需要知道这些信息,我如何确定
我发现的唯一方法是将它存储在OnDragOver
中的静态变量中,然后在OnDrop
中检索它。
但我不满意(即,我不敢相信我做得对),因为:
OnDragOver
反映最终结果
“下降”时间的情况?(对于鼠标按钮:如果它是
可能会发生变化,比如用户按下按钮,
开始拖动,然后按另一个按钮,释放第一个
一个,然后“掉下来”…不知道。但是对于钥匙,情况就是这样
当用户按下或释放Ctrl、Alt时,肯定能够进行更改
(拖动时按住Shift键)- 如果我必须记住来自
的信息,为什么OnDragOver
系统传递所有其他数据(
,pWnd
,pDataObject
,dropEffect
再次指向
?重点是什么OnDrop
- 为什么文档中说“通常,应用程序
覆盖视图类中的OnDropEx,以处理鼠标右键
拖放“?If
甚至无法分辨鼠标按钮的位置 刚刚用过李>OnDropEx
virtual DROPEFFECT OnDragOver(CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point);
virtual BOOL OnDrop(CWnd* pWnd, COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point);
virtual DROPEFFECT OnDropEx(CWnd* pWnd, COleDataObject* pDataObject, DROPEFFECT dropDefault, DROPEFFECT dropList, CPoint point);
< P>这里是如何实际工作的(至少是在Visual C++版本10,别名2010中找到的MFC执行)。< /P> 用户IInspectable如何评论,“IDropTarget::Drop接口传递了一个
grfKeyState
参数。[…]coledoptarget的MFC实现决定删除此参数。”
嗯,可以调试实现接收此参数的部分(并且不将其传递给OnDrop
):它位于源C:\ProgramFiles(x86)\Microsoft Visual Studio 10.0\VC\atlmfc\src\mfc\oledrop2.cpp
(或类似路径)中。
相关部分在功能中:
STDMETHODIMP COleDropTarget::XDropTarget::Drop(此ulpdataobject LPDATAOBJECT,DWORD dwKeyState,POINTL pt,LPDWORD pdwefect)
快速调试表明,dwKeyState
实际上已被传递,但(此处)已丢失有关鼠标按钮的信息
另一个事实是:此COleDropTarget::XDropTarget::Drop
仍会调用一次COleDropTarget::OnDragover
(这一次将接收关于Ctrl、Alt和Shift键状态的最后更新,但没有关于鼠标按钮的信息),然后调用COleDropTarget::OnDropEx
或COleDropTarget::OnDrop
(如果未覆盖-Ex
)
因此,尝试从COleDropTarget::OnDrop
访问dwKeyState
并不重要:在droptime确定鼠标按钮的唯一方法是从以前的COleDropTarget::OnDragover
中记住它。
关于鼠标按钮的信息将来自最后一次调用(如果不是更早的调用?),因此必须单独存储(仅存储最后一次dwKeyState
,并在droptime中使用它将不起作用)
这就是我所理解的。如果专家能够证实,或者想要指出错误不客气。你似乎在问几个不同的问题。也许你应该把每个问题都作为一个单独的StackOverflow问题发布。好吧,这个想法不是要问几个问题,而是要问一个问题,列出我对答案的一些可能想法,为什么不说服我……也许我不太擅长写作。对不起,StackOverflow在“一问一答”的基本原则。每个问题都应该问一件事,而且只能问一件事。这个问题应该是可以给出一个具体答案的问题。提出多个问题的问题或提出可以解释为多个答案的问题通常过于宽泛,通常应该分为多个单独的问题。可能对再试试看。如果有用的话,把它作为答案加进去。