Шаг 142 - Обрабатываем нажатия клавиш

    Добрый день Артем! 
    Спасибо за ответ на предыдущий вопрос!
    Напишите пожалуйста как пользоватся OnKeyDown (если ето та функция 
	что я имею ввиду), их там немало OnKeyUp , OnKeyDownEvent ,
	OnKeyPress  , ...
    Например при нажатии на J  ...
    И при нажатии на такие кнопки как ВВЕРХ , ВНИЗ,TAB, F1 .......
    Thanx !!!
    ostrongi@takas.lt 
Ну что, давайте поговорим о том, как вообще сообщения Windows в том числе и нажатие клавиш появляются, и как они обрабатываются MFC. Давайте создадим приложение MFC AppWizard как окно MDI, то есть с многими окнами и назовем его TestKeys.

Как известно, самый главный класс у нас CTestKeysApp, он порожден от CWinApp и поэтому сообщения от Windows поступают сначала туда. Давайте перегрузим функцию первоначальной обработки сообщения PreTranslateMessage

142.gif (7425 b)

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 и так далее. Но об этом нужно разговаривать отдельно.


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.