Дополнительная память в структуре класса окна
При регистрации класса окна вы можете в поле cbClsExtra структуры WNDCLASS указать размер дополнительной области памяти, которая будет зарезервирована в структуре данных, описывающей класс окна. В эту область можно записать данные, предназначенные для использования всеми окнами, создаваемыми на базе класса.
Для работы с этой дополнительной памятью предназначены функции SetClassWord, SetClassLong, GetClassWord, GetClassLong.
Функция SetClassWord устанавливает в структуре, описывающей класс для окна hwnd, новое значение wNewWord, при этом смещение устанавливаемого слова определяется параметром offset:
WORD WINAPI SetClassWord(HWND hwnd, int offset, WORD wNewWord);
Для параметра offset вы должны использовать значения от нуля до указанного в поле cbClsExtra минус 2 или следующие значения:
Значение | Описание |
GCW_HBRBACKGROUND | Идентификатор кисти для закрашивания фона окна |
GCW_HCURSOR | Идентификатор курсора |
GCW_HICON | Идентификатор пиктограммы |
GCW_STYLE | Стили окна |
С помощью перечисленных выше четырех значений вы можете изменить характеристики класса окна. Эти изменения будут учитываться только для вновь создаваемых окон.
В случае ошибки функция SetClassWord возвращает нулевое значение.
Функция GetClassWord позволяет вам прочитать содержимое слова дополнительной области памяти со смещением offset:
WORD WINAPI GetClassWord(HWND hwnd, int offset);
Для этой функции вы можете использовать те же значения, что и для предыдущей, плюс еще два:
Значение | Описание |
GCW_CBCSLEXTRA | Размер дополнительной области памяти в структуре класса окна |
GCW_CBWNDEXTRA | Размер дополнительной области памяти в структуре окна |
GCW_HBRBACKGROUND | Идентификатор кисти для закрашивания фона окна |
GCW_HCURSOR | Идентификатор курсора |
GCW_HICON | Идентификатор пиктограммы |
GCW_STYLE | Стили окна |
Функция GetClassWord возвращает значение указанного слова из структуры класса окна или нулевое значение при ошибке.
Функция SetClassLong аналогична функции SetClassWord, но работает с двойными словами:
LONG WINAPI SetClassLong(HWND hwnd, int offset, LONG nVal);
Для параметра offset дополнительно можно указать значение GCL_WNDPROC, при этом функция заменит адрес функции окна. Мы пользовались этим приемом в приложении SMARTPAD, перехватывая управление у стандартной функции окна органа управления класса "edit".
В случае ошибки функция SetClassLong возвращает нулевое значение.
С помощью функции GetClassLong вы можете получить из структуры класса окна значение двойного слова, расположенного со смещением offset:
LONG WINAPI GetClassLong(HWND hwnd, int offset);
Для этой функции можно указать положительное смещение или одну из двух констант - GCL_WNDPROC и GCL_MENUNAME. В первом случае функция GetClassLong возвратит адрес функции окна для данного класса, во втором - указатель на строку имени меню, указанного при регистрации класса.