Функция Polygon и режим закрашивания многоугольника
Функция рисования многоугольника:
Polygon (hdc, pt, iCount);
pt – это массив структур типа POINT, iCount – число точек; если последняя точка в массиве не совпадает с первой, то добавляется линия, их соединяющая.
Внутренняя область фигуры закрашивается текущей кистью. По умолчанию режим закрашивания равен ALTERNATE (попеременный), т.е. закрашиваются только те фрагменты внутренней области многоугольника, которые получаются путем соединения линий с нечетными номерами (1, 3, 5...), другие фрагменты внутренней области не закрашиваются.
Режим закрашивания устанавливается функцией:
SetPolyFillMode (hdc, iMode);
iMode – режим закрашивания, WINDING (сквозной) – закрашиваются все внутренние области. Для иллюстрации приведем пример:
звезда, находящаяся слева, нарисована в режиме ALTERNATE, а звезда, находящаяся справа – в режиме WINDING.
Пример отображения линий
Если в предыдущей программе (Second Example) заменить case WM_PAINT... и убрать лишние переменные, получим программу (Third Example), в которой рисуются прямоугольник, эллипс, прямоугольник со скругленными углами и два отрезка. Программа показывает, что функции, определяющие области, закрашивают их, поэтому отрезки не видны там, где нарисован эллипс. Результат работы программы приведен на рис. П 6.4.
. . .
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;
Rectangle (hdc, cxClient /8, cyClient /8, 7*cxClient /8, 7*cyClient /8) ;
MoveToEx (hdc, 0, 0, NULL) ;
LineTo (hdc, cxClient, cyClient) ;
MoveToEx (hdc, 0, cyClient, NULL) ;
LineTo (hdc, cxClient, 0) ;
Ellipse (hdc, cxClient /8, cyClient /8, 7*cxClient /8, 7*cyClient /8) ;
RoundRect (hdc, cxClient /4, cyClient /4, 3*cxClient /4, 3*cyClient /4,
cxClient /4, cyClient /4) ;
EndPaint (hwnd, &ps) ;
return 0 ; . . .
Рис. П 6.4. Результат программы Third Example
Управление областями вывода и отсечением
Стандартно графический вывод отсекается по границам окна, с которым связан контекст, кроме того, из области вывода удаляются части, перекрытые другими окнами. Таким образом, границы области вывода могут иметь достаточно сложную форму.
В среде Windows используются функции, работающие с прямоугольными областями, использующими структуры типа RECT (прямоугольник) и произвольными областями – регионами (regions).
Работа с прямоугольниками
Простейшим средством, задающим границу области вывода, является прямоугольник. Функции отображения прямоугольных областей используют указатель на структуру rect типа RECT (прямоугольник), имеющую поля: left, top, right, bottom, заданные в логических единицах.
Функция FillRect (hdc, &rect, hBrush); закрашивает прямоугольник (не включая правую и нижнюю координаты) заданной кистью.
Функция FrameRect (hdc, &rect, hBrush); использует кисть для рисования прямоугольной рамки, но не закрашивает внутреннюю область.
Функция InvertRect (hdc, &rect); инвертирует все пиксели в прямоугольнике, устанавливая единичные биты в ноль, а нулевые – в единицу, т.е. переводит белую область в черную, черную – в белую (зеленую – в фиолетовую).
Windows содержит функции, позволяющие легко манипулировать со структурами типа RECT:
– установка всех полей структуры RECT в заданные значения:
SetRect (&rect, xLeft, yTop, xRight, yBottom);
– перемещение на заданное число координат вдоль осей x и y:
OffsetRect (&rect, x, y);
– увеличение или уменьшение размеров прямоугольника:
InflateRect (&rect, x, y);
– установка полей структуры прямоугольника в ноль:
SetRectEmpty (&rect);
– копирование одного прямоугольника в другой:
CopyRect (&DestRect, &SrcRect);
– пересечение двух прямоугольников:
IntersectRect (&DestRect, &SrcRect1, &SrcRect2);
– объединение двух прямоугольников:
UnionRect (&DestRect, &SrcRect1, &SrcRect2);
– определение, является ли прямоугольник пустым:
bEmpty = IsRectEmpty (&rect);
– определение, содержится ли точка внутри прямоугольника:
bInRect = PtInRect (&rect, point);