Глава 1
1. Обработка командных сообщенийПроцесс обработки командных сообщений значительно отличается от обработки других сообщений. Обычные сообщения обрабатываются только тем объектом, которому они поступили. Если таблица сообщений класса не содержит обработчика сообщения, будут просмотрены таблицы сообщений его базовых классов. В том случае, если ни один из базовых классов также не содержит обработчика сообщений, выполняется обработка сообщения по умолчанию.
Порядок обработки командных сообщений гораздо сложнее. Командное сообщение, переданное для обработки объекту приложения, может последовательно передаваться другим объектам приложения. Один из объектов, класс (или базовый класс) которого содержит обработчик этого сообщения, выполняет его обработку. Например, командное сообщение, переданное главному окну приложения, в конечном счете может быть обработано активным окном просмотра.
Существует стандартная последовательность объектов приложения, которым передаются командные сообщения. Каждый объект в этой последовательности может обработать командное сообщение, если в его таблице сообщений или таблице сообщений базовых классов есть соответствующая макрокоманда. Необработанные сообщения передаются дальше, другим объектам приложения.
Порядок обработки командых сообщений
Объекты различных классов обрабатывают командные сообщения по-разному. Например, объекты, представляющие главное окно приложения, сначала предоставляют возможность обработать полученное сообщение другим объектам. Только если сообщение остается необработанным, просматривается таблица сообщений класса главного окна приложения. Если и здесь сообщение не обрабатывается, оно направляется другим объектам приложения.
Подавляющее большинство приложений, созданных на основе MFC, использует ряд стандартных командных сообщений, как правило, соответствующих элементам меню или кнопкам панели управления. К ним относятся командные сообщения для завершения работы приложения, создания нового документа, открытия документа, записанного на диске, сохранения документа на диске, вызова справочной системы, управления текстовым редактором и т.д. За каждым таким сообщением зарезервирован отдельный идентификатор.
В отдельных случаях может понадобиться изменить порядок, в котором сообщения передаются для обработки объектам приложения. В этом случае необходимо переопределить виртуальный метод OnCmdMsg. Этот метод первоначально определен в классе CCmdTarget и переопределен в классах CView и CDocument.
Стандартные последовательности обработки сообщений
Ниже описаны стандартные последовательности обработки командных сообщений объектами различных классов.
Главное окно многооконного приложения . Большинство командных сообщений передаются главному окну приложения. Для приложений, имеющих многооконный интерфейс, роль главного окна приложения выполняет объект класса CMDIFrameWnd или объект класса, наследованный от базового CMDIFrameWnd.
Получив сообщение, главное окно приложения сначала предоставляет возможность обработать сообщение активному дочернему окну MDI. Дочерние окна MDI представляют собой объекты класса CMDIChildWnd или класса, наследованного от него.
И только если окно MDI не может обработать сообщение, проверяется таблица сообщений класса главного окна приложения. Следует отметить, что, в свою очередь, окно MDI передает сообщения другим объектам.
Если главное окно приложения также не может обработать командное сообщение, оно передается объекту главного класса приложения. Главный класс приложения наследуется от базового класса CWinApp и приложение имеет только один объект этого класса.
Окна MDI и главное окно однооконного приложения. Для приложений, имеющих однооконный интерфейс, роль главного окна приложения выполняет объект класса CFrameWnd или класса, наследованного от него.
Главное окно однооконного приложения и дочерние MDI-окна многооконного приложения обрабатывают командные сообщения одинаклвым образом. Объект класса CFrameWnd или CMDIChildWnd, которому поступило командное сообщение, передает его соответствующему окну просмотра. Если оно просмотра не может обработать сообщение, проверяется таблица сообщений классов CFrameWnd или CMDIChildWnd.
Если главное окно однооконного приложения или MDI-окно многооконного приложения не может обработать сообщение, оно передается объекту главного класса приложения.
Окна просмотра. В отличие от объектов, представляющих окна типа frame (объекты классов CFrameWnd, CMDIFrameWnd и CMDIChildWnd), окно просмотра в первую очередь проверяет собственную таблицу сообщений. И только в том случае, если командное сообщение не может быть обработано, оно передается документу, связанному с данным окном просмотра.
Документ. Так же как и окно просмотра, объект, представляющий документ, сначала проверяет свою таблицу сообщений. Только в том случае, если в классе документа отсутствует обработчик командного сообщения, оно передается для обработки шаблону данного документа.
Объект, представляющий шаблон документа, проверяет только собственную таблицу сообщений и не передает командные сообщения другим объектам приложения.
Диалоговая панель. Диалоговые панели представляются объектами классов, наследованных от базового класса CDialog, Если командное сообщение, поступившее объекту диалоговой панели, не может быть обработано, оно передается его родительскому окну.
Если родительское окно диалоговой панели также не может обработать командное сообщение, оно передается главному объекту приложения.
Стандартные командные сообщения
Большинство приложений, созданных на основе MFC, использует ряд стандартных командных сообщений, как правило, соответствующих элементам меню или кнопкам панели управления. К ним относятся командные сообщения для завершения работы приложения, создание нового документа, открытия документа, записанного на диске, сохранение документа на диске, вызова справочной системы, управления текстовым редактором и т.д. За каждым
таким сообщением зарезервирован отдельный идентификатор.MFC обеспечивает различный уровень обработки стандартных командных сообщений, начиная от простого резервирования идентификатора до полной обработки отдельных сообщений.
Элемент меню или кнопка панели управления приложения имеет тот же идентификатор, что и командное сообщение. Ниже коротко описаны наиболее важные командные сообщения.
Командные сообщения с идентификаторами ID_FILE_. Данные командные сообщения соответствуют элементам меню File приложений, созданных при помощи средств MFC AppWizard. Обработчики этих сообщений входят в состав различных классов MFC, в том числе CWinApp и CDocument.
Командные сообщения с идентификаторами ID_EDIT_. Эти сообщения соответствуют элементам меню Edit приложений, созданных при помощи средств MFC AppWizard. Это меню обычно используется для выполнения различных операций над документом, отображаемым в окне просмотра.
Класс CEditView содержит обработчики для командных сообщений ID_EDIT_. Если в приложении наследуется класс окна просмотра от базового класса CEditView, то меню Edit будет работать.
Класс CView не содержит стандартных обработчиков для командных сообщений, имеющих идентификаторы ID_EDIT_. Программист должен самостоятельно реализовать их в своем окне просмотра.
Командные сообщения с идентификаторами ID_WINDOW_. Данные сообщения соответствуют элементам меню Window многооконных приложений, созданных при помощи средств MFC AppWizard. Обработка этих командных сообщений возложена на метод OnMDIWindowCmd класса CMDIFr
ameWnd.Командные сообщения с идентификаторами ID_APP_.
В MFC определены два командных сообщения с идентификаторами ID_APP_. Они предназначены для завершения приложения и вывода информации о приложении и его авторе.Командные сообщения с идентификаторами I
D_HELP_. Данные сообщения используются справочной системой приложения.Класс CWinApp содержит методы для обработки командных сообщений, связанный со справочной системой. Если в приложении используется справочная система, программист должен сам вызывать соответствующие методы класса CWinApp для обработки командных сообщений ID_HELP_.
MFC AppWizard позволяет создавать приложение, имеющее справочную систему. В этом случае MFC AppWizard автоматически создает программный код, необходимый для управления справочной системой.
Командные сообщения с идентификаторами ID_VIEW_
. Эти командные сообщения соответствуют элементам меню View приложений, созданных при помощи средств MFC AppWizard. За обработку командных сообщений ID_VIEW_ отвечает класс CFrameWnd.