Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Регионы в Delphi.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
90.62 Кб
Скачать

Регионы в 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;

Удаляет регион и освобождает все, занятые под него ресурсы

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]