Учебное пособие: Подклассы окон
LONG GetWindowLong( hWnd, nOffset );
UINT SetWindowWord( hWnd, nOffset, wNewValue );
LONG SetWindowLong( hWnd, nOffset, dwNewValue );
UINT GetClassWord( hWnd, nOffset );
LONG GetClassLong( hWnd, nOffset );
UINT SetClassWord( hWnd, nOffset, wNewValue );
LONG SetClassLong( hWnd, nOffset, dwNewValue );
Параметр nOffset задает смещение требуемого слова (двойного слова) относительно начала дополнительных данных в байтах. Эти же функции могут применяться для доступа к некоторым полям самих структур, а не дополнительных данных, но при этом они имеют отрицательные значения.
Второй метод основан на применении специального списка свойств (property) окна. Этот список может динамически изменяться, но работа с ним медленее, чем с данными окна. Кроме того он размещается в локальной памяти модуля USER, поэтому ограничен размерами свободной памяти модуля USER.
Так как списки свойств размещаются не в нашем приложении, то перед уничтожением окна, мы должны удалить все внесенные нами свойства. Свойства состоят из имени (строка символов) и слова данных. Часто это слово рассматривается как хендл блока данных. Мы можем записывать читать, удалять и перебирать свойства, связанные с окном. Для этого предназначены следующие функции:
BOOL SetProp( hWnd, lpszName, hData );
HANDLE GetProp( hWnd, lpszName );
HANDLE RemoveProp( hWnd, lpszName );
int EnumProp( hWnd, lpfnEnumProc );
Хотя в документации данные, связанные с конктретным свойством, рассматриваются всегда как хендлы, но это не обязательно так. Конечно применение хендлов может несколько сократить размеры списка свойств за счет того, что одному элементу списка может соответствововать больше данных.
Так как Windows не знает, хендл какого блока данных (глобального или локального), объекта GDI или просто данные связан с конкретным элементом списка свойств, то при удалении записи эти данные не удаляются, а передаются Вам для их удаления.
Ресурсы приложения
На предыдущих лекциях мы довольно часто ссылались на такие ресурсы приложения, как курсоры и иконки, ранее мы познакомились более подробно с еще одной разновидностью ресурсов - битмапом. На примере битмапа мы рассмотрели основные правила применения ресурсов.
Сейчас несколько обобщим эти правила и рассмотрим несколько видов ресурсов более подробно. Для описания ресурсов мы должны сформировать файл описания ресурсов, имеющий расширение .RC. В этом файле перечисляются ресурсы, которые могут быть использованы приложением.
Описание ресурсов имеет следующий вид:
ResNameId TypeNameId [load-opt] [mem-opt] ResSource
Каждый ресурс должен иметь собственное уникальное имя или номер ResNameId и имя или номер типа ресурса TypeNameId.
Эти имена задаются либо текстом (имя), либо числом (номер), либо символическим именем (номер).
Примеры:
MYBITMAP BITMAP my_bmp.bmp
100 ICON my_ico.ico
MYDATA 500 my_data.dat
#define IconID 101
IconID ICON second.ico
(компилятор ресурсов может использовать директивы препроцессора C и включать заголовочные файлы .H, для задания символических имен).