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

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

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

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

typedef struct tagWNDCLASSEX {

UINT cbSize;

UINT style;

WNDPROC lpfnWndProc;

int cbClsExtra;

int cbWndExtra;

HINSTANCE hInstance;

HICON hIcon;

HCURSOR hCursor;

HBRUSH hbrBackground;

LPCSTR lpszMenuName;

LPCSTR lpszClassName;

HICON hIconSm;

} 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.hInstance = hInstance;

Инструкции

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:

wndclass.lpszMenuName=NULL;

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

wndclass.lpszClassName=szAppName;

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