FAQ:WinAPI VCPP:обработка нажания клавиш в CDialog — различия между версиями
Материал из Весельчак У
RXL (обсуждение | вклад) (Новая: ===Как в CDialog-based классе получить коды клавиш, которые нажимает пользователь? Пробовал добавлять обрабо...) |
RXL (обсуждение | вклад) |
||
Строка 26: | Строка 26: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | [[Category:FAQ:WinAPI VCPP]] | + | [[Category:FAQ:WinAPI VCPP]] [[Category:FAQ:MFC]] |
Текущая версия на 22:10, 3 октября 2009
Как в CDialog-based классе получить коды клавиш, которые нажимает пользователь? Пробовал добавлять обработчики OnChar() и OnKeyDown(), но эти обработчики вообще не вызываются.
Диалоги действительно не обрабатывают OnChar() и OnKeyDown(). По этому нужно ловить сообщения WM_CHAR и WM_KEYDOWN в виртуальной PreTranslateMessage().
BOOL CMyDialog::PreTranslateMessage(MSG* pMsg) { if (pMsg->message == WM_KEYDOWN) { // pMsg->wParam - код клавиши // pMsg->hwnd - хендл контрола окна, который получил сообщение // pMsg->lParam - дополнительная информация: // биты 0...15 - количество повторов // биты 16...23 - скан-код // бит 24 -установлен, если нажат правый Ctrl } if (pMsg->message == WM_CHAR) { // pMsg - всё аналогично WM_KEYDOWN } return CDialog::PreTranslateMessage(pMsg); }