gpt4 book ai didi

c++ - wxWidgets 和上下文菜单

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:00:56 24 4
gpt4 key购买 nike

我正在尝试将上下文菜单添加到我的应用程序中的(大型)自定义控件中,但在创建它们时遇到了很多问题。

有 3 种情况需要创建上下文菜单(除非我忘记了一个...):鼠标右键单击、按下菜单键和 Shift + F10。在所有情况下,菜单都是通过 ContextMenu 方法创建和显示的。

鼠标右键还有其他一些特殊的功能,因此不应该总是创建上下文菜单。我正在处理各种鼠标事件并根据需要调用 ContextMenu,一切正常。

问题出在键盘生成的上下文菜单上。我在我的控件中为 EVT_CONTEXT_MENU 设置了一个处理程序,然后只调用 ContextMenu。在很多情况下,两个组合键似乎都被忽略了。有时 Shift+F10 可以正常工作,但在相同的情况下,菜单键会以某种方式调用我的鼠标右键单击处理程序,从而导致不正确的行为...

对于菜单键,我也尝试过处理按键事件,但是菜单键似乎从来没有在 wxWidgets 中触发这些事件,尽管所有其他键似乎都工作正常......

  1. 为什么 wxWidgets 以某种方式忽略了关键方法。只要控件具有焦点,它们就应该工作。当他们开始“工作”时,他们会一直工作,直到它再次失去焦点,但我不确定他们为什么不开始或是什么导致他们开始工作(我不处理任何上下文菜单或其他任何地方的关键事件我的测试应用)。

  2. 菜单键事件如何进入我的 EVT_RIGHT_UP 处理程序而不是键事件或上下文菜单事件?

我认为我对 wxWidgets 如何处理这些键的理解存在根本性的错误,但是在查看文档和网上一段时间后,我没有找到任何关于我的问题的信息。

我在 Windows Vista 上使用 wxMSW 2.8.10。

最佳答案

wxWidgets 是一个抽象出平台差异的库,例如哪些鼠标或按键事件应该导致上下文菜单出现。可能存在差异,例如它是在按下鼠标时出现,还是在鼠标抬起时出现,甚至(在 Mac 上)在 Ctrl+ 单击单个鼠标按钮时出现。

因此,您不应直接处理鼠标和键盘事件,而应处理 wxContextMenuEvent反而。请注意,它将在鼠标和键盘事件之后调用:

Note that if wxContextMenuEvent::GetPosition returns wxDefaultPosition, this means that the event originated from a keyboard context button event, and you should compute a suitable position yourself, for example by calling wxGetMousePosition().

请注意,您还可以抑制某些鼠标事件的事件并为其他鼠标事件生成该事件:

When a keyboard context menu button is pressed on Windows, a right-click event with default position is sent first, and if this event is not processed, the context menu event is sent. So if you process mouse events and you find your context menu event handler is not being called, you could call wxEvent::Skip() for mouse right-down events.

希望用此事件的处理程序替换上下文菜单的当前代码会起作用。对于所有还应导致上下文菜单出现的鼠标事件,您需要调用 event.Skip(),也许不这样做是您现在得到不一致结果的原因。

关于c++ - wxWidgets 和上下文菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2351665/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com