Лабораторная работа №4
Обработка сообщений
Цель работы: изучение технологии программирования обработки сообщений в среде Visual C++.
Задание
1. Изучить материал, изложенный в разделе "Учебная информация".
2. Разработать SDI-приложение под именем MESSXX, где XX – номер варианта. Добавить 2 диалоговых окна, в каждом из которых реализовать одно из заданий, содержащихся в файле Var04.doc. Для открытия диалоговых окон добавить в SDI-окно меню "Задание" с выпадающим меню, содержащим пункты "Задание 1" и "Задание 2", которые открывают соответствующие диалоговые окна.
3. Составить отчет о работе, в который включить виды полученных диалоговых окон и коды используемых обработчиков сообщений, реализующих задачи. Продемонстрировать работу приложения на компьютере.
Учебная информация
Обработка сообщений является основным принципом управления приложением в Window. При работе с приложением происходят различные события: нажатие клавиш на клавиатуре или кнопок мыши, открытие окон и многие другие. При этом посылается сообщение о том, что что-то произошло. Сообщения могут передаваться от одного окна к другому (обычно от дочернего к родительскому), например, от кнопки (элементы управления являются миниатюрными окнами) к диалоговому окну, в котором она расположена. В сообщении содержится информация кому оно предназначено.
Список допустимых сообщений в окне ClassWizard зависит от выбранного объекта. Например, для класса окна представления он содержит более 60 сообщений, а для пункта меню – всего два: COMMAND и UPDATE_COMMAND_UI. Ниже в таблице приведены лишь некоторые часто используемые сообщения. Объекты классов CSDIView и CDlg в таблице соответственно обозначают окно представления в SDI-приложении и диалоговое окно. Префикс WM во многих сообщениях означает Window Message - сообщение окну.
Объект |
Сообщение |
Момент возникновения |
CSDIView |
OnInitialUpdate |
При открытии окна представления |
CSDIView, CDlg |
WM_CREATE |
После создания окна |
CSDIView, CDlg |
WM_LBUTTONDOWN |
При нажатии левой кнопки мыши в рабочей области окна |
CSDIView, CDlg |
WM_PAINT |
При выполнении метода Invalidate() |
CSDIView, CDlg |
WM_RBUTTONDOWN |
При нажатии правой кнопки мыши в рабочей области окна |
CSDIView, CDlg |
WM_SIZE |
При изменении размеров окна |
CSDIView, CDlg |
WM_TIMER |
При срабатывании таймера |
CDlg |
WM_DESTROY |
При уничтожении окна |
CDlg |
WM_INITDIALOG |
Перед открытием диалогового окна |
Кнопка |
WM_CLICKED |
При щелчке мышью |
Кнопка |
WM_DOUBLECLICKED |
При двойном щелчке мышью |
Пункт меню |
COMMAND |
При выборе пункта меню |
Для указания, каким обработчиком будет обрабатываться сообщение, в MFC-приложениях используется карта сообщений. Карта сообщений состоит из двух частей: одна – в заголовочном файле класса (.h); другая – в соответствующем файле реализации (.cpp).
В заголовочном файле производится объявление карты сообщений при помощи макроса DECLARE_MESSAGE_MAP().
В файле реализации описывается сама карта сообщений, например:
BEGIN_MESSAGE_MAP(CSDIView, CView)
//{{AFX_MSG_MAP(CSDIView)
ON_COMMAND(ID_1, On1)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
Здесь BEGIN_MESSAGE_MAP и END_MESSAGE_MAP – макросы, ограничивающие область карты сообщений; ON_COMMAND(ID_1, On1) – макрос, направляющий обработку сообщения от объекта ID_1 (это пункт меню) функции-обработчику с именем On1.
Мастер ClassWizard автоматизирует добавление в проект указанных выше макросов и функций-обработчиков сообщений. От программиста требуется:
-
понимать, каким событием и сообщением воспользоваться для решения своей задачи, поскольку сообщения передаются от разных объектов и в различные моменты времени;
-
знать, в какой класс добавить функцию-обработчик сообщения;
-
подготовить и добавить код обработки в заготовку обработчика сообщения, созданную мастером ClassWizard.