Визуальное программирование и MFC

       

Объекты класса CWnd и Windows-окна


Рассмотрим взаимоотношения объектов класса CWnd с Windows-окнами. Хотя объекты класса CWnd и производных от него классов (оконные объекты) не тождественны Windows-окнам, они связаны настолько тесно, что такое отождествление вполне оправдано. Windows-окно - объект операционной системы Windows - это внутренняя структура данных операционной системы, с которой связано изображение на экране в виде окна-прямоугольника со специальными элементами и областями. Эта структура обеспечивает управление окном на экране и реакцию на воздействие пользователя на окно. В смысле объектно-ориентированного программирования она во многом подобна классу и имеет метод - функцию окна. Однако эта структура не является, конечно же, структурой какого-либо языка программирования, поэтому Windows-окно не является объектом в смысле языка C++. Дескриптор (handle) Windows-окна просто идентифицирует его при вызове функций API, предназначенных для работы с Windows-окнами.

Оконный объект - это объект в смысле языка C++, который служит для работы с Windows-окном. Его переменная m_hWnd задает определитель (handle) Windows-окна, прикрепленного (attached) к данному оконному объекту. Создание оконного объекта состоит из двух этапов: создания самого объекта и создания и прикрепления Windows-окна к оконному объекту или прикрепление к оконному объекту уже существующего Windows-окна. Оконный объект может использоваться приложением для управления экранным образом (окном на экране) прикрепленного Windows-окна. При этом само Windows-окно становится "прозрачным", т.е. не фигурирует при вызове соответствующих методов.

Оконный объект использует большое количество функций API, предназначенных для работы с окнами. Например, метод MoveWindow передвигает и изменяет размер окна на экране:

wnd.MoveWindow(x, y, width, height, rep);

При вызове этого метода его реализация на самом деле использует API-функцию

BOOL MoveWindow( HWND hWnd, // дескриптор Windows-окна int X, // позиция по горизонтали int Y, // позиция по вертикали int nWidth, // ширина int nHeight, // высота BOOL bRepaint); // признак перерисовки


Функция API вызываетcя со значением первого параметра, равным дескриптору Windows-окна, прикрепленного к оконному объекту.



Таким образом, оконный объект как бы содержит в себе Windows-окно и предоставляет для работы с ним методы в смысле языка C++. О классе CWnd оконных объектов говорят, что он является классом-оболочкой для Windows-окон.



Ранее уже упоминалось об оконном объекте - облике (класс CView). Прикрепленное к облику Windows-окно служит для отображения документа на экране. Однако окно облика никогда не появляется на экране без окна другого объекта - окна-рамки. Окно-рамка (класс CFrameWnd) - объект производного от CWnd класса - координирует взаимодействие приложения с документом и его обликом. Прикрепленное к нему Windows-окно представлено в виде рамки, внутри которого находится окно облика. На экране они выглядят как одно целое, но на самом деле они прикреплены к разным объектам. Рамка имеет нестандартные элементы управления окна: полосу заголовка, меню, кнопки минимизации и максимизации, элементы управления размерами окна. Рамка также может иметь строку статуса и панель инструментов. Окно облика, наоборот, не имея элементов управления (они сосредоточены у рамки), является рабочей областью, в которой облик строит приложение.

Любое Windows-окно имеет две области: клиентскую область, изображение в которой задается приложением, и системную область, состоящую из управляющих элементов. Таким образом, окно-рамка задает Windows-окно, использующее только свою системную область, а облик задает Windows-окно, использующее только свою клиентскую область. Windows-окно, прикрепленное к облику, является дочерним (child) по отношению к Windows-окну, прикрепленному к соответствующему объекту окно-рамка. Это, в частности, означает, что дочернее окно нельзя передвинуть за пределы клиентской области родительского окна.

Число методов класса CWnd очень велико, с ними можно ознакомится при помощи справочной системы Visual C++. Остановимся подробнее только на некоторых из них.


Содержание раздела