wxвиджеты:Обнаружение события щелчка на пользовательских элементах управления
Вопрос
Как добавить прослушиватель событий щелчка в мой пользовательский элемент управления, созданный с помощью wxWidgets?Пользовательский элемент управления использует wxWindow в качестве основы.В списке событий я вижу
wxEVT_LEFT_DOWN
wxEVT_LEFT_UP
wxEVT_LEFT_DCLICK
wxEVT_MIDDLE_DOWN
wxEVT_MIDDLE_UP
wxEVT_MIDDLE_DCLICK
wxEVT_RIGHT_DOWN
wxEVT_RIGHT_UP
wxEVT_RIGHT_DCLICK
wxEVT_MOTION
wxEVT_ENTER_WINDOW
wxEVT_LEAVE_WINDOW
wxEVT_MOUSEWHEEL
Но нет wxEVT_LEFT_CLICK
или похожие.
Решение
Обычно событие «щелчок» отсутствует (а в случае wxWidgets - нет).Действие щелчка разбито на две части:Мышь вниз и мышь вверх.Обычно то, что вы считаете событием «щелчок левой кнопкой мыши», на самом деле обрабатывается как событие «левый вверх».
Попробуйте:
- Наведите указатель мыши на кнопку (например, кнопку «Добавить комментарий» на этой странице)
- Нажмите левую кнопку мыши вниз и удерживайте
- Отведите указатель мыши от кнопки, удерживая ее нажатой.
- Отпустите левую кнопку мыши
- Ничего не произошло!
На этот раз:
- Наведите курсор на ту же кнопку
- Нажмите кнопку левой мыши и удерживайте
- Отпустите левую кнопку мыши
- Ожидаемое вами действие «щелчок» инициируется событием up!
Другие советы
В первую очередь я рекомендую наследовать от wxControl, а не от wxWindow, wxControl предназначен именно для этой цели, и у вас меньше шансов столкнуться с проблемой борьбы с системой.Когда я смотрю на элемент управления, который создаю в своем собственном приложении wxWidgets, я вижу, что мой обработчик кликов прикреплен к wxEVT_LEFT_DOWN.Просматривая свою копию книги «Кроссплатформенное программирование графического интерфейса пользователя с помощью wxWidgets», я вижу список всех событий wxMouseEvents, но wxEVT_LEFT_CLICK отсутствует.Я бы посоветовал использовать событие wxEVT_LEFT_DOWN.
Теперь, после публикации, я прочитал ответ Берли и согласен с ним: wxWidgets предлагает события самого низкого уровня, и это дает вам максимальный контроль над пользовательским интерфейсом, который вы создаете для своих пользователей.