- •Базовые концепции
- •Графический интерфейс пользователя
- •Многозадачность
- •Управление памятью
- •Независимость от аппаратных средств
- •Объектно-ориентированное программирование
- •Архитектура приложения, управляемая событиями
- •Оконная процедура
- •Оконные классы
- •Цикл обработки сообщений
- •30. О чем уведомляет приложение сообщение wm_paint?
- •Проект firstApplication Файл firstApplication.Cpp
Объектно-ориентированное программирование
Пользователь взаимодействует с приложением через окно, рассматривая его как некоторый объект. Программист рассматривает окно тоже как объект, через который от пользователя поступает информация в виде оконных сообщений. Окна обмениваются сообщениями с другими окнами. Понимание этих сообщений – ключ к осмыслению программирования в среде 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_
