【发布时间】:2021-02-06 14:57:00
【问题描述】:
我有一个 ListView,我想使用一个根据选择而变化的上下文菜单。我确保在释放鼠标右键时首先能够显示菜单(按照正常的上下文菜单行为)。
在我的 ListView WNDPROC 中,我使用 WM_CONTEXTMENU 来显示上下文菜单。然而,菜单显示在光标开始选择的位置,而不是结束处。
DefWindowProc 在处理 WM_RBUTTONUP 或 WM_NCRBUTTONUP 消息或当用户键入 SHIFT+F10 时生成 WM_CONTEXTMENU 消息。当用户按下并释放 VK_APPS 键时,也会生成 WM_CONTEXTMENU 消息。
当我检查调用堆栈时,在WM_CONTEXTMENU 中有一个断点,我看到在WM_CONTEXTMENU 之前发送的消息是0x0204 或WM_RBUTTONDOWN,此时包含光标的坐标。这可能解释了菜单位置问题,但为什么会发生这种情况?
当我在 ListView 外面按住 RMB 并在里面释放它时,上下文菜单仍然出现,我可以从调用堆栈中看到最后一条消息是 0x0205 或 WM_RBUTTONUP。
不确定我的代码是否有问题,或者我不理解某些内容。非常感谢您对此问题的任何帮助,谢谢。
【问题讨论】:
-
0x0205是WM_RBUTTONUP。WM_RBUTTONDOWN是0x0204 -
啊,是的,抱歉,我现在就解决这个问题。
-
在处理
WM_CONTEXTMENU时,GetMessagePos()是否会为您提供您正在寻找的正确坐标? -
确实如此。我想知道在
WM_CONTEXTMENU之后是否有WM_RBUTTONUP进入导致GetMessagePos()从中获取鼠标坐标? -
WM_CONTEXTMENU自己报告的坐标呢?
标签: c listview winapi win32gui