wxWidgets и контекстные меню

Я пытаюсь добавить контекстные меню в (большой) настраиваемый элемент управления в моем приложении, но столкнулся с рядом проблем с тем, когда их создавать.

Есть 3 случая, когда необходимо создать контекстное меню (если я не забыл его ...) при щелчке правой кнопкой мыши, при нажатии клавиши меню и для Shift + F10. Во всех случаях меню создается и отображается методом ContextMenu.

Правая мышь выполняет некоторые другие функции, поэтому не всегда следует создавать контекстное меню. Я обрабатываю различные события мыши и вызываю ContextMenu по мере необходимости, и все это работает нормально.

Проблема заключается в контекстном меню, созданном с помощью клавиатуры. Я установил в своем элементе управления обработчик для EVT_CONTEXT_MENU, который затем просто вызывает ContextMenu. Во многих случаях обе комбинации клавиш просто игнорируются. Иногда Shift + F10 работает правильно, но в тех же случаях клавиша меню каким-то образом вызывает мои обработчики щелчка правой кнопкой мыши, что приводит к неправильному поведению ...

Для клавиши меню я также пробовал обрабатывать ключевые события, но, похоже, клавиша меню никогда не запускает их в wxWidgets, хотя все другие клавиши, похоже, работают нормально ...

  1. Почему ключевые методы каким-то образом игнорируются wxWidgets. Они должны работать до тех пор, пока в фокусе находится элемент управления. Когда они начинают «работать», они продолжают работать до тех пор, пока фокус снова не теряется, но я не уверен, почему они этого не делают или что заставляет их начать работать (я не обрабатываю контекстное меню или ключевые события где-либо еще в мое тестовое приложение).

  2. Как событие клавиши меню попадает в мой обработчик EVT_RIGHT_UP вместо ключевых событий или событий контекстного меню?

Я предполагаю, что это что-то в корне неправильное с моим пониманием того, как wxWidgets обрабатывает эти ключи, однако, просмотрев документацию и некоторое время в сети, я не нашел никакой информации о своих проблемах.

Я использую wxMSW 2.8.10 в Windows Vista.


person Fire Lancer    schedule 28.02.2010    source источник


Ответы (1)


wxWidgets - это библиотека для абстрагирования различий платформ, например, какие события мыши или клавиш должны приводить к появлению контекстного меню. Могут быть различия, например, появляется ли он при нажатии кнопки мыши, или при поднятии мыши, или даже (на Mac) при нажатии Ctrl + щелчка одной кнопки мыши.

Поэтому вам не следует обрабатывать события мыши и клавиатуры напрямую, а вместо этого обрабатывать wxContextMenuEvent. Обратите внимание, что он будет вызываться после событий мыши и клавиатуры:

Обратите внимание, что если wxContextMenuEvent :: GetPosition возвращает wxDefaultPosition, это означает, что событие возникло из события кнопки контекста клавиатуры, и вы должны вычислить подходящую позицию самостоятельно, например, вызвав wxGetMousePosition ().

Обратите внимание, что вы также можете подавить событие для некоторых событий мыши и создать его для других:

Когда в Windows нажимается кнопка контекстного меню клавиатуры, сначала отправляется событие щелчка правой кнопкой мыши с позицией по умолчанию, а если это событие не обрабатывается, отправляется событие контекстного меню. Поэтому, если вы обрабатываете события мыши и обнаруживаете, что обработчик событий контекстного меню не вызывается, вы можете вызвать wxEvent :: Skip () для событий, связанных с перемещением мыши вправо вниз.

Надеюсь, замена текущего кода контекстных меню обработчиками этого события сработает. Для всех событий мыши, которые также должны вызывать появление контекстного меню, вам нужно будет вызвать event.Skip(), возможно, невыполнение этого действия является причиной того, что вы сейчас получаете несогласованные результаты.

person mghie    schedule 28.02.2010
comment
Как я уже сказал, я использую wxContextMenuEvent, но по какой-то причине он не вызывается / не запускается. Мне нужно обрабатывать события мыши в моем элементе управления для других вещей, но этот бит работает нормально. Именно поэтому wxContextMenuEvent не вызывается надежно для комбинаций клавиш контекстного меню Windows в первую очередь. - person Fire Lancer; 28.02.2010
comment
Хорошо, это объясняет, почему он каким-то образом попадает в ловушку обработчика мыши, и я думаю, мне просто нужно проверить и пропустить любые события мыши в (-1, -1). Но это не объясняет, почему wxWidgets, кажется, иногда полностью теряет событие, т.е. ни один из моих обработчиков не вызывается ни для кнопки меню, ни для shift + f10? - person Fire Lancer; 28.02.2010
comment
Сложно сказать, с одним wxContextMenuEvent у меня не было проблем. Если события клавиатуры тоже не работают, возможно, это проблема с фокусом? Но в любом случае я бы не стал Skip() только событиями в (-1, -1), я бы назвал это для всех событий, если контекстное меню не нужно подавлять, а затем для всех координат. - person mghie; 28.02.2010