Окт 14 2009

Отсечение для клиентской области окна

Регион с дескриптором hRgn, созданный при помощи рассмотренных выше функций, может быть использован для отсечения при выводе в клиентской области окна. Для этого он должен быть выбран в контекст устройства при помощи функции SelectClipRgn:
SelectClipRgn(hDC, hRgn);
В этом случае GDI создает копию данных региона и связывает ее с контекстом устройства. Поэтому после выполнения функции SelectClipRgn объект hRgn может быть удален.
Чтобы удалить из контекста устройства выбранный ранее регион отсечения, нужно вызвать функцию SelectClipRgn с параметром NULL:
SelectClipRgn(hDC, NULL);
Чаще всего регионы отсечения применяются для того, чтобы ограничить рисование только той областью экрана, где это действительно необходимо. Это особенно актуально для анимационных или игровых приложений, в которых скорость рисования может иметь критическое значение, а также для программных имитаторов аппаратуры, требующих рисования в реальном времени.


Окт 14 2009

Отсечение

Отсечение — это ограничение вывода рисуемого изображения в пределах некоторой заданной области. Напомним, что Windows использует соответствующие понятия, связанные с данной проблемой:
Обновляемый регион {недействительный регион) — та часть окна, которая требует обновления после тех или иных событий. Обновляемый регион формируется как системой, так и приложением в результате вызова функции InvalidateRect или InvalidateRgn.
Видимый регион — та часть окна, которую в данный момент видит пользователь. В результате перекрытия другим окном видимая часть окна может измениться.
Регион отсечения — область, внутри которой система разрешает рисование. Когда приложение получает контекст устройства, система устанавливает регион отсечения как результат пересечения видимого региона и обновляемого региона. Приложение может усилить ограничения, накладываемые на регион отсечения, при помощи функции SetWindowRgn или SelectClipRgn. Обратите внимание на то, что при отсечении координаты всех регионов задаются в системе координат устройства.


Окт 13 2009

Регионы и отсечение

Регион — это совокупность точек в координатном пространстве. Эта совокупность может быть пустой, а может занимать все координатное пространство. Она может иметь прямоугольную или любую неправильную форму. Регионы так же, как перья, кисти, битовые образы и многие другие элементы, являются объектами GDI. После создания объекта региона приложение получает его дескриптор, который относится к типу HRGN. Когда объект региона становится ненужным, его следует удалить функцией DeleteObject. Регионы могут использоваться как для рисования, так и для отсечения.


Окт 13 2009

Многоугольники

Прямоугольник является частным случаем многоугольника. Для рисования произвольного многоугольника предназначена функция Polygon:
BOOL PolygonCHDC hdc. CONST POINT IpPoints, int nCount);
Работа этой функции напоминает рисование ломаных линий функцией Polyline. Второй параметр функции принимает адрес массива точек, а третий — количество точек. В отличие от Polyline, функция Polygon автоматически замыкает фигуру. В случае использования геометрического пера функция Polygon, так же как и Polyline, оформляет каждую вершину в соответствии с атрибутом соединения.
Для выпуклых многоугольников внутренняя область определяется достаточно четко. Однако невыпуклый многоугольник может состоять из нескольких частей, как, например, пятиконечная звезда, что затрудняет определение его внутренней области. Такие же проблемы могут возникнуть при перекрытии одного многоугольника другим. В связи с этим Win32 GDI предусматривает два режима заполнения многоугольников: режим ALTERNATE и режим WINDING. Контекст устройства содержит соответствующий атрибут, который можно изменять, вызывая функцию SetPolyFillMode. По умолчанию установлен режим заполнения многоугольников ALTERNATE.
В режиме ALTERNATE принадлежность некоторой точки внутренней области определяется при помощи довольно простого алгоритма:
1. Проведем мысленно горизонтальную линию сканирования через интересующую нас точку.
2. Пронумеруем точки пересечения этой линии с встречающимися на ее пути линиями многоугольника.
3. Если интересующая нас точка лежит между нечетным и четным пересечениями, то она принадлежит внутренней области многоугольника.
В режиме WINDING принадлежность некоторой точки внутренней области определяется с учетом направления рисования сторон многоугольника по следующему алгоритму:
1. Проведем мысленно горизонтальную линию сканирования через интересующую нас точку.
2. Установим нулевое значение счетчика count до первого пересечения этой линии с многоугольником.
3. При каждом следующем пересечении линии многоугольника анализируем направление рисования этой линии по отношению к линии сканирования. Если это направление по часовой стрелке, то значение счетчика count увеличивается на единицу, если против часовой стрелки, то уменьшается на единицу.
4. Если текущее значение счетчика count больше нуля, то точка принадлежит внутренней области, в противном случае точка считается внешней.


Окт 13 2009

Эллипсы

Для рисования эллипсов предназначена функция Ellipse, прототип которой приведен ниже:
BOOL E11ipse(HDC hdc, int xLeft, int yTop. int xRight. int yBottom): Функция рисует эллипс в ограничивающем прямоугольнике, заданном координатами xLeft, yTop, xRight, yBottom.
Все сказанное выше о влиянии атрибутов в контексте устройства на процесс рисования прямоугольников распространяется также и на рисование эллипсов функцией Ellipse.


Окт 13 2009

DrawFocusRect

Функция DrawFocusRect имеет следующий прототип:
BOOL DrawFocusRect(HDC hdc. CONST RECT lprc):
По своему действию она напоминает функцию FrameRect, рисуя периметр прямоугольника шахматной узорной кистью с применением растровой операции «Исключающее ИЛИ». Повторный вызов функции с теми же параметрами восстанавливает первоначальное изображение.
Функция активно используется теми модулями Win32 API, которые отвечают за управление окнами. Например, в диалоговых окнах функция DrawFocusRect рисует точечный контур прямоугольника на кнопке, получающей фокус ввода с клавиатуры. Когда фокус переходит к другой кнопке, прямоугольник стирается повторным вызовом функции DrawFocusRect.
Функция DrawFocusRect также может использоваться при выводе «эластичных» прямоугольников.


Окт 13 2009

InvertRect

Функция InvertRect имеет следующий прототип:
BOOL InvertRect(HDC hdc. CONST RECT Iprc):
Она инвертирует цвет каждого пиксела внутри заданного прямоугольника. Если графическое устройство использует палитру, то инвертируются индексы палитры. В устройствах без палитры черный цвет переходит в белый, белый цвет — в черный, а RGB-значение каждого пиксела инвертируется.
При двукратном вызове функции InvertRect с одинаковыми параметрами восстанавливается первоначальное изображение.


Окт 13 2009

Прямоугольники

Наиболее важной геометрической фигурой в Windows является прямоугольник. Прямоугольники применяются при определении окон и клиентских областей, различных фигур с прямоугольным ограничивающим контуром, при отсечении и при форматировании текста. Поэтому в Win32 API определены специальная структура данных для представления прямоугольников и многочисленные функции как для работы с этой структурой, так и для рисования прямоугольников.


Окт 13 2009

Замкнутые фигуры

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


Окт 13 2009

Растровые кисти

Растровая (или узорная) кисть создается при помощи функции CreatePattemBrush:
HBRUSH CreatePatternBrushtHBITMAP hbmp);
Параметр hbmp содержит дескриптор растрового объекта GDI.
Поскольку растровый объект GDI (bitmap), называемый также аппаратно-за-висимым растром (DDB)1, может содержать произвольное изображение, то программист получает неограниченные возможности создания рисунков для заливки замкнутых областей.
Давайте проведем следующий эксперимент с растровой кистью. При помощи графического редактора MS Paint создайте рисунок размером 32 х 32 пиксела, содержащий изображение пятиконечной звезды.


« Предыдущая страницаСледующая страница »