Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Microsoft Visual C++ и MFC

© Александр Фролов, Григорий Фролов
Том 24, М.: Диалог-МИФИ, 1993.

[Назад] [Содеожание] [Дальше]

Обработка командных сообщений

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

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

Судьба командных сообщений гораздо сложнее. Командное сообщение, переданное для обработки объекту приложения, может последовательно передаваться другим объектам приложения. Один из объектов, класс (или базовый класс) которого содержит обработчик этого сообщения, выполняет его обработку. Так, например, командное сообщение, переданное главному окну приложения, в конечном счете может быть обработано активным окном просмотра.

Существует стандартная последовательность объектов приложения, которым передаются командные сообщения. Каждый объект в этой последовательности может обработать командное сообщение, если в его таблице сообщений или таблице сообщений базовых классов есть соответствующая макрокоманда. Необработанные сообщения передаются дальше, другим объектам приложения.

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

Порядок обработки сообщений

Ниже описаны последовательности обработки командных сообщений объектами различных классов.

Главное окно однооконного приложения

Большинство командных сообщений передаются главному окну приложения. Для приложений, имеющих однооконный интерфейс, роль главного окна приложения выполняет объект класса CFrameWnd или объект класса, наследованного от базового класса CFrameWnd.

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

Если главное окно приложения также не может обработать командное сообщение, оно передается объекту главного класса приложения. Напомним, что главный класс приложения наследуется от базового класса CWinApp и приложение имеет только один объект этого класса.

Окно просмотра

В отличие от объектов, представляющих окна типа frame (объекты классов CFrameWnd, CMDIFrameWnd и CMDIChildWnd) окно просмотра в первую очередь проверяет собственную таблицу сообщений. И только в том случае, если командное сообщение не может быть обработано, оно передается документу, связанному с данным окном просмотра. Последовательность обработки командных сообщений документом представлена ниже.

Документ

Также как и окно просмотра, объект, представляющий документ, сначала проверяет свою таблицу сообщений. Только в том, случае если в классе документа отсутствует обработчик командного сообщения, оно передается для обработки шаблону данного документа.

Объект, представляющий шаблон документа, проверяет только собственную таблицу сообщений и не передает командные сообщения другим объектам приложения.

Диалоговая панель

Диалоговые панели представляются объектами классов, наследованных от базового класса СDialog. Если командное сообщение, поступившее объекту диалоговой панели, не может быть обработано, оно передается его родительскому окну.

Если родительское окно диалоговой панели также не может обработать командное сообщение, оно передается главному объекту приложения.

Командные сообщения и приложение Single

Большинство командных сообщений от элементов меню и панели управления поступают для обработки главному окну приложения, представленному объектом класса CMainFrame.

Главное окно приложения сразу передает командное сообщение для обработки окну просмотра. Окно просмотра представлено объектом класса CSingleView.

Если класс окна просмотра не имеет метода для обработки сообщения, оно передается документу. Документ приложения Single является объектом класса CSingleDoc.

Если документ приложения также не может обработать командное сообщение, оно передается объекту, представляющему шаблон документа.

В случае, если шаблон документа также не содержит обработчика сообщения, проверяется таблица сообщений класса главного окна приложения.

Если и главное окно приложения не может обработать поступившее командное сообщение, оно направляется объекту главного класса приложения CSingleApp.

Изменение порядка обработки сообщений

Порядок обработки командных сообщений определяется виртуальным методом OnCmdMsg. Этот метод первоначально определен в классе CCmdTarget и переопределен в классах CFrameWnd, CView, CDocument и некоторых других классах MFC.

В ряде случаев может понадобиться изменить порядок, в котором командные сообщения передаются объектам приложения или ввести новый объект в цепочке стандартных объектов. В этом случае вы должны переопределить виртуальный метод OnCmdMsg соответствующим образом. В качестве примера использования метода OnCmdMsg вы можете взять класс CView. Если вы установили Visual C++ с исходными текстами библиотеки MFC, вы можете найти определение этого метода в файле Viewcore.cpp.

Стандартные командные сообщения

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

MFC обеспечивает различный уровень обработки стандартных командных сообщений, начиная от простого резервирования идентификатора и кончая полной его обработкой.

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

Ниже коротко описаны наиболее важные стандартные командные сообщения.

Командные сообщения с идентификаторами ID_FILE_

Командные сообщения с идентификаторами ID_FILE_ соответствуют элементам меню File приложений, созданных при помощи средств MFC AppWizard. Обработчики этих сообщений входят в состав различных классов MFC, в том числе CWinApp и CDocument.

Идентификатор командного сообщения

Описание

ID_FILE_NEW XE "ID_FILE_NEW"

Создать новый документ. Класс CWinApp содержит стандартный обработчик этого сообщения - метод OnFileNew. Если вы желаете его использовать, необходимо поместить в таблицу сообщений главного класса приложения соответствующую макрокоманду (см. приложение Single)

ID_FILE_OPEN XE "ID_FILE_OPEN"

Открыть документ, записанный на диске. Класс CWinApp содержит стандартный обработчик этого сообщения - метод OnFileOpen. Если вы желаете его использовать, необходимо поместить в таблицу сообщений главного класса приложения соответствующую макрокоманду (см. приложение Single)

ID_FILE_CLOSE XE "ID_FILE_CLOSE"

Закрыть текущий документ. Класс CDocument содержит метод OnFileClose, предназначенный для обработки этого командного сообщения. Метод OnFileClose вызывает метод SaveModified, если документ приложения был изменен, а затем вызывает метод OnCloseDocument

ID_FILE_SAVE XE "ID_FILE_SAVE"

Сохранить текущий документ. За обработку этого командного сообщения отвечает метод OnSaveDocument класса CDocument

ID_FILE_SAVE_AS XE "ID_FILE_SAVE_AS"

Сохранить текущий документ под новым именем. За обработку этого командного сообщения отвечает метод OnSaveDocument класса CDocument

ID_FILE_SAVE_COPY_AS XE "ID_FILE_SAVE_COPY_AS"

Сохранить копию текущего документа под новым именем

ID_FILE_PAGE_SETUP XE "ID_FILE_PAGE_SETUP"

Вызывает диалоговую панель выбора формата документа

ID_FILE_PRINT_SETUP XE "ID_FILE_PRINT_SETUP"

Вызвать диалоговую панель для настройки принтера

ID_FILE_PRINT XE "ID_FILE_PRINT"

Выполнить печать текущего документа

ID_FILE_PRINT_PREVIEW XE "ID_FILE_PRINT_PREVIEW"

Перейти в режим предварительного просмотра документа перед печатью

ID_FILE_MRU_FILE1 XE "ID_FILE_MRU_FILE1" ...
FILE16

Открыть один из наиболее часто используемых файлов приложения

Командные сообщения с идентификаторами ID_EDIT_

Командные сообщения с идентификаторами ID_EDIT_ соответствуют элементам меню Edit приложений, созданных при помощи средств MFC AppWizard. Это меню обычно используется для выполнения различных операций над документом, отображаемым в окне просмотра.

Класс CEditView содержит обработчики для командных сообщений ID_EDIT_. Если вы наследуете класс окна просмотра приложения от базового класса CEditView, то меню Edit будет работать.

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

Идентификатор командного сообщения

Описание

ID_EDIT_CLEAR XE "ID_EDIT_CLEAR"

Удалить выделенный объект

ID_EDIT_CLEAR_ALL XE "ID_EDIT_CLEAR_ALL"

Удалить содержимое документа

ID_EDIT_COPY XE "ID_EDIT_COPY"

Скопировать выделенный объект в универсальный буфер обмена clipboard

ID_EDIT_CUT XE "ID_EDIT_CUT"

Удалить выделенный объект и записать его в clipboard

ID_EDIT_FIND XE "ID_EDIT_FIND"

Отобразить на экране диалоговую панель для поиска заданного объекта в документе

ID_EDIT_PASTE XE "ID_EDIT_PASTE"

Вставить в документ содержимое Clipboard

ID_EDIT_REPEAT XE "ID_EDIT_REPEAT"

Повторить последнюю операцию

ID_EDIT_REPLACE XE "ID_EDIT_REPLACE"

Отобразить диалоговую панель для поиска и замены текста

ID_EDIT_SELECT_ALL XE "ID_EDIT_SELECT_ALL"

Выбрать (выделить) весь документ

ID_EDIT_UNDO XE "ID_EDIT_UNDO"

Отменить последнюю операцию

ID_EDIT_REDO XE "ID_EDIT_REDO"

Выполнить последнюю отмененную операцию

Командные сообщения с идентификаторами ID_WINDOW_

Командные сообщения с идентификаторами ID_WINDOW_ соответствуют элементам меню Window многооконных приложений, созданных при помощи средств MFC AppWizard. Обработка этих командных сообщений возложена на метод OnMDIWindowCmd класса CMDIFrameWnd.

Идентификатор командного сообщения

Описание

ID_WINDOW_NEW XE "ID_WINDOW_NEW"

Открыть новое окно с текущим документом

ID_WINDOW_ARRANGE XE "ID_WINDOW_ARRANGE"

Выровнять пиктограммы в нижней части окна MDI

ID_WINDOW_CASCADE XE "ID_WINDOW_CASCADE"

Выполнить каскадное размещение окон

ID_WINDOW_TILE_HORZ XE "ID_WINDOW_TILE_HORZ"

Расположить окна рядом по горизонтали

ID_WINDOW_TILE_VERT XE "ID_WINDOW_TILE_VERT"

Расположить окна рядом по вертикали

ID_WINDOW_SPLIT XE "ID_WINDOW_SPLIT"

Разделить окно на две части

Командные сообщения с идентификаторами ID_APP_

В MFC определены только два командных сообщения с идентификаторами ID_APP_. Они предназначены для завершения приложения и вывода информации о приложении и его авторе.

Идентификатор командного сообщения

Описание

ID_APP_EXIT XE "ID_APP_EXIT"

Завершить приложение.

Данное командное сообщение обрабатывается методом OnAppExit класса CWinApp. Метод OnAppExit передает сообщение WM_CLOSE главному окну приложения

ID_APP_ABOUT XE "ID_APP_ABOUT"

Отобразить на экране краткую справку о программе - диалоговую панель About.

Ни один из классов MFC не выполняет обработки этого сообщения по умолчанию, но MFC AppWizard автоматически создает необходимый для этого программный код

Командные сообщения с идентификаторами ID_HELP_

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

Класс CWinApp содержит методы для обработки командных сообщений, связанных со справочной системой. Если вы используете справочную систему, вы должны сами вызывать соответствующие методы класса CWinApp для обработки командных сообщений ID_HELP_.

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

Идентификатор командного сообщения

Описание

ID_HELP_INDEX XE "ID_HELP_INDEX"

Отобразить список статей из справочной базы данных, записанной в HLP-файле

ID_HELP_USING XE "ID_HELP_USING"

Отобразить подсказку об использовании справочной системы

ID_CONTEXT_HELP XE "ID_CONTEXT_HELP"

Перейди в режим контекстной подсказки. Передается также при нажатии комбинации клавиш <Shift+F1>

ID_HELP XE "ID_HELP"

Получить справочную информацию по данному контексту

ID_DEFAULT_HELP XE "ID_DEFAULT_HELP"

Получить справочную информацию определенную по умолчанию для данного контекста

Командные сообщения с идентификаторами ID_VIEW_

Командные сообщения с идентификаторами ID_VIEW_ соответствуют элементам меню View приложений, созданных при помощи средств MFC AppWizard. За обработку командных сообщений ID_VIEW_ отвечает класс CFrameWnd.

Идентификатор командного сообщения

Описание

ID_VIEW_TOOLBAR XE "ID_VIEW_TOOLBAR"

Отобразить или скрыть панель управления toolbar

ID_VIEW_STATUS_BAR XE "ID_VIEW_STATUS_BAR"

Отобразить или скрыть панель состояния status bar

Описание стандартных команд и методов, предназначенных для их обработки, вы можете получить из справочной системы Visual C++. В следующих книгах серии “Библиотека системного программиста” мы изучим наиболее важные стандартные командные сообщения более подробно.

[Назад] [Содеожание] [Дальше]