Компьютерная графика. Лабораторная работа 1_2п. Лабораторная работа основы создания графических приложений в системе windows
![]()
|
CreatePenIndirect : HPEN CreatePenIndirect(CONST LDGPEN* lplgpn); Этой функции в качестве параметра передаётся адрес структуры типа LOGPEN : typedef struct tagLOGPEN { UINT style; // стиль пера POINT width; // толщина в логических единицах COLORREF color; // цвет } LOGPEN; Член структуры width имеет тип POINT , но Windows использует только величину width.x как толщину пера и игнорирует значение width.y Таким образом, сначала определяется переменная типа LOGPEN , например: LOGPEN logpen; Затем полям этой переменной присваиваются нужные значения, например: logpen.style = PS_SOLID; logpen.width.x = 10; logpen.color = RGB(255, 0, 0); И только после этого вызывается функция CreatePenIndirect_:_hPen_=_CreatePenIndirect(logpen);_Простые_перья,_созданные_с_помощью_функции_CreatePenIndirect'>CreatePenIndirect : hPen = CreatePenIndirect(&logpen); Простые перья, созданные с помощью функции CreatePenIndirect , обладают точно такими же характеристиками, что и перья, созданные функцией CreatePen Следует обратить внимание на то, что функции CreatePen и CreatePenIndirect не требуют дескриптора контекста устройства. Они создают логические перья, которые никак не связаны с контекстом устройства, пока не будет вызвана функция SelectObject Если программе требуется несколько перьев, то сценарий их использования может быть следующим. Например, приложению требуются три нестандартных пера: красное толщиной 2, зелёное толщиной 5 и синее пунктирное. Сначала нужно определить переменные для хранения дескрипторов этих перьев: static HPEN hPenl, hPen2. hPen3; Сами перья могут быть созданы в процессе обработки сообщения WM_CREATE : hPenl = CreatePen(PS_SOLID, 2, RGB(255, 0. 0)); hPen2 = CreatePen(PS_SOLID, 5, RGB(0, 255, 0)); hPen3 = CreatePen(PS_DASH, 1, RGB(0, 0, 255)); В процессе обработки сообщения WM_PAINT можно выбрать одно из этих перьев в контекст устройства и рисовать с его помощью: SelectObject(hDC, hPenl); // ... функции рисования линий SelectObject(hDC, hPen2); // ... функции рисования линий В процессе обработки сообщения WM_DESTROY рекомендуется удалить эти перья: DeleteObject(hPenl); Delete0bject(hPen2); Delete0bject(hPen3); Это наиболее общий подход. Но возможны и другие сценарии. Например, можно создать перо в блоке обработки сообщения WM_PAINT и удалить его перед вызовом функции EndPaint или даже после её вызова. Для закрашивания площадей различных геометрических объектов используется такой графический объект, как кисть, представляющую собой растр размером 8 x 8 пикселов, который при закрашивании области дублируется в горизонтальном и вертикальном направлении. Когда Windows использует смешивание для отображения большего числа цветов, чем доступно на дисплее, то на самом деле для этого используется кисть. Windows GDI предоставляет несколько функций для создания объектов логических кистей. Логическая кисть описывает требования, предъявляемые к заливке со стороны приложения. Эти требования не всегда совпадают с возможностями физических устройств. Драйверы устройств поддерживают собственные структуры данных, определяющие реализацию логической кисти. Такие внутренние объекты называются физическими кистями. Для дескрипторов логических кистей зарезервирован тип HBRUSH , поэтому новая кисть объявляется следующим образом: HBRUSH hBrush; Значение дескриптора получают вызовом соответствующей функции. Вид вызываемой функции зависит от типа кисти. Так же как и при работе с перьями, созданные кисти выбираются в контекст устройства с помощью функции SelectObject , после чего заливка всех замкнутых фигур осуществляется выбранной кистью. Когда кисть перестаёт быть нужной, рекомендуется вернуть в контекст устройства прежнюю кисть, а ненужную кисть удалить при помощи функции DeleteObject Все кисти, предоставляемые GDI, приведены в табл. 9. Таблица 9. Стандартные кисти Индекс кисти Описание BLACK_BRUSH Чёрная кисть DKGRAY_BRUSH Тёмно-серая кисть DC_BRUSH Кисть DC – сплошная кисть; по умолчанию имеет белый цвет; цвет может быть сменён функцией SetDCBrushColor GRAY_BRUSH Серая кисть HOLLOW_BRUSH Пустая кисть (заливки нет) LTGRAY_BRUSH Светло-серая кисть NULL_BRUSH То же, что и HOLLOW_BRUSH WHITE_BRUSH Белая кисть, которая используется по умолчанию Чтобы получить дескриптор стандартной кисти, достаточно вызвать функцию GetStockObject с одной из констант, приведённых в табл. 9, например: hBrush = (HBRUSH) GetStockObject(GRAY_BRUSH); Стандартные кисти хороши простотой своего использования, но их возможности явно недостаточны для нужд многих приложений. Поэтому Windows содержит функции, создающие пользовательские кисти следующих типов: сплошные кисти, штриховые кисти и растровые кисти. Сплошная кисть создается вызовом функции CreateSolidBrush : HBRUSH CreateSolidBrush(COLORREF crColor); Её единственному параметру crColor передаётся цвет кисти в виде значения типа COLORREF . Обычно это значение задаётся при помощи макроса RGB или PALETTERGB . Первый вариант используется, если устройство вывода поддерживает полный диапазон цветов, определяемый 24-битным RGB- значением. В этом случае приложению нет необходимости работать с палитрой. Второй вариант необходимо использовать, если приложение работает с логической палитрой. В последнем случае Windows преобразует запрошенный в макросе PALETTERGB цвет в наиболее подходящий индекс палитры. Задание. Разработать программу, вычерчивающую графики функций в одной системе координат согласно заданию (см. варианты). Цвет линий графиков должен быть различным. Шкалы координатных осей следует проградуировать и подписать. При изменении размеров окна выводимое изображение следует масштабировать. Варианты заданий № варианта Функции Начальное значение X Конечное значение X 1 𝑒 −𝑥 и 10 −𝑥 1 2 2 tg 3 𝑥 и ctg 3 𝑥 0,6 1,5 3 𝑒 𝑥 sin 𝑥 и 𝑒 −𝑥 sin 𝑥 0 1 4 √ln 𝑥 и √ln 𝑥 4 1 5 5 cos √𝑥 и tg √𝑥 0,2 2 6 10 −𝑥 и 10 √𝑥 0,1 2 7 arcsin 1 𝑥 2 и arccos 1 𝑥 3 1.05 2 8 ln 1 𝑥 и lg 1 𝑥 0.1 1 Порядок выполнения работы. 1. Изучить материал по работе с графическими примитивами интерфейса Windows API. 2. Написать и отладить программу согласно варианту задания. 3. Представить результаты работы программы. 4. Оформить отчёт. |