Приложение, обрабатывающее сообщения

Предыдущие рассматриваемые приложения, фактически никак не могли взаимодействовать с пользователем. Они не имели ни меню, ни панели управления. И, самое главное, они не содержали обработчиков сообщений.

Рассмотрим приложение menu, которое имеет меню и содержит обработчики сообщений, передаваемых приложению, когда пользователь открывает меню и выбирает из него строки. При создании приложения menu будут использоваться средства автоматизированной разработки MFC AppWizard. (проект приложения приводится в файле menu.zip)

Файл ресурсов, в который включается описание меню, можно построить либо непосредственным созданием нового файла ресурсов, либо при помощи средств редактора ресурсов. В любом случае при создании меню нужно определить название меню и строк меню. Каждый элемент меню должен иметь уникальный идентификатор, однозначно его определяющий.

Приложение menu имеет главное меню, состоящее из одного пункта Teст. Можно выбрать одну из следующих команд - Звонок или Выход.

Для построения меню после создания шаблона приложения запустим редактор ресурсов. Для этого в Workspace выберем закладку ResourceView, а в открывшейся закладке раскроем дерево и найдем поддерево Menu. Главному меню приложения соответствует идентификатор IDR_MAINFRAME. При нажатии правой кнопки мыши на этом элементе вы можете выбрать в контекстном меню строку Properties. Выберете в открывшемся диалоге указатель языка для отображения пунктов меню.

При двойном нажатии на кнопку мыши на элементе дерева IDR_MAINFRAME вы увидите меню, которое можно редактировать. Для удобства работы вы можете закрепить диалог Properties на экране. Для этого щелкните мышкой на левой иконке дилога, когда он есть на экране так, чтобы иконка приняла вид "микрофона". Для каждого пук\нкта меню вы можете указать его название и идентификатор. Лишние пункты меню можно убрать, используя клавишу DEL.

Чтобы объекты класса могли обрабатывать сообщения, в определении класса необходимо поместить макрокоманду DECLARE_MESSAGE_MAP. По принятым соглашениям эта макрокоманда должна записываться в секцию public.

Кроме этого, необходимо также определить таблицу сообщений. Таблица начинается макрокомандой BEGIN_MESSAGE_MAP и заканчивается макрокомандой END_MESSAGE_MAP. Между этими макрокомандами расположены строки таблицы сообщений, определяющие сообщения, подлежащие обработке данным классом, и методы, которые выполняют такую обработку.

Приложение должно содержать несколько классов, обладающих собственными таблицами сообщений. Чтобы однозначно определить класс, к которому относится таблица сообщений, имя этого класса записывается в первый параметр макрокоманды BEGIN_MESSAGE_MAP.

Приложение menu обрабатывает только две команды от меню приложения. Для обработки этих команд используют методы, представленные в определении класса CMainFrame.

Приложению может поступать гораздо больше сообщений и команд, чем указано в таблице сообщений класса CMainFrame. Необработанные сообщения передаются для обработки базовому классу - классу CFrameWnd. Класс, который будет обрабатывать сообщения, не указанные в таблице сообщений, указывается во втором параметре макрокоманды BEGIN_MESSAGE_MAP.

Замечание. Если класс приложения тоже обрабатывает сообщения (т.е. имеет таблицу сообщений), и некоторые из сообщений обрабатываются как окном, так и приложением, то нужно понять, какова очередность обработки сообщений тем или иным объектом.

Те команды, которые не имеют обработчика в таблице сообщений класса окна, передаются для обработки в класс приложения. Если же команда может быть обработана и в классе окна и в классе приложения, она обрабатывается только один раз в классе окна. Обработчик класса приложения в этом случае не вызывается.

Создание обработчиков сообщений для команд меню.

Для создания обработчиков сообщений по командам меню воспользуемся средствами ClassWizard. Для запуска ClassWizard в меню View выберете строку ClassWizard, а затем закладку MessageMap. Укажите имя класса, для которого будем создавать обработчик событий. В нашем случае это будет класс СMainFrame. В списке Object IDs выберете идентификатор команды, связанной с пунктом меню "Звонок", и в списке Messages - Сommand. Нажмите на кнопку AddFunction и выберете имя функции ( в нашем примере OnTestBeep ). Class Wizard вставит обработчик сообщения и в таблицу сообщений, и в файл типа h, и в файл CMainFrm.cpp. Текст функции необходимо набрать самостоятельно. Аналогично добавляются обработчики всех других команд.

Задания к работе.

Создать простейшее приложение Start, которое выводит главное окно.
Создать приложение, которое выводит главное окно, содержащее меню, состоящее из нескольких пунктов, и реализовать эти пункты меню, используя простые функции-диалоги типа AfxMessageBox, MessageBox, MessageBeep.

Создать приложение, которое выводит главное окно, содержащее меню с пунктами "Диалог", "About" и "Выход". При выборе пункта "Диалог" появляется модальная диалоговая панель, которая позволяет вводить десятичное число и отображать его в различных системах счисления.

Все программы должны иметь нестандартные иконки, вся строковая информация задается через ресурсы.

Наши рекомендации