Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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 - многие стандартные действия совершаются по клику, а не нажатию, это каждый раз проверять приходится (или помнить smile )

Так, прочитала еще раз повнимательнее. Компонент - это то custom окно, которое на основе CWnd? Ну можно то же самое, PreTranslate, но уже на уровне этого окна.

Вообще-то сам факт, что у тебя по стрелкам фокус на другие контролы переходит вызывает недоумение: само так не делается, только если они в одной группе. В смысле, на первом по Z-ордеру контроле стоит WS_GROUP, а на следующих нет. Вроде бы так. Убери.


Автор: Dreamer_0x01 31.1.2006, 20:51
Цитата(Earnest @ 31.1.2006, 20:30 Найти цитируемый пост)

PreTranslateMessage должен возвращать как раз TRUE, чтобы обработка не шла дальше. А на FALSE - будет вызван стандартный обработчик.


Извиняюсь ;)

А что нужно sfdev, я так и не понял smile

Автор: Earnest 31.1.2006, 21:01
Он хочет, чтобы весь код, отвечающий за поведение его custom окна, был инкапсюлирован в этом классе. Правильно хочет.

Автор: sfdev 31.1.2006, 21:12
Спасибо, Earnest.
Действительно, если возвращать TRUE в PreTranslateMessage компонента после обработки, то все работает.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)