На этом шаге мы рассмотрим создание карт сообщений для обработки различных сообщений.
Карты сообщений поддерживают все классы, производные от CCmdTarget. Классы, генерируемые мастером AppWizard, создаются вместе с простейшей картой сообщений. С помощью мастера ClassWizard можно добавлять новые классы, содержащие карту сообщений, и манипулировать записями таких карт уже существующих классов.
Здесь мы рассмотрим вопросы, связанные с добавлением обработчиков сообщений Windows и командных сообщений с помощью мастера ClassWizard. Изучив сгенерированный код, Вы поймете, как в MFC-приложениях создаются карты сообщений.
Добавим обработчик, который будет отображать информационное окно при щелчке в клиентской области окна приложения МуАрр. Клиентской областью называют часть экрана, ограниченную рамкой окна. Все данные приложения обычно отображаются в ней.
Рис.1. Выбор обрабатываемого события
Рис.2. Функция, вызываемая для обработки события WM_LBUTTONDOWN
AfxMessageBox("Щелчок левой кнопкой мыши");
void CMyAppView::OnLButtonDown(UINT nFlags, CPoint point)
{
AfxMessageBox("Щелчок левой кнопкой мыши");
CScrollView::OnLButtonDown(nFlags, point);
}
Рис.3. Задание имени обработчика
AfxMessageBox("Выбрана команда Paste из меню Edit");
void CMyAppApp::OnEditPaste()
{
AfxMessageBox("Выбрана команда Paste из меню Edit");
}
При добавлении функции-обработчика мастер ClassWizard выполняет следующие действия:
Посмотрим, что представляют собой тексты объявления функции CMyAppApp::OnEditPaste() и ее карты сообщений.
//{{AFX_MSG(CMyAppApp) afx_msg void OnAppAbout(); afx_msg void OnEditPaste(); //}}AFX_MSG DECLARE_MESSAGE_MAP()
Обратите внимание на макрос DECLARE_MESSAGE_MAP. Он представляет собой основную часть карты сообщений и добавлен к коду мастером AppWizard или ClassWizard. Изучим записи карты сообщений.
BEGIN_MESSAGE_MAP(CMyAppApp, CWinApp) //{{AFX_MSG_MAP(CMyAppApp) ON_COMMAND(ID_APP_ABOUT, OnAppAbout) ON_COMMAND(ID_EDIT_PASTE, OnEditPaste) //}}AFX_MSG_MAP // Стандартные команды для работы с файлами документов ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew) ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen) // Стандартная команда настройки принтера ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup) END_MESSAGE_MAP()
Как видите, ClassWizard добавил в карту сообщений макрос ON_COMMAND. Его структура очень проста. Первый параметр -это идентификатор сообщения. Второй параметр - название функции-обработчика.
Объявление функции OnLButtonDown(), обрабатывающей сообщение WM_ LBUTTONDOWN, выглядит следующим образом (оно находится в файле MyAppView.h):
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
Соответствующая ей запись в карте сообщений в файле AppView.cpp такова:
ON_WM_LBUTTONDOWN()
Так как сообщения Windows обрабатываются перегруженными виртуальными функциями базового класса CWnd, нет необходимости передавать название обработчика в качестве параметра. Каркас MFC-приложения автоматически связывает такие сообщения с соответствующей виртуальной функцией. Как правило, сообщения Windows имеют дополнительную информацию, передаваемую в виде параметров. Все эти данные передаются в обработчик каркасом приложения. Внимательно посмотрите на объявление функции CMyApp::OnLButtonDown. Наверняка Вы заметили, что она принимает два параметра (производные от параметров сообщения WM_LBUTTONDOWN), один из которых содержит координаты текущего положения указателя мыши, а другой - флаг, который "отвечает" за нажатие "виртуальных" клавиш (например CTRL или SHIFT).
На следующем шаге мы рассмотрим макросы, которые можно использовать в картах сообщений.