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
      甚至无法分辨鼠标按钮的位置 刚刚用过
  • 如果答案是1。是“否”:那么,正确的方法是什么 确定刚才使用的鼠标按钮和按下的键
  • 谢谢你的帮助

    功能原型:

        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在“一问一答”的基本原则。每个问题都应该问一件事,而且只能问一件事。这个问题应该是可以给出一个具体答案的问题。提出多个问题的问题或提出可以解释为多个答案的问题通常过于宽泛,通常应该分为多个单独的问题。可能对再试试看。如果有用的话,把它作为答案加进去。