| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Visual C++/MFC/WTL > Как перехватить ввод клавиатуры в своем элементе |
| Автор: sfdev 30.1.2006, 22:42 |
| Проблема: имеется диалоговое приложение. В окне диалога находятся 2 кнопки и один собственный элемент управления на основе CWnd. Как сделать так, чтобы элемент отлавливал нажатия стрелок на клавиатуре и не переводил фокус ввода на кнопки? |
| Автор: DeadSoul 31.1.2006, 00:41 |
| WM_CHAR? |
| Автор: Earnest 31.1.2006, 14:49 |
| PreTranslateMessage в диалоге, лови WM_KEYDOWN и обрабатывай сам, как тебе надо. |
| Автор: sfdev 31.1.2006, 19:43 |
| Возможно, вы меня не совсем поняли. Мне нужно реализовать обработчик в рамках компонента. Надо чтобы при нажатии стрелки "вверх", к примеру, выдавался MessageBox. Но после этого происходит потеря фокуса (он переходит кнопкам). Как этого избежать? |
| Автор: Dreamer_0x01 31.1.2006, 20:13 |
| именно так, как писала Earnest. А чтобы перехода не происходило - в этом же обработчике реторнуть FALSE. Обработчик надо писать в том окне, которое "главнее", то есть в том, где располагаются компоненты. |
| Автор: sfdev 31.1.2006, 20:24 |
| Когда я говорил в рамках компонента, я имел в виду В РАМКАХ КОМПОНЕНТА, а не в рамках более главного окна. |
| Автор: Earnest 31.1.2006, 20:30 |
| Dreamer_0x01 PreTranslateMessage должен возвращать как раз TRUE, чтобы обработка не шла дальше. А на FALSE - будет вызван стандартный обработчик. Возможно, нужно ловить не WM_KEYDOWN, а WM_KEYUP - многие стандартные действия совершаются по клику, а не нажатию, это каждый раз проверять приходится (или помнить Так, прочитала еще раз повнимательнее. Компонент - это то custom окно, которое на основе CWnd? Ну можно то же самое, PreTranslate, но уже на уровне этого окна. Вообще-то сам факт, что у тебя по стрелкам фокус на другие контролы переходит вызывает недоумение: само так не делается, только если они в одной группе. В смысле, на первом по Z-ордеру контроле стоит WS_GROUP, а на следующих нет. Вроде бы так. Убери. |
| Автор: Earnest 31.1.2006, 21:01 |
| Он хочет, чтобы весь код, отвечающий за поведение его custom окна, был инкапсюлирован в этом классе. Правильно хочет. |
| Автор: sfdev 31.1.2006, 21:12 |
| Спасибо, Earnest. Действительно, если возвращать TRUE в PreTranslateMessage компонента после обработки, то все работает. |