Программирование устройств в Windows: Методические указания к выполнению практических и лабораторных работ по курсу “Операционные системы, среды и оболочки”, страница 4

3.2 Регистрация

Рассмотрим функцию Register. Структура WNDCLASS лежит в основе всех процедур Register. Теперь можно посмотреть, какие именно опции доступны  при регистрации окна:

1)  style. Изменяя это поле, можно радикально изменять внешний вид окна.

2)  WndProc. Используется для указания имени и адреса оконной процедуры.

3)  cbClsExtra, cbWndExtra. Существуют ли еще какие-либо другие дополнительные данные, которые должны быть ассоциированы с классом окна или копией приложения.

4)  hinstance. Уникальный дескриптор приложения.

5)  hIcon. Пиктограмма окна, если таковая существует.

6)  hCursor. Форма курсора окна, если таковой имеется.

7)  hbrBackground. Цвет окна.

8)  IpszMenuName. Меню окна.

9)  IpszClassName. Имя класса окна.

В WINDOW1.CPP поле стиля принимает значения CS_HREDRAW и CS_VREDRAW. Эти две константы определяют, что окно перерисовывается, как только изменится его вертикальный или горизонтальный размеры. Наличие этих двух констант гарантирует, что содержимое окна всегда отчетливо видно пользователю.

Разумеется, типичная Windows-программа не пойдет далеко, если не назначить оконную процедуру в поле IpfnWndProc. Следующие два поля структуры WNDCLASS не представляют важности на данном этапе. параметры CbClsExtra и cbWndExtra просто дают возможность зарезервировать некоторое количество памяти для хранения информации, касающейся нашего окна.

Следующий шаг — присвоить полю hinstance дескриптор нашего приложения. Поля hIcon, hCursor, hbrBackground, IpszMenuName описывают обычные возможности окна. Параметр IDI_APPLICATION можно определить в качестве пиктограммы, также можно назначить IDI_EXCLAMATION или IDI_HAND.

После того как запустим приложение, можно минимизировать его, и увидим, что оно имеет другую пиктограмму.

Можно проделать то же  с курсором, подставляя IDC_WAIT, IDC_CROSS или IDCJBEAM вместо IDC_ARROW. Если захотим изменить цвет фона окна, просто подставим BLACK_BRUSH или GRAY_BRUSH вместо WHITE_BRUSH. Все эти константы определяются в справочнике WINDOWS. H и детально перечисляются в любом  другом справочнике.

Поле IpszClassName позволяет присвоить имя нашему окну. Это очень важное действие, поскольку под этим именем  окно будет регистрироваться. Еще необходимо сообщить эту информацию Windows, вызвав Register-Class и передав адрес структуры WNDCLASS.

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

Процедура Register определяет общий класс окна, a процедура Create — конкретный экземпляр класса окна. Суть этой функции — обращение к CreateWindow, зависящей от 11 параметров. Константа CW_USEDEFAULT предписывает Windows самой выбрать координаты окна.

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

Функция ShowWindow посылает в Windows команду nCmdShow, вынуждая ее, таким образом, визуально отобразить окно в определенном состоянии, то есть минимизированном, максимизированном или нормальном. Функция UpdateWindow предписывает Windows послать сообщение WM_PAINT окну, только что появившемуся на экране.

Функции ShowWindow, и UpdateWindow имеют параметр hWindow. В данном случае hWindow фактически является дескриптором основного окна приложения. Дело в том, что на рабочем столе можно открыть несколько окон одновременно, но текущая цель — показать только что созданное окно. Следовательно, необходимо передать дескриптор этого окна, чтобы Windows знала, какой объект требуется показать.

Прежде чем будет вызвана оконная процедура обработки сообщений по умолчанию, функция WndProc может сама ответить на большинство из них. WINDOW1 — пример минимальной программы для Windows, поэтому здесь необходимо ответить только на сообщение, говорящее о том, что главное окно собирается закрыться. Макрос HANDLE_MSG анализирует параметры, передающиеся в WndProc, и посылает лишь необходимые из них в функцию обработки сообщения WМ_OnDestroy.