Регионы в Delphi Оглавление
Общее описание
Функции создания/удаления регионов
Функции отображения регионов
Прочие функции
Функции работы с окнами и регионами
Создание региона
Комбинирование регионов
Рисование регионов
Прочие функции
Сохранение и загрузка региона
Общее описание
Windows API предоставляет набор функций, позволяющих описать произвольную (при желании - достаточно сложную) геометрическую фигуру, которая потом может использоваться при работе с окнами, или, в терминологии Delphi, элементами управления. Использование может заключаться, например, в отрисовке на холсте, в задании специфического региона обновления окна, и т.д. Помимо таких вот относительно невинных возможностей, технология регионов позволяяет также глумиться над благородными очертаниями любого потомка TWinControl (иными словами, любым контролом, имеющим Handle, aka TForm, TButton, и т.д.). Особенно широко регионы используются в формах, при их отрисовке и обновлении.
Итак, для начала, давайте разберёмся, что такое этот самый регион.
Регион определяет следующим образом:
Регионом называется прямоугольник, полигон или эллипс (либо комбинация двух или более этих фигур), которые могут быть заполненны, нарисованы, инвертированы, обрамлены и могут использоваться для определения местонахождения курсора (имеется в виду, что есть стандартная функция, определяющая входит ли точка (X,Y) в наш регион).
Существуют три основных типа регионов: прямоугольные, эллиптические, и полигональные. Регионы могут комбинироваться между собой с применением логических операций OR, XOR и т.д.
С точки зрения Windows, регион является обыкновенным объектом GDI, задаваемым дескриптором HRGN. В Delphi также доступен этот тип, и объявление его выглядит следующим образом:
HRGN = type LongWord;
Как видим, ничего сверхъестественного. По сути это указатель на некую структуру в памяти. Структура эта описана следующим образом:
TRgnData
= _RGNDATA;
_RGNDATA
= record
rdh:
TRgnDataHeader;
Buffer:
array[0..0] of CHAR;
Reserved:
array[0..2] of CHAR;
end;
_RGNDATA объявлена немного иначе:
TRgnDataHeader
= _RGNDATAHEADER;
_RGNDATAHEADER
= packed record
dwSize:
DWORD;
iType:
DWORD;
nCount:
DWORD;
nRgnSize:
DWORD;
rcBound:
TRect;
end;
Вот его стоит рассмотреть подробнее.
dwSize:
Указывает размер заголовка (т.е. _RGNDATAHEADER) в байтах;
iType:
Тип региона, всегда равен RDH_RECTANGLES = 1;
nCount:
Кол-во прямоугольников, из которых составлен регион;
nRgnSize:
Размер буфера, необходимого для получения структуры TRect, указывающей координаты прямоугольников, составляющих регион. Если размер неизвестен, поле может быть равно нулю;
rcBound:
Координаты прямоугольника, в который вписан регион.
Вот именно эта структура и задаёт регион, как таковой, и именно с ней работают практически все функции API.
Функции создания/удаления регионов
Функция |
Синтаксис |
Описание |
CombineRgn |
function CombineRgn (p1, p2, p3: HRGN; p4: Integer): Integer; stdcall; |
Создаёт новый регион p1, комбинируя регионы p2 и p3 на основе режима p4 |
CreateEllipticRgn |
function CreateEllipticRgn (p1, p2, p3, p4: Integer): HRGN; stdcall; |
Создаёт эллиптический регион по четырём координатам |
CreateEllipticRgnIndirect |
function CreateEllipticRgnIndirect (const p1: TRect): HRGN; stdcall; |
Создаёт эллиптический регион, впсанный в заданный прямоугольник p1 |
CreatePolygonRgn |
function CreatePolygonRgn (const Points; Count, FillMode: Integer): HRGN; stdcall; |
Создаёт полигональный регион по массиву точек Points с числом вершин Count с режимом заливки FillMode |
CreatePolyPolygonRgn |
function CreatePolyPolygonRgn (const pPtStructs; const pIntArray; p3, p4: Integer): HRGN; stdcall; |
Создаёт регион, состоящий из серии полигонов, задаваемых массивом точек pPtStructs, число вершин каждого из которых указывается в массиве pIntArray с общим числом вершин p3 и режимом заливки p4 |
CreateRectRgn |
function CreateRectRgn (p1, p2, p3, p4: Integer): HRGN; stdcall; |
Создаёт прямоугольный регион по четырём координатам |
CreateRectRgnIndirect |
function CreateRectRgnIndirect (const p1: TRect): HRGN; stdcall; |
Создаёт прямоугольный регион по заданному прямоугольнику p1 |
CreateRoundRectRgn |
function CreateRoundRectRgn (p1, p2, p3, p4, p5, p6: Integer): HRGN; stdcall; |
Создаёт прямоугольный регион по координатам p1-p4 с эллиптически закруглёнными краями с высотой эллипса скругления p5 и шириной p6 |
ExtCreateRegion |
function ExtCreateRegion (XForm: PXForm; Count: DWORD; const RgnData: TRgnData): HRGN; stdcall; |
Создаёт регион по его данным RgnData размером Count с указанной трансформацией XForm |
DeleteObject |
function DeleteObject (p1: HGDIOBJ): BOOL; stdcall; |
Удаляет регион и освобождает все, занятые под него ресурсы |
