Архитектура, управляемая событиями



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

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

Когда говорится: "Windows посылает программе сообщение," — имеется в виду, что Windows вызывает функцию внутри программы. Параметры этой функции описывают параметры сообщения. Эта функция, находящаяся в вашей программе для Windows, называется оконной процедурой (window procedure).

Оконная процедура

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

Более точно, окно всегда создается на основе "класса окна". Класс окна определяет оконную процедуру, обрабатывающую поступающие окну сообщения. Использование класса окна позволяет создавать множество окон на основе одного и того же класса окна и, следовательно, использовать одну и ту же оконную процедуру. Например, все кнопки во всех программах для Windows созданы на основе одного и того же класса окна. Этот класс связан с оконной процедурой (расположенной в динамически подключаемой библиотеке Windows), которая управляет процессом передачи сообщений всем кнопкам всех окон.

В объектно-ориентированном программировании любой "объект" несет в себе сочетание кода и данных. Окно — это объект. Код — это оконная процедура. Данные — это информация, хранимая оконной процедурой, и информация, хранимая системой Windows для каждого окна и каждого класса окна, которые имеются в системе.

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

Когда программа для Windows начинает выполняться, Windows строит для программы очередь сообщений (message queue). В этой очереди хранятся сообщения для любых типов окон, которые могли бы быть созданы программой. Небольшая часть программы, которая называется циклом обработки сообщений (message loop), выбирает эти сообщения из очереди и переправляет их соответствующей оконной процедуре. Другие сообщения отправляются непосредственно оконной процедуре, минуя очередь сообщений.

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

В файле имеются только две функции WinMain и WndProc.

WinMain – это точка входа в программу. Аналог стандартной функции main языка С.

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

В HELLOWIN.C отсутствуют инструкции для непосредственного вызова WndProc: WndProc вызывается только из Windows. Однако, в WinMain имеется ссылка на WndProc, поэтому эта функция описывается в самом начале программы, еще до определения WinMain.

Вызовы функций Windows

HELLOWIN вызывает не менее 17 функций Windows. Здесь перечислены эти функции в порядке их появления в программе (с кратким описанием каждой функции):

LoadIcon — загружает значок для использования в программе.

LoadCursor —- загружает курсор мыши для использования в программе.

GetStockObject — получает графический объект (в этом случае для закрашивания фона окна используется кисть).

RegisterClassEx — регистрирует класс окна для определенного окна программы.

Create Window — создает окно на основе класса окна.

Show Window — выводит окно на экран.

Update Window — заставляет окно перерисовать свое содержимое.

GetMessage — получает сообщение из очереди сообщений.

TranslateMessage — преобразует некоторые сообщения, полученные с помощью клавиатуры.

DispatchMessage — отправляет сообщение оконной процедуре.

PlaySound — воспроизводит звуковой файл.

BeginPaint — инициирует начало процесса рисования окна.

GetClientRect — получает размер рабочей области окна.

DrawText —- выводит на экран строку текста.

EndPaint — прекращает рисование окна.

PostQuitMessage — вставляет сообщение "завершить" в очередь сообщений.

DefWindowProc — выполняет обработку сообщений по умолчанию.

Эти функции описаны в документации или системе контекстной подсказки, поставляемой с вашим компилятором, а описаны они в различных заголовочных файлах из WINDOWS. H.


Дата добавления: 2018-02-28; просмотров: 312; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!