Файл: 15. Основы разработки событийно-управляемых программ в среде Windows.pdf
Добавлен: 20.10.2018
Просмотров: 1200
Скачиваний: 5
15. Основы разработки событийно-управляемых программ в среде
Windows
Технология создания приложений для современных многозадачных ОС
тесно связана с особенностями таких систем. Поскольку в системе
одновременно выполняется несколько приложений и все они претендуют на
одни и те же ресурсы, то сама операционная система должна отслеживать
использование ресурсов. Приложение не должно непосредственно
использовать внешние устройства. Любая работа приложения должна
контролироваться операционной системой. Поэтому для реализации всех
необходимых действий приложению предоставляется богатый набор
стандартных системных API-функций, использование которых и составляет
первую важнейшую особенность разработки приложений.
В частности, системы семейства Windows предлагают разработчикам
около 2000 таких функций, часть которых используется только в
узкоспециализированных целях. Набор данных функций часто обозначается
термином Win32 API. Важнейшие из этих функций собраны в трех основных
модулях:
В файле krnl32.dll собраны основные системные функции ядра:
управление памятью, управление процессами и потоками, управление
основными устройствами, управление файлами (около 300 функций).
В файле user32.dll собраны функции, необходимые для поддержки
многооконного пользовательского интерфейса (около 200 функций).
В файле GDI32.dll собраны функции, отвечающие за графический
вывод (GDI: Graphic Device Interface, Интерфейс Графического
Устройства), их около 150 штук.
Кроме этих трех базовых модулей существует несколько десятков
дополнительных модулей (файлы с расширением .dll), которые реализуют
различные дополнительные функции.
Набор API-функций позволяет создать два типа Windows-
приложений:
простейшие консольные приложения, не использующие графические
окна и ориентированные на ввод с клавиатуры и вывод на текстовый
экран; соответствующие программы получаются очень компактными,
но использование их весьма ограничено;
оконные приложения с полноценным графическим пользовательским
интерфейсом; практически весь дальнейший материал ориентирован
именно на эту группу приложений.
Еще одной важной особенностью современных операционных систем
является то, что они реализуют централизованную обработку возникающих
в системе событий. Другими словами, сама система следит за
возникающими при работе приложений событиями. В силу этого
принципиально изменяется структура прикладных программ. Работа
прикладной программы управляется потоком поступающих в нее событий,
поэтому такие программы принято называть событийно-управляемыми.
В системах Windows наравне с термином “событие” (event) широко
используется другое понятие – “сообщение” (message). Сообщение – это
небольшая структура данных, которая содержит основные параметры
произошедшего события. Любое сообщение содержит 6 полей, каждое по 4
байта. Наиболее важными являются первые 4 поля:
целочисленный код (так называемый дескриптор) окна, которому
предназначено данное сообщение;
целочисленный код самого сообщения; все стандартные сообщения
пронумерованы
целыми
числами,
которые
для
удобства
программирования заменены символьными константами вида
wm_*****; в системе Windows насчитывается несколько сотен
стандартных сообщений;
поле, несущее дополнительную информацию о событии, например, код
нажатой клавиши; это поле имеет специальное обозначение wParam.
еще одно поле с дополнительной информацией о сообщении; это поле
обозначается как LParam
Все многообразие событий/сообщений можно разбить на несколько групп,
наиболее важными из которых являются следующие:
оконные сообщения возникают при любых манипуляциях с окном,
например:
o wm_Create – возникает при создании окна;
o wm_Size – возникает при изменении размеров окна;
o wm_Move – возникает при перемещении окна;
клавиатурные события (например, wm_KeyDown или wm_KeyUp
связаны с вводом данных с клавиатуры;
“мышиные” события используются для обработки соответствующих
действий пользователя, например:
o wm_LbuttonDown возникает при нажатии левой кнопки мыши;
o wm_MouseMove возникает при перемещении мыши.
Взаимодействие Windows-приложений с операционной системой
основано на использовании механизма событий/сообщений, реализованного
на уровне ядра системы. Работа этого механизма может быть описана
следующими основными шагами.
шаги 1 и 2 выполняются системой и включают в себя:
o
инициированное внешним устройством (клавиатура, мышь) событие
обрабатывается драйвером и оформляется в виде сообщения,
которое поступает в общую системную очередь сообщений,
поддерживаемую самой системой;
o
из общей очереди сообщений операционная система распределяет
эти сообщения по очередям отдельных приложений;
шаг 3 выполняется приложением и включает в себя выбор сообщения
из начала своей очереди; для этого в приложении создается
специальный программный фрагмент – цикл обработки сообщений
(ЦОС); этот фрагмент является обязательным для любого оконного
Windows-приложения; ЦОС запускается при старте приложения и
завершает работу при закрытии приложения; выбор сообщения из
очереди говорит лишь о намерении приложения обработать это
сообщение, но далеко не всегда приводит к немедленной обработке
данного сообщения; о своем намерении приложение в лице ЦОС
сообщает системе, которая запускает эту обработку, когда сочтет
нужным (если нет более срочной работы), поэтому следующий шаг 4
выполняется опять системой;
шаг 4: для обработки выбранного приложением сообщения система
вызывает еще один специальный и очень важный фрагмент
приложения – так называемую оконную функцию (ОФ), передавая ей
параметры сообщения; особенностью ОФ для программиста является
то, что в приложении она обязательно должна быть реализована как
подпрограмма, но нигде в приложении эта подпрограмма явно не
вызывается; поскольку ОФ вызывается системой, то она называется
функцией обратного вызова (callback function), в отличие от “прямых”
вызовов системных функций приложением;
шаг 5: после того, как ОФ приложения получает управление от ОС, она
наконец приступает к обработке сообщения; ОФ является главным
компонентом при написании Windows-программы; она представляет
собой набор обработчиков тех событий, на которые должно
реагировать приложение; тем самым ОФ во многом определяет
функциональность приложения; что касается обработки сообщений, то
она, как правило, включает в себя вызов одной или нескольких API-
функций.
Перечисленные шаги можно проиллюстрировать следующей схемой.
Из сказанного выше можно сделать важный вывод: все оконные Windows-
приложения должны иметь одинаковую базовую структуру. Любое оконное
Windows-приложение включает два основных фрагмента:
основную, или главную, функцию, с которой начинается выполнение
приложения; ее принято называть именем WinMain;
оконную функцию для обработки сообщений приложения.
Основная функция WinMain. должна выполнять следующие действия:
описание одного или нескольких оконных классов;
регистрацию описанных оконных классов;
создание главного окна приложения и, если это необходимо, создание
нескольких дополнительных окон;
отображение на экране главного окна приложения;
запуск программного цикла обработки сообщений.
Более подробно все эти действия описываются ниже.
1. Описание оконного класса.
Оконный класс – это некий шаблон, содержащий наиболее общие
параметры целой группы окон. Данные параметры описывают такие общие
свойства, как фон окна, используемые курсоры и пиктограммы, и позволяют
окнам одного и того же класса выглядеть одинаково.
приложение 1
Цикл Обработки
Сообщений
Оконная Функция
приложение 2
Цикл Обработки
Сообщений
Оконная Функция
Устр. 1
Устр. 2
другие источники
событий
драйвер
драйвер
Системная
очередь
сообщени
й
Очередь
сообщений
Приложения
1
Очередь
сообщений
Приложения
2
ядро
системы