Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Razoryonov_2008_full.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.34 Mб
Скачать

5 Создание экземпляра оконного класса

После того как класс окна определен и зарегистрирован, приложение может создавать окна этого класса с использованием функции API CreateWindow().

HWND CreateWindow(

LPCTSTR lpClassName, // имя класса окна

LPCTSTR lpWindowName, // заголовок окна

DWORD dwStyle, // стиль окна

int x, // горизонтальная позиция окна

int y, // вертикальная позиция окна

int nWidth, // ширина окна

int nHeight, // высота окна

HWND hWndParent, // дескриптор родительского окна

HMENU hMenu, // дескриптор главного меню

HINSTANCE hInstance, // дескриптор приложения, создающего окно

LPVOID lpParam // указатель на дополнительную информацию

);

Функция возвращает дескриптор созданного окна либо NULL, если создать окно не удалось.

Многие параметры могут принимать значения по умолчанию или NULL. Если окно не имеет родительского окна, то параметр hWndParent должен быть равен NULL.

6 Динамические изменения свойств оконного класса

Дополнительная память в структуре класса окна

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

Для работы с этой дополнительной памятью предназначены функции SetClassLong, GetClassLong.

Функция SetClassLong заменяет указанное 32-разрядное (long) значение при заданном смещении в дополнительной памяти класса или в структуре WNDCLASSEX на класс, которому указанное окно принадлежит. 

Обратите внимание! на то, что эта функция была заменена функцией SetClassLongPtr. Чтобы написать код, который является совместимым и с 32-разрядными, и с 64-разрядными версиями Microsoft ® Windows ®, используйте SetClassLongPtr.

Синтаксис

DWORD SetClassLong(      

    HWND hWnd,

    int nIndex,

    LONG dwNewLong

);

Параметры

hWnd

[in] Дескриптор окна и, косвенно, класс которому окно принадлежит.

nIndex

[in] Устанавливает заменяемое 32-разрядное значение. Чтобы установить 32-разрядное значение  в дополнительную память класса, задайте  положительное, отсчитываемое от нуля смещение байта устанавливаемого значения. Допустимые значения находятся в диапазоне от нуля до числа байтов дополнительной памяти класса, минус четыре; например, если бы Вы определили 12 или больше байтов дополнительной памяти класса, значение  8 будет  индексом третьего 32-разрядноого целого числа. Чтобы установить любое другое значение из структуры WNDCLASSEX, установите одно из ниже перечисленных  значений.

 

Значение 

Предназначение

GCL_CBCLSEXTRA

Устанавливает размер дополнительной памяти, связанной с классом, в байтах.

GCL_CBWNDEXTRA

Устанавливает размер дополнительной памяти окна, связанной с каждым окном в классе, в байтах. Установка этого значения не изменяет число дополнительных байт, назначенных ранее. За информацией о том, как получить доступ к этой памяти, обратитесь к функции GetWindowLong.

GCL_HBRBACKGROUND

Заменяет дескриптор кисти фона, связанной с классом.

GCL_HCURSOR

Заменяет дескриптор курсора, связанного с классом.

GCL_HICON

Заменяет дескриптор значка, связанного с классом.

GCL_HICONSM

Заменяет дескриптор маленького значка, связанного с классом.

GCL_HMODULE

Заменяет дескриптор модуля, который зарегистрировал класс.

GCL_MENUNAME

Заменяет адрес строки с именем меню. Строка идентифицирует ресурс меню, связанный с классом.

GCL_STYLE

Заменяет данные о битах стиля класса окна.

GCL_WNDPROC

Заменяет адрес оконной процедуры связанной с классом .

dwNewLong

[in] Задает значение замены.

Возвращаемое значение

Если функция завершается успешно, возвращаемое значение - предыдущее значение определенного 32-разрядного целого числа. Если значение(величина) не было предварительно установлено, возвращаемое значение равняется нулю.

Если функция завершается ошибкой, возвращаемое значение равняется нулю. Чтобы получить дополнительную информацию об ошибке, вызовите GetLastError.

Замечания

Если Вы используете функцию SetClassLong и индекс GCL_WNDPROC, чтобы заменить оконную процедуру, оконная процедура должна соответствовать руководящим принципам, указанным в описании функции повторного вызова WindowProc.

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

Резервируйте дополнительную память класса, определяя ненулевое значение в члене cbClsExtra структуры WNDCLASSEX, используемой с функцией RegisterClassEx.

Используйте функцию SetClassLong осторожно. Например, можно изменить цвет фона класса, используя SetClassLong, но это изменение немедленно не перекрашивает все окна, принадлежащие классу.

Функция GetClassLong извлекает заданное 32-разрядное (long) значение из структуры WNDCLASSEX, связанной с указанным окном.

Синтаксис

DWORD GetClassLong(      

    HWND hWnd,

    int nIndex

);

Параметры

hWnd

[in] Дескриптор окна и, косвенно, класс которому окно принадлежит.

nIndex

[in] Устанавливает извлекаемое 32-разрядное значение. Чтобы извлечь 32-разрядное значение  из дополнительной памяти класса, задайте  положительное, отсчитываемое от нуля смещение байта извлекаемого значения. Допустимые значения находятся в диапазоне от нуля до числа байтов дополнительной памяти класса, минус четыре; например, если бы Вы определили 12 или больше байтов дополнительной памяти класса, значение  8 будет  индексом третьего 32-разрядноого целого числа. Чтобы извлечь любое другое значение из структуры WNDCLASSEX, установите одно из ниже перечисленных  значений.

 

Значение 

Предназначение

GCW_ATOM

Извлекает данные о значении АТОМА, которое уникально идентифицирует класс окна. Это - один и тот же атом, что и при  возвращении значения функцией RegisterClassEx.

GCL_CBCLSEXTRA

Извлекает размер дополнительной памяти, связанной с классом, в байтах.

GCL_CBWNDEXTRA

Извлекает размер дополнительной памяти окна, связанной с каждым окном в классе, в байтах. За информацией о том, как получить доступ к этой памяти, обратитесь к описанию функции GetWindowLong.

GCL_HBRBACKGROUND

Извлекает дескриптор кисти фона, связанной с классом.

GCL_HCURSOR

Извлекает дескриптор курсора, связанного с классом.

GCL_HICON

Извлекает  дескриптор значка, связанного с классом.

GCL_HICONSM

Извлекает дескриптор маленького значка, связанного с классом.

GCL_HMODULE

Извлекает дескриптор модуля, который зарегистрировал класс.

GCL_MENUNAME

Извлекает  адрес строки с именем меню. Строка идентифицирует ресурс меню, связанный с классом.

GCL_STYLE

Извлекает данные о битах стиля класса окна.

GCL_WNDPROC

Извлекает  адрес оконной процедуры, или дескриптора, обозначающего адрес оконной процедуры. Вы должны использовать функцию CallWindowProc, чтобы вызвать оконную процедуру.

Возвращаемое значение

Если функция завершается успешно, возвращаемое значение - затребованное 32-разрядная величина.

Если функция завершается ошибкой, возвращаемое значение равняется нулю. Чтобы получить дополнительную информацию об ошибке, вызовите GetLastError.

Замечания

Резервируйте дополнительную память класса, определяя ненулевое значение в члене cbClsExtra структуры WNDCLASSEX, используемой с функцией RegisterClassEx.

В процессе работы приложения узнать либо установить фон можно функциями:

COLORREF GetBkColor(

HDC hdc

);

Единственный параметр функции определяет окно, фон которого определяется. Возвращаемое значение есть 32-битное представление цвета фона.

COLORREF SetBkColor(

HDC hdc, // handle to DC

COLORREF crColor // background color value

);

Параметр hdc определяет контекст (логический объект системы Windows, который связан с физическим устройством и заменяет его в функциях вывода), а crColor новый цвет фона.

Во время работы приложение положение и размер окна можно изменить с помощью процедуры MoveWindow:

BOOL MoveWindow(

HWND hWnd,

int X,

int Y,

int nWidth,

int nHeight,

BOOL bRepaint

);

Она принимает дескриптор окна, новые координаты левого верхнего угла окна, новую ширину и высоту и состояние флага перерисовки.

Процедура SetWindowPos помимо вышеназванных действий может изменять Z – положение окна:

BOOL SetWindowPos(

HWND hWnd,

HWND hWndInsertAfter,

int X,

int Y,

int cx,

int cy,

UINT uFlags

);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]