Страница: 1 |
Страница: 1 |
Вопрос: ComboBox: события мыши
Добавлено: 01.12.07 20:36
Автор вопроса: Иван | Web-сайт:
Мне нужно было отловить события мыши в комбобоксе. Написал субклассинг к комбобоксу, где по событию GotFocus начинается сканирование и перехват нажатий клавиш мыши, а по LostFocus оно прекращается.
Все прекрасно работает, за единственным исключением: если кликнуть по комбобоксу правой кнопкой, когда фокус еще на другом контроле, то выползает встроенное контекстное меню, и реакции на мышь нет - видимо, потому, что событие MouseUp происходит раньше, чем GotFocus.
Научите, пожалуйста, как решить эту проблему?
Ответы
Всего ответов: 5
Номер ответа: 1
Автор ответа:
EUGY
Вопросов: 0
Ответов: 454
Профиль | | #1
Добавлено: 01.12.07 21:07
Правильно ли я понял, что сабклассинг начинается при GotFocus? Зачем? Почему не сразу при переходе в рантайм?
Номер ответа: 2
Автор ответа:
Иван
Вопросов: 34
Ответов: 53
Web-сайт:
Профиль | | #2
Добавлено: 01.12.07 22:11
Сабклассинг начинается при Form_Load:
Set MyCombo1 = New clsCombo
А при событии GotFocus запускается цикл While-СканированиеКлавишМыши-DoEvents-Wend, который продолжается, пока комбобокс не потеряет фокус. Если нажатие перехвачено, то RaiseEvent MouseDown (например).
Номер ответа: 3
Автор ответа:
EUGY
Вопросов: 0
Ответов: 454
Профиль | | #3
Добавлено: 01.12.07 23:09
ИМХО,
Даже безо всякого сабклассинга и даже если combo уже в фокусе при контекстном меню циклы с DoEvents замораживаются. И вообще замораживается цикл сообщений приложения. Только окно-владелец этого меню принимает еще кое-какие WM_ напрямую.
В том числе "мышиную возню".
А так как владельцем контекстного меню выступает не сам combobox, а его дочернее окно класса "EDIT", то надо сабклассировать его и в нем следить за мышью. Ну, или ставить хук.
Номер ответа: 4
Автор ответа:
Иван
Вопросов: 34
Ответов: 53
Web-сайт:
Профиль | | #4
Добавлено: 02.12.07 00:19
Спасибо Вам большое, EUGY. Постараюсь "поиграть" с приложением и добиться желаемого. Век живи - век учись (хотя я уже человек солидного возраста, и учеба дается тяжеловато).
К слову: проблема с событиями мыши в комбобоксе легко решается, если "подложить" под комбобокс лейбл размером чуточку больше, и создать в субклассинге к лейблу события MouseOver/MouseOut (на основе события Label_MouseMove). Но очень уж обидно ради перехвата "мышиной возни" громоздить столько писанины.
Номер ответа: 5
Автор ответа:
EUGY
Вопросов: 0
Ответов: 454
Профиль | | #5
Добавлено: 02.12.07 00:41
Нет-нет,