Microsoft Visual C++ и MFC. Программирование для Windows 95 и Windows NT - [31]

Шрифт
Интервал

Если вы выберите строку Beep из меню Test, то услышите на внутреннем динамике компьютера звуковой сигнал. В случае если звуковой сигнал не слышен, проверьте подключен ли внутренний динамик, а если в компьютере установлена звуковая плата, правильно установите громкость сигнала.

Когда вы завершите работу с приложением, его можно закрыть. Для этого воспользуйтесь системным меню приложения или выберите из меню Test строку Exit.

Рис. 2.25. Приложение MFMenu


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

>//=====================================================

>// Класс 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

>#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()

>};


>//=====================================================

>// Метод MessageCommand

>// Обрабатывает команду ID_TEST_BEEP

>//=====================================================

>void CMFMessageWindow::FrameMessageCommand() {

> ::MessageBox(NULL, "Command received in CMFMessageWindow Message Map", "Message", MB_OK);

>}


>//=====================================================

>// Метод MessageCommand

>// Обрабатывает команду ID_TEST_BEEP


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

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


Симуляция частичной специализации

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


Обработка событий в С++

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


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.