Класс окна приложения создается при запуске приложения функцией 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 например.