Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
38
Добавлен:
16.02.2016
Размер:
544.77 Кб
Скачать

Методы - обработчики сообщений

Все методы - обработчики сообщений (для всех классов) начинаются с префикса On.

Для использования какого-либо метода - обработчика сообщения следует в таблицу сообщений класса CWinApp (или производного от него) добавить строку кода ON_COMMAND (ID_сообщения, название_метода_обработчика).

Например, для метода afxjnsg void OnFileNew();, выполняющего обработку сообщения "создать новый файл", строка кода будет записана так: ON_COMMAND (ID_FILE_NEW, OnFileNew).

Отметим, что AppWizard для приложений диалогов и приложений с SDI и MDI интерфейсом автоматически создает таблицу сообщений.

Пример:

BEGIN MESSAGE MAP(CMyApp, CWinApp) // Начало таблицы сообщений

//{{AFX MSG МАР(СМуАрр)

ON COMMAND (ID APP ABOUT, OnAppAbout)

//}}AFX MSG MAP

ON COMMANDED FILE NEW, CWinApp::OnFileNew)

ON COMMANDED FILE OPEN, CWinApp::OnFileOpen)

ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)

END_MESSAGE_MAP() // Конец таблицы сообщений

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

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

Класс CWinApp содержит следующие методы - обработчики сообщений (и соответствующие им идентификаторы команд):

OnFileNew ID_FILE_NEW;

OnFUeOpen ID_FILE_OPEN;

OnFilePrintSetup ID_FILE_PRINT_SETUP;

OnContextHelp (при нажатии на клавиши Shift+Fl);

OnHelp (при нажатии на клавишу F1, используется текущий контекст);

OnHelpIndex ID_HELP_INDEX (вызов темы справки по умолчанию);

OnHelpFinder ID_HELP_FINDER и ID_DEFAULT_HELP;

OnHelpUsing ID_HELP_USING.

Класс cWnd

Класс CWnd является базовым классом всех оконных объектов библиотеки MFC. Он инкапсулирует управление Windows-окнами (скрывая от разработчика непосредственно структуру HWND и предоставляя доступ к управлению оконными объектами посредством API-функций). Можно сказать, что класс CWnd является классом-оболочкой для Windows-окон.

Для более ясного понимания механизмов управления оконными объектами MFC рассмотрим, каким образом взаимодействуют Windows-окна - окна, управляемые операционной системой, и оконные объекты библиотеки MFC. Windows-окно является объектом операционной системы. Оно имеет так называемую функцию окна, посредством которой операционная система осуществляет управление Windows-окном. Дескриптор Windows-окна указывается структурой HWND. Этот дескриптор, иногда также называемый определителем, идентифицирует конкретное окно при вызове API-функции.

Оконные объекты являются объектами в смысле языка C++. Переменная класса m_nWnd служит для связи между оконным объектом C++ и Windows-окном операционной системы, указывая дескриптор Windows-окна.

И наконец, окно, отображаемое на экране, является результатом прикрепления оконного объекта к Windows-OKHy. Создание окна выполняется в Visual C++ за три шага:

  1. создание самого оконного объекта;

  2. создание Windows-окна (если не используется уже существующее);

  3. закрепление созданного или уже имеющегося Windows-окна за оконным объектом.

Windows-окно условно можно разбить на две области:

  • клиентскую область, содержание которой может определяться классами отображения (View-классы) и полностью программируется разработчиком;

  • системную область, представляющую собой неизменные атрибуты (некоторые из которых могут отсутствовать) Windows-окна и состоящая из строки заголовка, линейки меню и т. п.

При использовании архитектуры документ/отображение (document/view) создается два оконных объекта, закрепленных за двумя Windows-окнами:

  • окно-рамка (объект класса CFrameWnd или производного от него) прикрепляется к Windows-окну, использующему только системную область;

  • окно-отображение (объект класса CView) прикрепляется к Windows-окну, использующему только клиентскую область.

Windows-окно, прикрепленное к окну-отображению, одновременно является дочерним по отношению к Windows-окну, прикрепленному к окну-рамке.

Библиотека MFC содержит для каждого элемента управления (Windows-окна) соответствующий ему класс-оболочку. (Например, класс CEdit, CListBox, CButton.)

Между окнами возможно два типа отношений:

  • родительское-дочернее. Это отношение автоматически определяется при создании оконных объектов;

  • окно-собственник - принадлежащее окно. Это отношение формируется. И как правило, используется для объявления собственником ряда окон некоторого окна, не являющегося для них родительским окном.

Теперь, определив связь между оконным объектом, Windows-окном и окном, отображаемым на экране, перейдем к рассмотрению членов класса CWnd.

Объект CWnd создается или разрушается соответственно конструктором или деструктором класса. Windows-окно создается методами класса CWnd, например Create; Метод DestroyWindow разрушает Windows-окно без разрушения оконного объекта.

Класс CWnd в соединении с механизмом обработки сообщений (таблица сообщений) прячет от разработчика функцию окна WndProc. Все поступающие для окна сообщения передаются через таблицу сообщений и автоматически инициируют вызов соответствующего метода OnMessage класса CWnd. Следовательно, для того чтобы определить в производном классе собственную обработку любого сообщения, достаточно переопределить соответствующий метод OnMessage класса CWnd.

Переменные-члены класса

m_hWnd

Данная переменная является общедоступной переменной типа HWND и указывает дескриптор Windows-окна, закрепленного за текущим оконным объектом CWnd.

Конструктор и деструктор класса

CWnd CWnd ();

Создает объект класса CWnd.

Отметим, что для создания Windows-окна следует вызвать методы CreateEx или Create, virtual BOOL DestroyWindow ();

В случае успешного разрушения окна метод возвращает ненулевое значение, и 0 - в противном случае.

Этот метод разрушает только Windows-окно, прикрепленное к текущему оконному объекту CWnd, соответствующие этому окну ресурсы и дочерние окна. Метод посылает окну сообщения WMJDESTROY и WM_NCDESTROY.

Если у Windows-окна имеются дочерние окна, то сначала разрушаются они, а затем само Windows-окно. При этом если для разрушаемого дочернего окна не установлен стиль WS_EX_NOPARENTNOTIFY, то его родительскому окну посылается сообщение WM_PARENTNOTIFY.

Этот метод также используется для разрушения модального диалогового окна, созданного методом CDialog::Create.

Соседние файлы в папке VC++Баженова