wxWidgets и контекстные меню - PullRequest
2 голосов
/ 28 февраля 2010

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

Существует 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.

1 Ответ

2 голосов
/ 28 февраля 2010

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

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

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

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

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

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

...