<< Предыдущая страница

Содержание

Следующая страница >>

Раздел 2. Обработка сообщений окна, работа с графическими объектами

Основные сообщения, возникающие при создании/закрытии и перерисовки окна

Каждое полученное окном сообщение идентифицируется номером, который содержится во втором параметре оконной процедуры. Для некоторых типов сообщения передается также дополнительная информация в третьем (wParam) и четвертом (lParam) параметре оконной процедуре. В заголовочных файлах Windows определены идентификаторы, начинающиеся с префикса WM для каждого типа сообщений.

Сообщение WM_CREATE возникает, когда Windows обрабатывает функцию CreateWindow в WinMain и используется часто для инициализации данных.

Сообщение WM_DESTROY вызывается операционной системой обычно при закрытии окна. Стандартная реакция на это сообщение – посылка сообщения WM_QUIT в цепь GetMessage функции WinMain. Это сообщение посылается при помощи PostQuitMessage(0). Иногда внутри этого обработчика могут задаваться дополнительные действия, например, предложение пользователю записать в файл.

Сообщение WM_PAINT посылается после вызова UpdateWindow и каждый раз, когда область окна становится недействительной и требует перерисовки. Если в параметре style структура WNDCLASSEX помещены флаги CS_HREDRAW и CS_VREDRAW, то WM_PAINT будет посылаться при каждом изменении размеров окна. Для генерации сообщения WM_PAINT в программе используется функция InvalidateRect.

Сообщения меню

Когда пользователь выбирает пункт меню, Windows посылает оконной процедуре несколько различных сообщений. Большинство из этих сообщений обычно не используется, а обрабатывается сообщение WM_COMMAND, которое показывает, что пользователь выбрал разрешенный пункт меню окна. В младшем слове wParam этого сообщения передается идентификатор пункта меню, на который указал пользователь.

Сообщения от мыши и клавиатуры

Сообщение мыши WM_LBUTTONDOWN возникает, когда пользователь щелкает левой клавишей мыши в области окна. В младшем и старшем слове lParam этого сообщения находятся координаты x и у точки окна, в которой произошел щелчок мыши.

При нажатии на клавиатуре возникает ряд сообщений, которые передаются в цикл обработки сообщений окна. Эти сообщения обрабатываются там функциями TranslateAccelerator и TranslateMessage. Первая из них призвана обработать нажатие “горячих клавиш”, вторая учитывает локальные настройки системы при обработке сообщений нажатия клавиатуры. Обработанные сообщения поступают затем в оконную процедуру.

Контекст устройства

Большинству функций для работы с графическими возможностями системы требуется описатель контекста устройства. Контекст устройства DC представляет собой объект, используемый для рисования и графика и текста на целевом устройстве. Контекст устройства позволяет абстрагироваться от физического устройства и работать только с этим уровнем в программе. Целевые устройства могут быть виртуальными, такими как окно, блок памяти, или физическими - экран, принтер. У контекстов устройств есть атрибуты, например цвет фона. Некоторые атрибуты являются графическими объектами. Процесс привязки графического объекта к контексту состоит в создании объекта функциями Win32 API, к которым относятся, например, CreatePen – для выбора вида контуров, CreateBrushInderect или CreateSolidBrush – для выбора заливки, CreateFont – для выбора шрифта. Созданные объекты затем выбираются в контекст устройства с помощью функции API SelectObject. После того как объект выбран в контекст устройства все функции рисования текста и графики будут использовать выбранные параметры при выводе на целевое устройство. По окончанию рисования в контекст устройства желательно вернуть старый объект функцией SelectObject, а новый удалить функцией DeleteObject.

В сообщении WM_PAINT контекст устройства получают вызовом BeginPaint, а освобождают вызовом EndPaint. Рисовать в окне можно не только в сообщении WM_PAINT, но тогда при каждой перерисовке данные будут стираться, в этом случае контекст получают вызовом функции GetDC, а освобождают вызовом функции ReleaseDC.

Задание 2. Нарисовать диаграмму заданной формы, цветами и данными. Создать легенду рядом с диаграммой с заданным шрифтом. Предусмотреть изменение диаграммы при выборе заданного пункта меню. Параметры диаграммы по вариантам приведены в таблице 2. Размер участков диаграммы (секторов, столбиков) выбираются учащимися самостоятельно, при соблюдении пропорций, указанных в вариантах (даны в процентах после вида диаграммы).

Цель: изучение основ графического вывода и обработки сообщений в Windows.

Таблица 2

Варианты задания 2

№ варианта Задание
1 Круговая: 10%, 20%, 25%, 15%, 30%, в оттенках синего цвета. Шрифт Arial 10. При выборе пункта меню шрифт увеличивается в заданное в меню количество раз.
2 Столбиковая: 10%, 20%, 25%,40%. При щелчке мышью на столбике, столбик окрашивается в цвет, выбранный перед этим в меню.
3 Круговая: 15%, 40%, 35%, 10%. При щелчке мышью в секторе диаграммы граница сектора окрашивается в цвет, выбранный до этого в меню.
4 Столбиковая: 10%, 20%, 30%, 50%. При щелчке мышью на выбранном пункте легенды величина шрифта меняется на значение, выбранное до этого в меню.
5 Столбиковая, столбики в виде равнобедренных треугольников: 10%, 40%, 50%. Предусмотреть пункты меню для выбора шрифта легенды и масштаба диаграммы.
6 Круговая: 15%, 40%, 45%. Заливка секторов создается на основе Bitmap (растра). При щелчке мыши в области диаграммы она меняет масштаб в соответствии с выбранным пунктом меню.
7 Столбиковая, столбики горизонтальные: 70%, 40%, 80%, 10%. При щелчке мышью на столбике, столбик меняет размер и цвет в соответствии с выбранным пунктом меню.
8 Столбиковая, столбики в виде эллипсов: 40%, 60%, 30%, 20%. При щелчке мышью на легенде цвет столбика меняется на выбранный в меню.
9 Столбиковая, столбики в виде прямоугольных треугольников: 10%, 50%. При щелчке мышью на столбике, толщина его границы и цвет устанавливаются в соответствии с выбранными в меню.
10 Круговая со штриховым заполнением секторов: 10%, 20%, 40%, 30%. При щелчке мышью на пункте легенды, границы сектора меняют цвет на выбранный в меню.
11 Круговая: 10%, 20%, 30%, Х%, 40%. При выборе пункта меню задается Х. При щелчке мышью на секторе диаграммы, сектор меняет цвет на выбранный в меню.
12 Столбиковая, столбики горизонтальные: 10%. 30%, 50%. При щелчке на легенде цвет соответствующего столбика меняется в соответствии с выбором меню.
13 Столбиковая: 10%, 40%, 60%, 30%. Столбики с заливкой на основе растров (Bitmap). При щелчке на столбике шрифт в легенде меняется на выбранный в меню.
14 Круговая 10%, 90% при щелчке на секторе, заливка сектора меняется и меняется шрифт в легенде в соответствие с выбором в меню.
15 Столбиковая: 10%, 40%, 50%. Столбики идут вниз. Щелчок мыши на столбике изменяет цвет контура на выбранный в меню.
16 Столбиковая. Столбики в виде равнобедренных треугольников, расположенных горизонтально: 10%, 40%. При щелчке мыши на легенде, шрифт пункта меняется на выбранный в меню.
17 Столбиковая, столбики в виде эллипсов, расположенных горизонтально: 10%, 40%, 60%. При щелчке мышью внутри столбика, заливка столбика меняется на выбранную в меню.
18 Круговая: 10%, 20%, Х%, 70-X%. X выбирается из меню. При щелчке мышью на секторе диаграммы, сектор и его граница меняет цвет на выбранный в меню.
19 Круговая: 10%, 40%, Х%, 50-X%. X выбирается из меню. При щелчке мышью на секторе диаграммы, шрифт соответствующего пункта легенды меняется на выбранный в меню.
20 Круговая: 40%, 10%, Х%, 50-X%. X выбирается из меню. При щелчке мышью на пункте легенды, шрифт соответствующего пункта легенды и цвет сектора меняется на выбранный в меню.
21 Столбиковая. Столбики в виде равнобедренных треугольников: 10%, 70-X%, X%. X выбирается из меню. При щелчке мышью внутри столбика, заливка столбика меняется на выбранную в меню.
22 Столбиковая. Столбики в виде эллипсов: 15%, 35%, X%, 50-X%. X выбирается из меню. При щелчке мышью внутри столбика, толщина и цвет границы столбика меняется на выбранные в меню.
23 Круговая: 10%, 80%, 10%. При щелчке внутри сектора, сектор закрашивается картинкой, имя которой, выбрано в меню.
24 Столбиковая, столбики в виде эллипсов: 10%, 40%, 60%. При щелчке мышью внутри столбика, заливка столбика меняется на выбранную в меню. При щелчке на пункте легенды, шрифт пункта легенды меняется на выбранный в меню.
25 Круговая: 10%, 10%, Х%, 80-X%. X выбирается из меню. При щелчке мышью секторе, шрифт соответствующего пункта легенды и цвет сектора меняется на выбранный в меню.

Указания. Для построения круговых диаграмм можно воспользоваться функцией Win32 API - Pie, для построения треугольников функцией – Polygon. При рисовании текста в легенде для получения высоты шрифта можно воспользоваться функцией – GetTextExtentPoint. Для определения столбика или сектора диаграммы, на котором произошел щелчок мыши можно воспользоваться уравнением эллипса или прямой на плоскости.