Для чего необходимо регистрировать класс окна

Регистрация класса окна

Окно всегда создается на основе класса окна. Класс окна идентифицирует оконную процедуру, которая выполняет процесс обработки поступающих сообщений.

Перед созданием окна необходимо зарегистрировать класс окна, вызвав функцию RegisterClassEx, это расширенная версия функции Register-Class (Ex – extended – расширенный). Параметр функции – указатель на структуру типа WNDCLASSEX, определенную в заголовочных файлах:

typedef struct tagWNDCLASSEX <

> WNDCLASSEX;

Префиксы LP и lp означают «длинный указатель» (long pointer), приставка lpfn – «длинный указатель на функцию» (long pointer to a function); приставка cb – «счетчик байт» (counter of bytes); префикс hbr – это «описатель кисти» (handle to a brush).

Для работы WinMain необходимо определить эту структуру:

WNDCLASSEX wndclass;

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

Поле cbSize равно длине структуры. Инструкция:

wndclass.style = CS_HREDRAW | CS_VREDRAW;

осуществляет объединение двух идентификаторов «стиля класса» с помощью поразрядной операции «ИЛИ» (|). В заголовочных файлах Windows, идентификаторы, начинающиеся с префикса CS, задаются в виде 32-разрядной константы, только один из разрядов которой установлен в 1. Например, CS_VREDRAW (горизонтальный) – 0x0001, а CS_HREDRAW (вертикальный) – 0x0002 показывают, что все окна должны целиком перерисовываться при изменении размеров окна. Эти идентификаторы называют «поразрядными флагами» (bit flags).

Третье поле wndclass.lpfnWndProc = WndProc; устанавливает оконную процедуру данного окна.

Следующие две инструкции:

wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0;

резервируют дополнительное пространство, которое может быть использовано программой, в данной программе эта возможность не используется – значения равны 0, иначе в этом поле было бы установлено «число байт» резервируемой памяти.

В следующем поле – описатель экземпляра программы, который является одним из параметров WinMain:

wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);

wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION);

устанавливают значки (иконки), которые появляется на панели задач и в заголовке окна. Для получения описателя стандартного значка первый параметр устанавливается в NULL; при загрузке пользовательского значка этот параметр должен быть равен описателю экземпляра программы. Второй параметр определяется в заголовочных файлах, значок IDI_APPLICATION – это маленькое изображение окна. Функция LoadIcon возвращает описатель этого значка для полей wndclass.hIcon и wndclass.hIconSm, имеющих тип HICON («описатель значка» – handle to an icon).

Функция LoadCursorзагружает стандартный курсор IDC_ARROW и возвращает его описатель полю hCursor:

wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);

Поле hbrBackground задает цвет фона рабочей области окон (префикс hbr означает «описатель кисти» – handle to a brush). Кисть – графический объект, используемый для закрашивания области. В Windows имеется несколько стандартных кистей. В инструкции

wndclass.hbrBackground = GetStockObject (WHITE_BRUSH);

функция GetStockObject возвращает описатель белой кисти.

Следующее поле задает меню класса окна, т.к. в нашем случае оно отсутствует – поле установлено в NULL:

На последнем этапе классу должно быть присвоено имя, которое может совпадать с именем программы, хранящемся в переменной szAppName:

После того как инициализированы все поля структуры, регистрируем класс окна, вызывая функцию: RegisterClassEx (&wndclass);

Создание окна

Класс окна определяет основные характеристики окна, что позволяет использовать один и тот же класс для создания множества различных окон.

Функция CreateWindow создает окно, детализируя информацию о нем, которая должна передаваться функции в качестве параметров:

hwnd = CreateWindow (szAppName, – имя класса окна;

«First Example», – заголовок окна;

WS_OVERLAPPEDWINDOW, – стиль окна;

CW_USEDEFAULT, – начальное положение по x

CW_USEDEFAULT, и по y;

CW_USEDEFAULT, – начальные размеры по x

CW_USEDEFAULT, и по y;

NULL, – описатель родительского окна;

NULL, – описатель меню окна;

hInstance, – описатель экземпляра программы;

NULL); – параметры создания.

Параметр «имя класса окна» – szAppName содержит строку «Hello», являющуюся именем зарегистрированного класса окна, этот параметр связывает окно с классом окна.

Окно, созданное программой, является обычным перекрывающимся окном с заголовком, системным меню слева на строке заголовка, иконками для сворачивания, разворачивания и закрытия окна.

WS_OVERLAPPEDWINDOW – стандартный «стиль окна»; «заголовок окна» – текст, который выводится в строке заголовка.

Параметры «начальное положение по x и по y» задают начальные координаты верхнего левого угла окна относительно левого верхнего угла экрана; идентификатор CW_USEDEFAULT задает по умолчанию начальное положение для перекрывающегося окна; аналогично задаются значения параметров «начальные размеры по x и по y».

Поскольку у нашего окна отсутствует родительское окно, параметр «описатель родительского окна» – NULL; аналогично «описатель меню окна» – NULL (у окна нет меню).

В параметр «описатель экземпляра программы» помещается описатель экземпляра, переданный программе в качестве параметра функции WinMain.

Значение «параметры создания» установлено в NULL, при необходимости этот параметр используется в качестве указателя на данные, к которым программа в дальнейшем могла бы обратиться.

Функция CreateWindow возвращает описатель созданного окна, который хранится в переменной hwnd типа. У каждого окна в Windows имеется его описатель, который используется для ссылки на это окно. При создании нескольких окон каждое из них имеет свой описатель, являющийся одним из важнейших, которыми оперирует программа для Windows.

Для многих функций Windows в качестве параметра требуется hwnd, благодаря чему Windows знает, к какому окну применить эту функцию.

Отображение окна

К тому времени, когда функция CreateWindow возвращает управление программе, окно уже создано внутри Windows, однако на экране монитора оно еще не появилось. Выводит окно на экран функция

ShowWindow (hwnd, iCmdShow);

параметр hwnd – описатель созданного окна; параметр iCmdShow – задает начальный вид окна на экране: SW_SHOWNORMAL (1) – на экран выводится обычное окно, фон рабочей области закрашивается заданной в классе окна кистью; SW_SHOWMINNOACTIVE (7) – окно не выводится, а на панели задач появляются его имя и иконка.

Функция UpdateWindow (hwnd); выполняет перерисовку рабочей области окна, посылая сообщение WM_PAINT в оконную процедуру (WndProc).

Дата добавления: 2016-09-20 ; просмотров: 612 ; ЗАКАЗАТЬ НАПИСАНИЕ РАБОТЫ

Источник

Почему необходимо регистрировать класс в программировании Windows API?

Я хотел бы спросить, почему при разработке графических интерфейсов Windows с использованием API необходимо регистрировать класс окна? Какова концепция этого?

Я уже прочитал первые 3 главы Программирование Windows Чарльз Петцольд, но мне все еще интересно, какова цель явной регистрации класса. Почему я хочу сделать это явно? Почему это не делается в фоновом режиме, например, в функции CreateWindow () (или CreateWindowEx ())? Я имею в виду, почему код, который RegisterClass () выполняет внутри CreateWindow (), или почему CreateWindow () не вызывает сам RegisterClass ()?

Я также читал документацию по MSDN и знаю, что функция RegisterClass () связывает оконную процедуру с классом окна, заполняя структуру WNDCLASS. Я знаю, что это функция, которая обрабатывает сообщения от ОС, однако зачем регистрировать эту функцию (функцию WinProc) в классе внутри отдельной функции от CreateWindow ()?

Я могу понять причины существования функции CreateWindow () и почему она не показывает автоматически созданное окно. Это подразумевает, что я также понимаю назначение функции ShowWindow ().

Я уверен, что должны быть веские причины для такого поведения, чтобы программист мог зарегистрировать класс, когда он этого хочет, я просто не вижу этих причин, и поэтому я прошу вас, ребята, пролить свет на эту тему.

Пожалуйста, имейте в виду, что я очень новичок в разработке GUI с Windows API. Я сделал несколько графических интерфейсов в MATLAB, которые отличались от Windows API, и все же позволили мне понять некоторые принципы Windows, в частности назначение функций обратного вызова. Я не знаю, полезна ли эта информация, но если вам нужно провести аналогии, пожалуйста, будьте моим гостем.

Решение

Поскольку вы пометили свой вопрос на C ++, я приведу аналогию с C ++ …

RegisterClass в основном вы определяете класс и включаете его в свою программу (очень похоже на #include в C ++). WNDPROC Ваш обработчик для всего, что происходит в окне, если и когда создается экземпляр.

CreateWindow концептуально так же, как вы делаете new в C ++. Вы просите Windows создать новое окно, и вы должны указать тип окна. Windows включает в себя набор предопределенных окон, таких как Button или Edit, но если вы хотите создать экземпляр своего собственного окна, то это нормально, вам просто нужно указать ему «класс», который вы хотите создать. Вы уже зарегистрировали этот класс по телефону RegisterClass Таким образом, Windows теперь может перейти непосредственно к определению и создать экземпляр вашего окна.

Другие решения

Еще один способ думать, потому что Windows является закрытым исходным кодом, поэтому разработчики API не хотят, чтобы вы много знали внутри API. Так что теперь они думают: «Что если пользователь захочет создать свой собственный класс окна со своим поведением?». Вот почему WNDCLASS создан для того, чтобы пользователи могли объявлять информацию нужного им класса, присваивая такие значения, как имена, процедуры в поле члена. Это что-то вроде заполнения формы. Таким образом, вы можете видеть, что разработчики API достигают 2 вещей:

(1) пользователи ничего не знают об API, так как они явно не расширяют классы API до пользовательских, потому что если они это делают, то разработчики API должны предоставлять заголовки классов, и пользователи могут испортить это, делая Windows больше не закрыт.

(2) пользователи по-прежнему могут определять свои собственные классы окон.

Теперь, после того как вы определили свой собственный класс окна и хотите использовать его, вам нужно зарегистрировать этот класс, чтобы ОС Windows знала, что это за класс, чтобы они могли хранить информацию о нем для дальнейшей необходимости, а затем вы можете создать экземпляр этого.

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

Как вы можете представить окно без всех этих свойств?

Может быть, вы спросите, почему все эти свойства окна не являются параметрами функции CreateWindow, поэтому я установил их с помощью функции CreateWindow, а не функции RegisterClass, верно?

Если все свойства окна являются параметрами функции CreateWindow, то функция CreateWindow очень сложно и строка, которая вызывает CreateWindow правильно, очень длинный.

Это делает код очень большим, менее читаемым и менее продуктивным.

RegisterClass значительно упрощает CreateWindow.

Это одна из причин, по которой Microsoft хочет, чтобы разработчики Win32 сначала вызывали RegisterClass перед CreateWindow.

Также предположим, что вы хотите по крайней мере два окна с так же свойства.

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

RegisterClass не только значительно упрощает и сокращает код, но также предотвращает дублирование одного и того же кода. большой код в CreateWindow.

RegisterClass также делает код более продуктивным.

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

Хотя вам нужно вызывать RegisterClass несколько раз, если вы хотите, чтобы окна с разные свойства конечно.

Вам также придется изменять экземпляр WNDCLASS перед каждым вызовом функции RegisterClass.

Источник

Регистрация класса окна

Окно всегда создается на основе класса окна. Класс окна идентифицирует оконную процедуру, которая выполняет процесс обработки поступающих сообщений.

Перед созданием окна необходимо зарегистрировать класс окна, вызвав функцию RegisterClassEx, это расширенная версия функции Register-Class (Ex – extended – расширенный). Параметр функции – указатель на структуру типа WNDCLASSEX, определенную в заголовочных файлах:

typedef struct tagWNDCLASSEX <

> WNDCLASSEX;

Префиксы LP и lp означают «длинный указатель» (long pointer), приставка lpfn – «длинный указатель на функцию» (long pointer to a function); приставка cb – «счетчик байт» (counter of bytes); префикс hbr – это «описатель кисти» (handle to a brush).

Для работы WinMain необходимо определить эту структуру:

WNDCLASSEX wndclass;

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

Поле cbSize равно длине структуры. Инструкция:

wndclass.style = CS_HREDRAW | CS_VREDRAW;

осуществляет объединение двух идентификаторов «стиля класса» с помощью поразрядной операции «ИЛИ» (|). В заголовочных файлах Windows, идентификаторы, начинающиеся с префикса CS, задаются в виде 32-разрядной константы, только один из разрядов которой установлен в 1. Например, CS_VREDRAW (горизонтальный) – 0x0001, а CS_HREDRAW (вертикальный) – 0x0002 показывают, что все окна должны целиком перерисовываться при изменении размеров окна. Эти идентификаторы называют «поразрядными флагами» (bit flags).

Третье поле wndclass.lpfnWndProc = WndProc; устанавливает оконную процедуру данного окна.

Следующие две инструкции:

wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0;

резервируют дополнительное пространство, которое может быть использовано программой, в данной программе эта возможность не используется – значения равны 0, иначе в этом поле было бы установлено «число байт» резервируемой памяти.

В следующем поле – описатель экземпляра программы, который является одним из параметров WinMain:

wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);

wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION);

устанавливают значки (иконки), которые появляется на панели задач и в заголовке окна. Для получения описателя стандартного значка первый параметр устанавливается в NULL; при загрузке пользовательского значка этот параметр должен быть равен описателю экземпляра программы. Второй параметр определяется в заголовочных файлах, значок IDI_APPLICATION – это маленькое изображение окна. Функция LoadIcon возвращает описатель этого значка для полей wndclass.hIcon и wndclass.hIconSm, имеющих тип HICON («описатель значка» – handle to an icon).

Функция LoadCursorзагружает стандартный курсор IDC_ARROW и возвращает его описатель полю hCursor:

wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);

Поле hbrBackground задает цвет фона рабочей области окон (префикс hbr означает «описатель кисти» – handle to a brush). Кисть – графический объект, используемый для закрашивания области. В Windows имеется несколько стандартных кистей. В инструкции

wndclass.hbrBackground = GetStockObject (WHITE_BRUSH);

функция GetStockObject возвращает описатель белой кисти.

Следующее поле задает меню класса окна, т.к. в нашем случае оно отсутствует – поле установлено в NULL:

На последнем этапе классу должно быть присвоено имя, которое может совпадать с именем программы, хранящемся в переменной szAppName:

После того как инициализированы все поля структуры, регистрируем класс окна, вызывая функцию: RegisterClassEx (&wndclass);

Создание окна

Класс окна определяет основные характеристики окна, что позволяет использовать один и тот же класс для создания множества различных окон.

Функция CreateWindow создает окно, детализируя информацию о нем, которая должна передаваться функции в качестве параметров:

hwnd = CreateWindow (szAppName, – имя класса окна;

«First Example», – заголовок окна;

WS_OVERLAPPEDWINDOW, – стиль окна;

CW_USEDEFAULT, – начальное положение по x

CW_USEDEFAULT, и по y;

CW_USEDEFAULT, – начальные размеры по x

CW_USEDEFAULT, и по y;

NULL, – описатель родительского окна;

NULL, – описатель меню окна;

hInstance, – описатель экземпляра программы;

NULL); – параметры создания.

Параметр «имя класса окна» – szAppName содержит строку «Hello», являющуюся именем зарегистрированного класса окна, этот параметр связывает окно с классом окна.

Окно, созданное программой, является обычным перекрывающимся окном с заголовком, системным меню слева на строке заголовка, иконками для сворачивания, разворачивания и закрытия окна.

WS_OVERLAPPEDWINDOW – стандартный «стиль окна»; «заголовок окна» – текст, который выводится в строке заголовка.

Параметры «начальное положение по x и по y» задают начальные координаты верхнего левого угла окна относительно левого верхнего угла экрана; идентификатор CW_USEDEFAULT задает по умолчанию начальное положение для перекрывающегося окна; аналогично задаются значения параметров «начальные размеры по x и по y».

Поскольку у нашего окна отсутствует родительское окно, параметр «описатель родительского окна» – NULL; аналогично «описатель меню окна» – NULL (у окна нет меню).

В параметр «описатель экземпляра программы» помещается описатель экземпляра, переданный программе в качестве параметра функции WinMain.

Значение «параметры создания» установлено в NULL, при необходимости этот параметр используется в качестве указателя на данные, к которым программа в дальнейшем могла бы обратиться.

Функция CreateWindow возвращает описатель созданного окна, который хранится в переменной hwnd типа. У каждого окна в Windows имеется его описатель, который используется для ссылки на это окно. При создании нескольких окон каждое из них имеет свой описатель, являющийся одним из важнейших, которыми оперирует программа для Windows.

Для многих функций Windows в качестве параметра требуется hwnd, благодаря чему Windows знает, к какому окну применить эту функцию.

Отображение окна

К тому времени, когда функция CreateWindow возвращает управление программе, окно уже создано внутри Windows, однако на экране монитора оно еще не появилось. Выводит окно на экран функция

ShowWindow (hwnd, iCmdShow);

параметр hwnd – описатель созданного окна; параметр iCmdShow – задает начальный вид окна на экране: SW_SHOWNORMAL (1) – на экран выводится обычное окно, фон рабочей области закрашивается заданной в классе окна кистью; SW_SHOWMINNOACTIVE (7) – окно не выводится, а на панели задач появляются его имя и иконка.

Функция UpdateWindow (hwnd); выполняет перерисовку рабочей области окна, посылая сообщение WM_PAINT в оконную процедуру (WndProc).

Дата добавления: 2016-01-09 ; просмотров: 507 ; ЗАКАЗАТЬ НАПИСАНИЕ РАБОТЫ

Источник

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

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

В этом разделе рассматриваются следующие темы.

Типы классов окон

Существует три типа классов окон:

Эти типы различаются в области и в случаях, когда и как они регистрируются и уничтожаются.

Системные классы

Системный класс — это класс окна, зарегистрированный системой. Многие системные классы доступны для использования всеми процессами, а другие используются только внутри системы. Поскольку система регистрирует эти классы, процесс не может уничтожить их.

система регистрирует системные классы для процесса в первый раз, когда один из его потоков вызывает функцию пользователя или Windows интерфейс графических устройств (GDI).

Каждое приложение получает собственную копию системных классов. все 16-разрядные приложения на основе Windows в одном и том же классе общей системы VDM, как и в 16-разрядных Windows.

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

КлассОписание
КнопкаКласс для кнопки.
ComboBoxКласс для поля со списком.
ИзменитьКласс для элемента управления «поле ввода».
ListBoxКласс для поля со списком.
мдиклиентКласс для клиентского окна MDI.
ScrollBarКласс для полосы прокрутки.
СтатическийКласс для статического элемента управления.

В следующей таблице описаны системные классы, доступные только для использования системой. Они перечислены здесь для полноты.

КлассОписание
комболбоксКласс для списка, содержащийся в поле со списком.
ддемлевенткласс для событий платформа динамических данных Exchange библиотеки управления (ддемл).
MessageКласс для окна, в котором только сообщения.
#32768Класс для меню.
#32769Класс для окна рабочего стола.
#32770Класс для диалогового окна.
#32771Класс для окна переключения задач.
#32772Класс для заголовков значков.

Глобальные классы приложений

HKey _ _ \ программное обеспечение \ Microsoft \ Windows NT \ CurrentVersion \ на локальном компьютере Windows

Локальные классы приложения

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

Как система находит класс окна

Система содержит список структур для каждого из трех типов классов окон. Когда приложение вызывает функцию CreateWindow или CreateWindowEx для создания окна с указанным классом, система использует следующую процедуру для нахождение класса.

Все окна, созданные приложением, используют эту процедуру, включая Windows, созданную системой от имени приложения, например диалоговые окна. Можно переопределить системные классы, не затрагивая другие приложения. Это значит, что приложение может зарегистрировать локальный класс приложения с тем же именем, что и системный класс. Этот класс System заменяется в контексте приложения, но не мешает другим приложениям использовать класс System.

Регистрация класса окна

Если вы регистрируете класс Window, используя версию ANSI RegisterClassEx, регистерклассекса, приложение запрашивает передачу текстовых параметров сообщений в окна созданного класса, используя кодировку ANSI. Если вы регистрируете класс с помощью версии Юникода RegisterClassEx, регистерклассексв, приложение запрашивает передачу текстовых параметров сообщений в окна созданного класса, используя кодировку Юникода. Функция исвиндовуникоде позволяет приложениям запрашивать характер каждого окна. Дополнительные сведения о функциях ANSI и Unicode см. в разделе соглашения для прототипов функций.

Элементы класса Window

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

Имя класса

Функция className возвращает имя класса, которому принадлежит заданное окно.

Адрес процедуры окна

Маркер экземпляра

Курсор класса

Значки классов

Значок класса — это изображение, используемое системой для представления окна определенного класса. Приложение может иметь два значка класса — один крупный и один маленький. Система отображает значок крупного класса окна в окне переключения задач, которое появляется, когда пользователь нажимает ALT + TAB и в представлениях крупных значков панели задач и обозревателя. Значок небольшого класса появляется в строке заголовка окна и в представлениях мелких значков панели задач и обозревателя.

Если приложение устанавливает для элементов Хикон и Хиконсм структуры вндклассекс значение NULL, система использует значок приложения по умолчанию в качестве крупных и мелких значков классов для класса Window. Если указать значок крупного класса, но не маленький, система создает маленький значок класса, основанный на большом размере. Однако если указать маленький значок класса, но не большой, система будет использовать значок приложения по умолчанию в качестве значка крупного класса и указанный значок в качестве значка небольшого класса.

Кисть фона класса

Кисть фона класса подготавливает клиентскую область окна для последующего рисования приложением. Система использует кисть для заполнения клиентской области сплошным цветом или узором, тем самым удаляя все предыдущие изображения из этого расположения независимо от того, принадлежат ли они к окну или нет. Система уведомляет окно о том, что его фон следует отрисовывать, отправив сообщение WM _ ерасебкгнд в окно. Дополнительные сведения см. в разделе кисти.

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

В системе не требуется, чтобы класс окна имел кисть для фона класса. Если этот параметр имеет значение null, то при получении сообщения WM _ ерасебкгнд окно должно рисовать собственный фон.

Меню класса

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

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

В системе не требуется меню класса. Если приложение устанавливает для элемента лпсзменунаме структуры вндклассекс значение NULL, в Windows в классе нет строк меню. Даже если меню класс не задано, приложение по-прежнему может определить строку меню для окна при создании окна.

Если для класса задано меню и создано дочернее окно этого класса, меню игнорируется. Дополнительные сведения см. в разделе меню.

Стили класса

Классы и контексты устройств

Контекст устройства — это специальный набор значений, которые используются приложениями для рисования в клиентской области окна. Система требует наличия контекста устройства для каждого окна на экране, но обеспечивает некоторую гибкость в том, как система хранит и обрабатывает контекст устройства.

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

Чтобы избежать извлечения контекста устройства каждый раз, когда ему требуется закрашивать внутри окна, приложение может указать стиль _ овндк CS для класса Window. Этот стиль класса направляет систему для создания частного контекста устройства, то есть для выделения уникального контекста устройства для каждого окна в классе. Приложению требуется только получить контекст, а затем использовать его для всех последующего рисования.

Память дополнительного класса

Система поддерживает внутреннюю структуру вндклассекс для каждого класса окон в системе. Когда приложение регистрирует класс окна, оно может направить систему на выделение и добавление в конец структуры вндклассекс нескольких дополнительных байтов памяти. Эта память называется дополнительной памятью класса и является общей для всех окон, принадлежащих классу. Используйте память дополнительного класса для хранения любой информации, относящейся к классу.

Поскольку дополнительный объем памяти выделяется из локальной кучи системы, приложение должно использовать память дополнительного класса с осторожностью. Функция RegisterClassEx завершается ошибкой, если объем запрашиваемой памяти дополнительного класса превышает 40 байт. Если приложению требуется более 40 байт, он должен выделить собственную память и сохранить указатель на память в дополнительной памяти класса.

Размер дополнительной памяти окна

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

Поскольку дополнительный объем памяти выделяется из локальной кучи системы, приложение должно использовать лишние окна памяти с осторожностью. Функция RegisterClassEx завершается ошибкой, если объем требуемой дополнительной памяти превышает 40 байт. Если приложению требуется более 40 байт, он должен выделить собственную память и сохранить указатель на память в дополнительной памяти окна.

Функция SetWindowLong копирует значение в лишнюю память. Функция жетвиндовлонг извлекает значение из дополнительной памяти. Элемент кбвндекстра структуры вндклассекс указывает объем дополнительной памяти окна, выделяемой для выделения. Приложение, которое не использует память, должно инициализировать кбвндекстра до нуля.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *