我正在尝试将上下文菜单添加到我的应用程序中的(大)自定义控件中,但是在创建它们时遇到了很多问题。
当按下菜单键并按Shift + F10时,有三种情况需要在鼠标右键单击时创建上下文菜单(除非我忘记了一个...)。在所有情况下,菜单都是由ContextMenu方法创建和显示的。
右键执行其他一些特殊操作,因此不应始终创建上下文菜单。我正在处理各种鼠标事件并根据需要调用ContextMenu,这一切都很好。
问题在于键盘生成的上下文菜单。我在EVT_CONTEXT_MENU的控件中设置了一个处理程序,然后调用ContextMenu。在很多情况下,两个键组合似乎都被忽略了。有时Shift + F10工作正常,但在相同的情况下,菜单键以某种方式调用我的鼠标右键单击处理程序,导致行为不正确......
对于菜单键我也试过处理键事件,但菜单键似乎永远不会在wxWidgets中触发这些键,尽管所有其他键似乎都能正常工作......
为什么wxWidgets会以某种方式忽略关键方法。只要控件具有焦点,它们就应该工作。当他们开始“工作”时,他们继续工作,直到它再次失去焦点,但我不确定他们为什么不开始或导致他们开始工作的原因(我不处理任何其他地方的上下文菜单或关键事件)我的测试应用程序)。
菜单键事件如何进入我的EVT_RIGHT_UP处理程序而不是键事件或上下文菜单事件?
我认为我对wxWidgets如何处理这些密钥有一些根本性的错误,但是我已经查看了文档和网络上一段时间我没有找到有关我的问题的任何信息。
我在Windows Vista上使用wxMSW 2.8.10。
答案 0 :(得分:2)
wxWidgets是一个抽象平台差异的库,例如鼠标或键事件应该导致上下文菜单出现。可能存在差异,例如它是否出现在鼠标按下,鼠标向上,甚至是(在Mac上) Ctrl +单击鼠标单击按钮。
因此,您不应直接处理鼠标和键盘事件,而应处理wxContextMenuEvent
。请注意,它将在鼠标和键盘事件之后调用:
请注意,如果wxContextMenuEvent :: GetPosition返回wxDefaultPosition,这意味着事件源自键盘上下文按钮事件,您应该自己计算一个合适的位置,例如通过调用wxGetMousePosition()。
请注意,您还可以抑制某些鼠标事件的事件,并为其他事件生成事件:
在Windows上按下键盘上下文菜单按钮时,将首先发送具有默认位置的右键单击事件,如果未处理此事件,则会发送上下文菜单事件。因此,如果您处理鼠标事件并且发现未调用上下文菜单事件处理程序,则可以为鼠标右下事件调用wxEvent :: Skip()。
希望使用此事件的处理程序替换当前代码以获取上下文菜单。对于也应该导致上下文菜单出现的所有鼠标事件,您需要调用event.Skip()
,可能不会这样做是您现在获得不一致结果的原因。