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

Объектно-ориентированное программирование

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

Любой объект в Windows идентифицируется своим дескриптором или описателем. Оба эти названия являются переводом анг. handle (хэндл). Дескриптор- это своего рода ссылка на объект (некоторое число, присвоенное объекту). Все взаимоотношения программы с объектом осуществляются через дескриптор. Windows скрывает свои внутренние секреты и не допускает прямого доступа к внутренним структурам объектов.

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

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

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

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

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

  • Код (номер ) сообщения.

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

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

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

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

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

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

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

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

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

Заголовок стандартный:

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

Обычно имя функции может быть любым, но для главного окна приложения используют имя WndProc

В теле функции после определения необходимых локальных объектов размещают switch, в котором происходит обработка сообщений.

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

Чаще всего приложения обрабатывают оконные сообщения (windows messages), начинающиеся с префикса WM_ (WM_PAINT, WM_SIZE, WM_MOVE), сообщения от элементов управления, кнопок начинаются с префикса BM_