Работа с графическими регионами через Windows API в Delphi

Windows API имеет набор функций, которые позволяют описать произвольную геометрическую фигуру. Такие фигуры можно потом использовать как при работе с окнами, так и в терминологии Delphi, либо с элементами управления. Особенно широко регионы применяются в формах Delphi (примеры смотрите на форуме программистов, http://www.cyberforum.ru/). Поэтому для начала расскажем, что такое регион.

Win32 SDK регион выглядит таким образом:

  1. В Microsoft Windows регионом именуется эллипс, прямоугольник или полигон, которые могут быть обрамлены, заполнены, инвертированы, нарисованы и могут использоваться для нахождения места курсора.
  2. В SDK есть три основных типа регионов: полигональные, эллиптические и прямоугольные. Дело в том, что любой регион может быть скомбинирован друг с другом при помощи логических операций OR, XOR и других. Если смотреть с точки зрения Windows, регион определяется как обыкновенный объект GDI, который задается дескриптором HRGN. Такой же тип доступен и в Delphi, он выглядит так: HRGN = type LongWord;
  3. В Win32 SDK _RGNDATA сделано иначе, наиболее интересная часть — это TRgnDataHeader, которую рассмотрим более подробно.

nRgnSize — размер буфера, который необходим структуры TRect, назначающей координаты прямоугольников. При неизвестном размере поле равняется нулю;
dwSize — назначает размер заголовка в байтах;
nCount — количество прямоугольников, составляющих регион;
iType — тип региона, который равен постоянной величине 1;
rcBound — координаты прямоугольника вписанного региона.

Данная структура как раз задаёт регион, с ней и работают почти все функции API. Условно их можно разделить на три группы: отрисовка, создание/удаление и прочие. Рассмотрим каждый по порядку.

Функции создания/удаления регионов Delphi, можно сказать про последнюю функцию DeleteObject, что она в явном виде не фигурирует, и в раздел по работе с регионами она не включена, это связано с тем, что она предназначена для несколько более широкого использования. На форуме delphi (http://www.cyberforum.ru/delphi/) выяснили, что в общем смысле она удаляет любой объект GDI, после чего освобождает все ресурсы, отведённые под этот объект. Для тех, кто совсем мало разбирается в Delphi, SDK нежно уточняет, что после вызова данной функции, ссылка на объект удаления становится неопределённой.

Прочих функций Delphi великое множество и описывать их все не имеет смысла. Озвучим как регионы комбинируются. Результат комбинирования определяется CombineRgn. Рассмотрим возможные значения:

  1. RGN_ADD – создает пересечение двух регионов p2 и p3;
  2. RGN_COPY – создаёт копию одного региона p2;
  3. RGN_DIFF – возвращает часть p2, которая не является частью p3;
  4. RGN_OR – помогает объединить два региона p2 и p3;
  5. RGN_XOR – помогает объединить регионы p2 и p3, за исключением пересекающихся областей.

Рисование регионов необходимо не только для того, чтобы изображать отверстия в формах Delphi. Зачастую – это полезный инструмент для отрисовки на экране очень сложных геометрических фигур. Неизмеримо полезны они для вывода карт, которые представляются очень большим количеством ломаных линий, которые построены по массивам точек.

Related posts

Leave a Comment