Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры печатать.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
379.36 Кб
Скачать

110 Разработка приложений Win32. Шаблон приложения win32swp. Особенности поддержки Win32 в win32swp.C. Функция WinMain(). Регистрация класса окна. Создание окна.

Компоненты приложения Windows

На самом высоком уровне мы можем разделить приложение Windows на две основные составляющие: функция WinMainO и функция окна. Microsoft Windows требует, чтобы главная процедура в программе на С называлась WinMainO. Эта функция выступает в качестве точки входа для приложения. Для обеспечения связи Windows требуется специальная функция, называемая функцией обратного вызова (callback function). Windows регистрирует функцию обратного вызова, а затем, при необходимости произвести над окном какую-либо операцию, вызывает ее.

Функция WinMain()

Каждое приложение Windows должно иметь функцию WinMainO. Функция WinMainO выполняет следующие действия:

  • Регистрирует все классы окна для приложения

  • Производит необходимую инициализацию

  • Создает и запускает цикл обработки сообщений приложения

  • Обращается к очереди сообщений приложения

  • Завершает приложение по получении сообщения WM_QUIT

WinMain() получает от Windows четыре параметра. В приложении 22SWA.C прототип функции WinMain() выглядит так:

int PASCAL WinMain(hInst,hPreInst,lpszCmdLine,nCmdShow)

HINSTANCE hInst,hPreInst;

LPSTR lpszCmdLine;

int nCmdShow;

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

Каждое окно, создаваемое в приложении Windows, должно принадлежать к какому-либо классу. Создаваемые вами окна могут иметь разнообразные стили, цвета, шрифты, расположение, заголовки, значки и так далее. Ресурсом, определяющим эти атрибуты, служит класс окна (window class). Как только приложение зарегистрировало класс окна, он становится доступным для всех программ, работающих под Windows. По этой причине вам надо будет следить, чтобы имена классов окна в различных приложениях не совпадали.

Класс окна — это, в сущности, структура данных.

В Windows существует несколько предопределенных классов окна, но большинство приложений определяет свои классы. Для регистрации класса необходимо объявить переменную типа WNDCLASS:

WNDCLASS wc22SWA;

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

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

Поле hIсоn определяет значок, который должен использоваться для представления окна в свернутом состоянии. Это поле может иметь нулевое значение.

Поле hCursor определяет курсор, который должен использоваться при нахождении мыши в рабочей области окна. Это поле также может иметь нулевое значение.

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

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

Поле IpszClassName содержит указатель на строку, заканчивающуюся нулем. Строка задает имя класса окна.

И др.

Как уже говорилось, приложению необходимо регистрировать класс окна лишь тогда, когда запускается его первый экземпляр. Приложение Windows может проверить, был ли до него запущен предыдущий экземпляр. Для этого надо проверить параметр hPreInst если он равен нулю, значит, данный экземпляр является первым экземпляром приложения. Таким образом, оператор if заполняет структуру WNDCLASS только в первом экземпляре приложения. Последний оператор if выполняет собственно регистрацию класса окна: дальний указатель на структуру окна передается в функцию RegisterClass(). При этом ближний указатель (&ws22SWA) автоматически приводится к дальнему, поскольку функция RegisterClass() требует в качестве аргумента дальний указатель. Если при регистрации класса происходит ошибка, функция RegisterClass() возвращает ноль, и приложение завершается.

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

В отличие от класса окна, определяющего общие атрибуты для группы окон, параметры функции CreateWindow() задают более подробную информацию, относящуюся только к данному окну. Эта дополнительная информация подразделяется на следующие категории: класс, заголовок, стиль, положение на экране, описатель окна-родителя, описатель меню, описатель экземпляра и 32 разряда дополнительной информации.