О классах окон

Класс окна приложения создается при запуске приложения функцией RegisterClass. Этот класс определяет поведение окна, то есть его внешний вид, возмножности перетаскивания и многое другое на основе стилей. Когда идет разговор о классе окна не надо забывать, что класс окна это структура, которая описывает свойства окна, а не класс в понимании программиста.

typedef struct tagWNDCLASS { 
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCSTR lpszMenuName;
LPCSTR lpszClassName;
} WNDCLASS;

Каждое окно имеет класс. И перед созданием окна класс окна необходимо зарегистрировать. Регистрировать можно только для использования в своем приложении или для общего использования в системе всеми приложениями. Windows предоставляет много готовых классов для общего использования приложениями. Вот некоторые основные классы:

Edit
Listbox
ComboBox
ScrollBar
Button
Static

Кроме того, Windows предоставляет другие глобальные классы для общего доступа:

Класс меню
Класс рабочего стола
Класс диалогового окна
Класс задач
Класс икон
ComboBox
MDIClient

Эти глобальные классы могут использовать все приложения Windows. Приложения не могут изменять добавлять или удалять эти глобальные классы. Приложение может создать подкласс глобального класса, но такой подход не рекомендуют использовать, так как он влияет на всю систему. Все глобальные классы уничтожаются при выгрузке Windows, то есть когда операционная (???) система Windows прекращает свою работу.

Можно создавать свои прикладные глобальные классы. Это можно использовать для создания специальных элементов управления. Для этого описание класса необходимо поместить в DLL и класс будет доступен пока DLL находится в памяти. Описывать такой класс необходимо со стилем CS_GLOBALCLASS. Для автоматической загрузки DLL есть ключи реестра куда помещаются DLL автоматически загружаемые вместе с приложением WIN 32:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\ 
CurrentVersion\Windows\APPINIT_DLLS

Кроме того Вы можете зарегистрировать свой класс в процессе инициализации приложения скажем с помощью LoadLibrary.

Вы можете создавать подклассы, используя функцию SetClassLong с индексом GCL_WNDPROC. Приложение может создать свои подклассы всех стандартных классов окон.

Для доступа к структуре класса окна есть несколько функций

GetClassLong 
GetWindowLong
SetClassLong
SetWindowLong

Для каждой из этих функций нужно задавать два параметра: указатель на окно и смещение к данным. Вот какие бывают смещения.

GCL_CURSOR 
GCL_HBRBACKGROUND
GCL_HICON
GWL_HINSTANCE
GWL_HWNDPARENT
GWL_ID
GWL_USERDATA

Получить данные GWL_HWNDPARENT можно и по другому, воспользовавшись функциями API, такой как GetParent например.

 
« Предыдущая статья   Следующая статья »