Добрый день Артем! Спасибо за ответ на предыдущий вопрос! Напишите пожалуйста как пользоватся OnKeyDown (если ето та функция что я имею ввиду), их там немало OnKeyUp , OnKeyDownEvent , OnKeyPress , ... Например при нажатии на J ... И при нажатии на такие кнопки как ВВЕРХ , ВНИЗ,TAB, F1 ....... Thanx !!! ostrongi@takas.ltНу что, давайте поговорим о том, как вообще сообщения Windows в том числе и нажатие клавиш появляются, и как они обрабатываются MFC. Давайте создадим приложение MFC AppWizard как окно MDI, то есть с многими окнами и назовем его TestKeys.
Как известно, самый главный класс у нас CTestKeysApp, он порожден от CWinApp и поэтому сообщения от Windows поступают сначала туда. Давайте перегрузим функцию первоначальной обработки сообщения PreTranslateMessage
BOOL CTestKeysApp::PreTranslateMessage(MSG* pMsg) { // TODO: Add your specialized code here and/or call the base class MessageBeep(-1); return CWinApp::PreTranslateMessage(pMsg); }
Запустите это приложение и Вы увидите, что на любое Ваше действие комп будет пищать !!! В том числе и на нажатие клавиш !!!. То есть обработать при желании можно и здесь. Куда дальше будет передаваться сообщение ?? В CMainFrame. Здесь тоже сообщение можно отловить еще до обработки. Вот так.
BOOL CMainFrame::PreTranslateMessage(MSG* pMsg) { // TODO: Add your specialized code here and/or call the base class MessageBeep(-1); return CMDIFrameWnd::PreTranslateMessage(pMsg); }
Запустите и увидите то же самое. На каждое действие будет писк. Дальше сообщение предлается Виду CTestKeysView. Здесь мы той же функцией можем его отследить.
BOOL CTestKeysView::PreTranslateMessage(MSG* pMsg) { MessageBeep(-1); return CView::PreTranslateMessage(pMsg); }
Всё то же самое, писк на все сообщения. Ну давайте произведем отсев сообщений и будем ловить только те, которые приходят от нажатых клавиш. Мы можем отпеределить нажатие клавиши KEYDOWN и её отпускание KEYUP. Давайте обработаем нажатие.
void CTestKeysView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: Add your message handler code here and/or call default MessageBeep(-1); CView::OnKeyDown(nChar, nRepCnt, nFlags); }
Как же определить какая клавиша нажата ? Для этого есть параметр bChar, который можно сравнить в виртуальной клавишей, например, так:
if (nChar==VK_F1) MessageBeep(-1);
Список их можно найти в winuser.h. Так же можно перегрузить сообщение WM_CHAR извещающее о нажатии клавиши. Управление данной функции будет передано только если нажат конкретный символ. Например, на нажатие на клавишу F1 она не реагирует.
void CTestKeysView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { MessageBeep(-1); CView::OnChar(nChar, nRepCnt, nFlags); }
Несколько отличается обработка нажатия клавиш в классе COleControl. Здесь появляется функция OnKeyPressEvent и функция FireKeyDown и так далее. Но об этом нужно разговаривать отдельно.