// Класс CMFMenuWindow – представляет главное окно

//=====================================================

class CMFMenuWindow : public CFrameWnd {

public:

 // Объявляем конструктор класса CMFMenuWindow

 CMFMenuWindow();

 // Объявляем методы для обработки команд меню

 afx_msg void MenuCommand();

 afx_msg void ExitApp();

 // Макрокоманда необходима, так как класс

 // CMFMenuWindow обрабатывает сообщения

 DECLARE_MESSAGE_MAP()

};

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

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

Приложение MFMenu обрабатывает только две команды от меню приложения. Первая команда имеет идентификатор ID_TEST_BEEP и передается, когда пользователь выбирает из меню Test строку Beep. Для обработки этой команды вызывается метод MenuCommand. Вторая команда с идентификатором ID_TEST_EXIT передается приложению, когда пользователь выбирает из меню Test строку Exit. Обработка этого сообщения выполняется методом ExitApp.

//=====================================================

// Таблица сообщений класса CMFMenuWindow

//=====================================================

BEGIN_MESSAGE_MAP(CMFMenuWindow, CFrameWnd)

 ON_COMMAND(ID_TEST_BEEP, MenuCommand)

 ON_COMMAND(ID_TEST_EXIT, ExitApp)

END_MESSAGE_MAP()

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

Долгий путь сообщения

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

Создайте новый проект под названием MFMessage. В качестве типа приложения выберите из списка Type строку Application (рис. 4.1). Наберите в редакторе исходный текст приложения и сохраните его в файле MFMessage.cpp (листинг 2.10). Чтобы быстрее набрать текст приложения, вы можете модифицировать исходный текст приложения MFMenu.

Листинг 2.10. Файл MFMessage.cpp

// Включаемый файл для MFC

#include <afxwin.h>

#include 'resource.h'

//=====================================================

// Класс CMFMessageApp – главный класс приложения

//=====================================================

class CMFMessageApp : public CWinApp {

public:

 // Мы будем переопределять метод InitInstance,

 // предназначенный для инициализации приложения

 virtual BOOL InitInstance();

 afx_msg void AppMessageCommand();

 // Макрокоманда необходима, так как класс

 // CMFMessageWindow обрабатывает сообщения

 DECLARE_MESSAGE_MAP()

};

// Создаем объект приложение класса CMFMessageApp

CMFMessageApp MFMessageApp;

//=====================================================

// Класс CMFMessageWindow – представляет главное окно

//=====================================================

class CMFMessageWindow : public CFrameWnd {

public:

 // Объявляем конструктор класса CMFMessageWindow

 CMFMessageWindow();

 // Объявляем методы для обработки команд меню

 afx_msg void FrameMessageCommand();

 afx_msg void ExitApp();

 // Макрокоманда необходима, так как класс

 // CMFMessageWindow обрабатывает сообщения

 DECLARE_MESSAGE_MAP()

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

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

Отметить Добавить цитату