CodeNet / Платформы / Windows / Windows API
Области и API-функции работы с ними
26 марта 2006 года
В класс TCanvas Delphi не входит интересный графический объект Windows - область (Region). Область формируется из простейших геометрических фигур, таких как эллипс, многоугольник и т.п. С помощью областей можно значительно разнообразить графическое оформление своих программ. Появляются такие возможности, например, как создание эллиптических или другой формы кнопок, окон. Замечу, что именно для таких применений целесообразно использовать области. Для обычного рисования вполне достаточно средств класса TCanvas.
Для создания нестандартного окна нужно лишь немного изменить файл проекта. Следующий пример делает форму эллиптической (привожу файл проекта полностью):
program Project1; Uses Forms, Unit1 in 'Unit1.pas' {Form1}, Windows; // добавляем сами (функции API) {$R *.RES} var Region: Cardinal; // добавляем переменную Begin Application.Initialize; Application.CreateForm(TForm1, Form1); // добавляем в стандартный файл проекта несколько строк: with Form1.Canvas, Form1 do begin Region := CreateEllipticRgn(0, 0, Width, Height); SetWindowRgn(Handle, Region, True); end; Application.Run; end.
Как видно, мы добавили вызов двух функций API: CreateEllipticRgn и SetWindowRgn. Эти функции будут описаны ниже.
Следующий пример демонстрирует создание кнопки со скругленными углами. Создайте новый проект, поместите обычную кнопку на форме и добавьте следующий обработчик нажатия кнопки:
procedure TForm1.Button1Click(Sender: TObject); var Region: Cardinal; begin with Button1 do begin Region := CreateRoundRectRgn(0, 0, Width, Height, 20, 20); SetWindowRgn(Handle, Region, True); end; end;
Запустите проект и щелкните по кнопке. В результате кнопка станет скругленной по углам. Скругление углов производит функция CreateRoundRectRgn.
В таблице 1 приведены описания функций API по созданию областей различной формы:
Таблица 1.
function CreateEllipticRgn(X1, Y1, X2, Y2: Integer) : Cardinal; |
Создает эллиптическую область.
|
function CreateRoundRectRgn(X1, Y1, X2, Y2, H, W: Integer): Cardinal; |
Создает область "прямоугольник со скругленными углами".
|
function CreatePolygonRgn(Const Points; Count, PolyFillMode: Integer): Cardinal; |
Создает область в виде многоугольника.
|
function CreateRectRgn(X1, Y1, X2, Y2: Integer): Cardinal; |
Создает область в виде прямоугольника.
|
Следующая, упоминавшаяся в примерах функция - SetWindowRgn - имеет следующее описание:
function SetWindowRgn (DC, Rgn: Cardinal; Redraw: Bool): Integer;
Выводит принадлежащую окну с канвой DC область Rgn вместо окна; Redraw- разрешает (True) / запрещает (False) перерисовку области; все не вошедшие в область части окна не показываются. Любые заливки области, ее очерчивание и объединение с другими областями игнорируются.
В таблице 2 приводятся дополнительные функции API по работе с областями:
Таблица 2.
function CombineRgn(DestRgn, Rgn1, Rgn2: Cardinal; CombineMode: Ineger): Integer; | Объединяет две области в одну.
Параметр CombineMode может иметь следующие значения:
До применения функции область DestRgn уже должна существовать и иметь размеры, достаточные для размещения объединенной области. |
function EqualRgn(Rgn1,Rgn2: Cardinal): Bool; | Проверяет эквивалентность двух областей. Rgn1, Rgn2 - дескрипторы сравниваемых областей. |
function FillRgn(DC, Rgn,Brush: Cardinal): Bool; | Закрашивает область кистью.
|
function FrameRgn(DC, Rgn,Brush: Cardinal; Width,Height: Integer): Bool; | Обводит область кистью высотой Height и шириной Width пикселей.
|
function InvertRgn(DC, Rgn:Cardinal): Bool; | Инвертирует цвет всех точек внутри области.
|
function OffsetRgn(DC, Rgn:Cardinal; dX, dY: Integer):Integer; | Смещает область на dX по горизонтали и на dY по вертикали.
|
function PaintRgn(DC, Rgn:Cardinal): Bool; | Закрашивает область текущей кистью.
|
function PtInRegion(Rgn:Cardinal; X, Y: Integer):Bool; | Проверяет принадлежность точки (X,Y) области с дескриптором Rgn. |
function RectInRegion(Rgn:Cardinal; Rect: TRect):Bool; | Проверяет принадлежность прямоугольника Rect области с дескриптором Rgn. |
Данная статья призвана восполнить недостающие возможности класса TCanvas среды Delphi по работе с областями. В классе TCanvas недостает некоторых возможностей Windows и по выводу текста, в частности, отсутствуют возможности вывода вертикального текста и текста под произвольным углом. Попытку восполнить этот пробел я сделал в другой моей статье - "Вывод текста средствами API".
Оставить комментарий
Комментарии
22.12.2016г.