C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 142 - Обрабатываем нажатия клавиш / MFC шаг за шагом / Visual C++

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


Загрузить проект | | |
Автор Каев Артем.
[AD]