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

Контрольные вопросы

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

В основе взаимодействия программы с внешним миром и с операционной системой лежит концепция сообщений.

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

Сообщение – это структура данных, содержащая следующие элементы:

  • дескриптор окна, которому адресовано сообщение;

  • код (номер) сообщения;

  • дополнительная информация, зависящая от кода сообщения (параметры сообщения).

Не следует забывать, что Windows – многозадачная операционная среда. Сообщения от внешних источников, например, от клавиатуры, адресуются в каждый момент времени только одному из работающих приложений, а именно – активному окну. Но каким же образом Windows играет роль диспетчера сообщений? Для этого с момента старта операционная система создает в памяти глобальный объект, называемый системной очередью сообщений. Все сообщения, генерируемые как аппаратурой, так и приложениями, помещаются в эту очередь. Windows периодически опрашивает эту очередь и, если она не пуста, посылает очередное сообщение нужному адресату, определяемому при помощи дескриптора окна.

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

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

аппаратное событие системная очередь сообщений очередь сообщений приложения.

5.2.1. Оконная процедура. Для понимания механизма обработки приложением поступающих к нему сообщений сначала нужно объяснить, что такое «оконная процедура».

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

Если Вы прочли только, что сделанное определение, как говорится, не моргнув глазом, значит, Вы не новичок в программировании для Windows. Для тех, кто видит эти термины впервые, нужны дополнительные разъяснения.

Начнем с понятия «функция обратного вызова». Так называют функции, которые вызывает сама операционная система. Поэтому в коде приложения вы не найдете прямого вызова такой функции. Компилятор узнает функцию обратного вызова по спецификатору CALLBACK. Оконная процедура обычно имеет заголовок со стандартным синтаксисом:

LRESULT CALLBACK Имя_функции (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam).

В этом определении LRESULT тип возврвщаемого значения (см. табл. 5.1), hWnd – дескриптор окна, которому адресовано сообщение, uMsg – код сообщения, wParam и lParam – параметры сообщения. Имя функции может быть произвольным, но для главного окна приложения обычно используется имя WndProc. В теле функции после объявления необходимых локальных переменных обычно размещается оператор switch, внутри которого и происходит обработка нужных сообщений.

Каждому коду сообщения в Windows сопоставлен уникальный символический идентификатор. Все системные идентификаторы определены при помощи директивы #define в заголовочном файле winuser.h. Это лблегчает чтение и понимание программ.

Чаще всего приложение обрабатывает оконные сообщения (window messages), начинающиеся с префикса WM_, например, WM_PAINT, WM_SIZE, WM_MOVE и многие другие. Другие типы сообщений могут поступать от элементов управления, например: сообщения с префиксом BM_ поступают от кнопок, сообщения с префиксом EM_ - от текстовых полей, сообщения с префиксом LB_ - от списков.

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

Теперь о новом термине «оконный класс». На самом деле все окна создаются на базе того или иного оконного класса. Оконный класс исграет роль типа для данного окна.

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

Ссылка на оконный класс передается функции CreateWindow, вызываемой для создания окна.

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

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

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

Замечание. Не следует путать понятие оконного класса Windows с понятием класса С++ или, в частности, с понятием класса в библиотеках VCL или MFS. Дело в том, что исторически концепция оконных классов опередила по времени использование в Windows объектно-ориентированных языков.

Но как приложение узнает, что к нему пришло сообщение? Об этом рассказывается в следующем разделе

5.2.3. Цикл обработки сообщений. Непременным компонентом всех Windows-приложений является цикл обработки сообщений. У приложения всегда есть главная функция WinMain. Обычно она содержит вызовы функций для инициализации и создания окон, после чего следует цикл обработки сообщений и необходимый код для закрытия приложения.

Что происходит в цикле обработки сообщений? Как известно, все сообщения, адресованные приложению, Windows записывает в очередь сообщений приложения. Извлечение сообщения из этой очереди осуществляет функция GetMessage.

Если очередное сообщение имеет код WM_QUIT, то происходит выход из цикла, после чего приложение завершает свою работу.

Если очередное сообщение не является сообщением WM_QUIT, то оно передается функции DispatchMessage, которая возвращает сообщение обратно Windows. Далее Windows отправляет сообщение для его обработки соответствующей оконной процедуре – иными словами, Windows вызывает оконную процедуру. После возврата из оконной процедуры Windows передает управление оператору, который расположен после DispatchMessage, и работа цикла продолжается.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]