- •3 Базовые классы библиотеки mfc
- •Класс cObject
- •Методы и переменные класса cObject
- •Класс cWinApp
- •IpszResourceName - указатель на строку, содержащую имя ресурса пиктограммы. (Тип параметра также может быть cString.) nIdResource - id ресурса пиктограммы.
- •Методы - обработчики сообщений
- •Класс cWnd
- •Методы инициализации
- •Методы управления состоянием окна
- •Управление размером и положением окна
- •Методы управления доступом
- •Методы обновления и перерисовки окна
- •IpRectUpdate - структура rect, определяющая координаты обновляемой прямоугольной области. Данный параметр игнорируется, если prgnUpdate содержит ненулевой указатель области.
- •Методы преобразования координат
- •Методы работы с текстом окна
- •Методы управления линейкой прокрутки
- •Методы управления курсором ввода
- •Методы управления элементами диалогового окна
- •IpString - указатель на буфер, содержащий выбранную строку списка.
- •IpStr - указатель на буфер, в который заносится текст или заголовок элемента управления.
- •Методы работы с меню
- •Методы управления таймером
- •Предупреждающие методы
- •Методы управления сообщениями
- •Переопределяемые методы
- •Методы, вызываемые для обработки сообщений
- •IpCreateStruct - структура createstruct, содержащая информацию о создаваемом объекте cWnd.
- •Класс cFile
- •Члены класса
- •IpszFileName - строка, указывающая в кодировке Windows абсолютный или относительный путь к имени файла. Не может содержать сетевого имени.
Методы - обработчики сообщений
Все методы - обработчики сообщений (для всех классов) начинаются с префикса 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++ за три шага:
-
создание самого оконного объекта;
-
создание Windows-окна (если не используется уже существующее);
-
закрепление созданного или уже имеющегося 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.