
- •Базовые концепции
- •Графический интерфейс пользователя
- •Многозадачность
- •Управление памятью
- •Независимость от аппаратных средств
- •Объектно-ориентированное программирование
- •Архитектура приложения, управляемая событиями
- •Оконная процедура
- •Оконные классы
- •Цикл обработки сообщений
- •30. О чем уведомляет приложение сообщение wm_paint?
- •Проект firstApplication Файл firstApplication.Cpp
Оконные классы
Новый термин – оконные классы. Все окна создаются на базе того или иного оконного класса. Оконный класс играет роль типа для данного окна.
Оконный класс (window class ) или класс окна – это структура, определяющая основные характеристики окна. К ним относятся стиль окна и связанные с окном ресурсы, такие как пиктограмма, курсор, меню и кисть для закрашивания фона. Кроме того, одно из полей структуры содержит адрес оконной процедуры, предназначенной для обработки сообщений, получаемых любым окном данного класса (типа).
Ссылка на оконный класс передается функции CreateWindow, вызываемой для создания окна.
Использование класса позволяет создать множество окон на основе одного и того же оконного класса, и следовательно использовать одну и ту же оконную процедуру. Например, все кнопки в приложениях Windows созданы на основе класса BUTTON. Есть свой класс для диалоговых окон и для других элементов управления.
Для главного окна приложения создается собственный класс,учитывающий индивидуальные требования к программе.
Цикл обработки сообщений
Как приложение узнает, что к нему пришло сообщение?
Непременным компонентом всех Windows – приложений является цикл обработки сообщений. Сообщение запускается главной функцией WinMain. Обычно она содержит вызовы функций для инициализации и создания окон, после него следует цикл обработки сообщений и необходимый код для закрытия приложения.
Что происходит в цикле обработки сообщений? В цикле сообщения извлекаются из очереди сообщений приложения функцией GetMessage. Цикл заканчивается, если получено сообщение WM_QUIT. Полученные сообщения передаются в функции DispatcMessage, которая возвращает сообщение обратно в Windows. Только после этого Windows отправляет это сообщение для его обработки соответствующей оконной процедуре (т.е. она ее вызывает). После возврата сообщения из оконной процедуры (сообщение там обрабатывается) Windows передает управление инструкции, которая расположена после DispatcMessage, и работа цикла продолжается.
Возможно, такая схема работы приложения выглядит чрезмерно сложной. Зачем приложению извлекать сообщения из очереди сообщений, а затем снова возвращать их Windows? Дело в том, что при такой организации обработки сообщений, операционная система может обеспечить параллельность выполнения нескольких процессов, а приложение получает возможность выполнить предварительную обработку сообщений:
Фильтровать получаемые сообщения, задавая нужные параметры функции GetMessage.
Транслировать коды клавиш в клавиатурные сообщения с помощью функции TranslateMessage;
Транслировать коды «горячих клавиш» в сообщения команд меню с помощью функции TranslateAccelerator;
Вопросы по теории
1. Что такое сообщение?
С точки зрения приложения, сообщение является уведомление о том, что произошло некоторое событие, которое может требовать, а может и не требовать выполнения определенных действий.
2. Как реализовано сообщение?
Сообщение – это структура данных, содержащая следующие элементы:
Дескриптор окна, которому адресовано сообщение.
Код (номер ) сообщения.
Дополнительную информацию, зависящую от кода сообщения.
struct MSG
{
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
};
3. Windows многозадачная система. Кому адресуются сообщения?
Сообщения от внешних источников, например от клавиатуры, адресуются в каждый данный момент времени только одному из работающих приложений, а именно его активному окну.
4. Что такое системная очередь сообщений? Кто ее создает? Когда?
Системная очередь сообщений – это глобальный объект Windows.
Создается в момент старта Windows в его памяти.
5. Как Windows определяет адресата, которому предназначено сообщение?
Windows периодически опрашивает системную очередь и , если она не пуста, посылает очередное сообщение нужному адресату, определяемому с помощью дескриптора окна.
6. Что такое дескриптор?
Любой объект в Windows идентифицируется своим дескриптором или описателем. Оба эти названия являются переводом анг. handle (хэндл). Дескриптор- это своего рода ссылка на объект (некоторое число, присвоенное объекту). Все взаимоотношения программы с объектом осуществляются через дескриптор.
7. Что такое очередь сообщений приложения? Кто ее создает? Когда? Зачем? Как долго живет эта очередь?
Очередь сообщений приложения - глобальный объект, связанный с конкретным приложением. Создает Windows одновременно с запуском приложения, чтобы не допустить потери сообщений. Время жизни этого объекта совпадает со временем жизни приложения.
8. Что такое оконная процедура?
Оконная процедура – это «функция обратного вызова», предназначенная для обработки сообщений, адресованных любому окну того «оконного класса», в котором содержится ссылка на данную процедуру.
9. Какая функция называется функцией обратного вызова?
«Функция обратного вызова» - это функция, которая вызывается самой операционной системой. В коде самого приложения никогда нет ее прямого вызова.
10. Как компилятор узнает функцию обратного вызова?
Компилятор узнает функцию обратного вызова по спецификатору CALLBACK.
11. Какой заголовок у функции обратного вызова главного окна?
Заголовок стандартный:
LRESULT CALLBACK имя_функции (HWND hWnd, UNIT uMsg, WPARAM wParam, LPARAM lParam)
Обычно имя функции может быть любым, но для главного окна приложения используют имя WndProc
12. Какие параметры имеет оконная процедура?
Четыре параметра оконной процедуры идентичны первым полям структуры MSG
1 -Дескриптор окна, получаюещего сообщение,
2- Идентификатор сообщения
(целые от 0 до 1024). Каждому коду сообщения в Windows сопоставлен символический идентификатор (числа помнить трудно!).
3 и 4- содержат дополнительную информацию, которая распознается системой в
зависимости от полученного сообщения
13. Какова структура тела функции обратного вызова?
В теле функции после определения необходимых локальных объектов размещают switch, в котором происходит обработка сообщений.
14. Что такое оконный класс?
Все окна создаются на базе того или иного оконного класса.
Оконный класс (window class ) или класс окна – это структура, определяющая основные характеристики окна. К ним относятся стиль окна и связанные с окном ресурсы, такие как пиктограмма, курсор, меню и кисть для закрашивания фона. Кроме того, одно из полей структуры содержит адрес оконной процедуры, предназначенной для обработки сообщений, получаемых любым окном данного класса (типа).
15. Что определяет оконный класс?
Оконный класс играет роль типа для данного окна.
Имя оконного класса передается функции CreateWindow, вызываемой для создания окна.
16. Какую возможность дает использование одного и того же класса при создании множества окон?
Использование одного и того же класса для создания множества окон позволяет создавать для них одну и ту же оконную процедуру. Например, все кнопки в приложениях Windows созданы на основе класса BUTTON. Есть свой класс для диалоговых окон и для других элементов управления.
17. Какова структура главной функции WinMain?
Обычно она содержит:
- вызов функций для инициализации и создания окон;
- цикл обработки сообщений ;
- необходимый код для закрытия приложения.
18. Что такое hInstance?
Дескриптор данного экземпляра приложения.
19. Что происходит в цикле обработки сообщений?
В цикле сообщения извлекаются из очереди сообщений приложения функцией GetMessage. Цикл заканчивается, если получено сообщение WM_QUIT. Полученные сообщения передаются в функции DispatcMessage, которая возвращает сообщение обратно в Windows. Только после этого Windows отправляет это сообщение для его обработки соответствующей оконной процедуре (т.е. она ее вызывает). После возврата сообщения из оконной процедуры (сообщение там обрабатывается) Windows передает управление инструкции, которая расположена после DispatcMessage, и работа цикла продолжается.
20. Зачем приложению извлекать сообщения из очереди сообщений, а затем снова возвращать их Windows?
При такой организации обработки сообщений, операционная система может обеспечить параллельность выполнения нескольких процессов, а приложение получает возможность выполнить предварительную обработку сообщений:
Фильтровать получаемые сообщения, задавая нужные параметры функции GetMessage.
Транслировать коды клавиш в клавиатурные сообщения с помощью функции TranslateMessage.
Транслировать коды «горячих клавиш» в сообщения команд меню с помощью функции TranslateAccelerator.
21. Какой заголовок имеет диалоговая процедура?
Диалоговая процедура должна иметь спецификатор CALLBACK, так как она вызывается операционной системой. Имя можен быть произвольным, но сложилась традиция завершать это имя префиксом DlgProc. Функция принимает тот же набор параметров, что и оконная процедура.
22. Какие основные отличия оконной процедуры главного окна от диалоговой процедуры?
Их четыре:
Оконная процедура возвращает значение типа LRESULT, а диалоговая - BOOL;
Если оконная процедура не обрабатывает какое-то сообщение, то она вызывает DefWindowProc. Если диалоговая процедура не обрабатывает какое-то обращение, то она возвращает FALSE. Если же сообщение ею обрабатывается, то она возвращает TRUE.
Диалоговая процедура не обрабатывает сообщения WM_CREATE. Вместо этого она выполняет инициализацию при обработке специального сообщения WM_INITDIALOG.
Диалоговая процедура не обрабатывает сообщение WM_PAINT, так как все функции в ней реализуются элементами управления.
23. Когда посылается сообщение WM_COMMAND?
Сообщение посылается, если пользователь выбирает команду меню или команду из элемента управления.
24. Что делает макрос LOWORD?
Макрос извлекает младшее слово из 32-разрядного аргумента.
25. Что делает макрос HIWORD?
Макрос извлекает старшее слово из 32-разрядного аргумента.
26. Какую информацию содержит младшее слово параметра wParam , когда обрабатывается сообщение WM_COMMAND?
Младшее слово wParam содержит идентификатор пункта меню или элемента управления.
27. Что такое контекст устройства?
Контекст устройства (device context)- это внутренняя структура данных, которая определяет набор графических объектов и их атрибутов, а также графических режимов, влияющих на вывод.
28. Перечислите основные графические объекты.
Основные графические объекты:
Перо (pen) для рисования линий.
Кисть (brush) для заполнения фона и заливки фигур.
Растровое изображение (bitmap) для отображения в указанной области окна.
Палитра (pallete) для определения доступных цветов.
Шрифт (font) для вывода текста.
Регион (region) для отсечения области вывода.
29. Какие действия необходимо выполнить при использовании графических объектов?
Использование любого объекта требует выполнения следующей последовательности действий:
Создать графический объект – вызвать соответствующую функцию Create…
Выбрать созданный объект в контекст устройства, вызвав функцию SelectObject
HGDIOBJ SelectObject (
HDC hdc, // дескриптор контекста устройства
HGDIOBJ hgdiobj // дескриптор GDI объекта
};
Вызвать графическую функции, работающую с объектом
Удалить объект из контекста устройства, вернув предшествующий объект функцией SelectObject.
Уничтожить объект функцией DeleteObject.