•  
Создано: 04.09.2010 3:21:21 · Исправлено: 04.09.2010 3:23:11 · Прочтений: 2551

Существует возможность создавать непрямоугольные окна. За внешний вид формы отвечает регион. Чтобы воспользоваться регионом, необходимо в обработчике события OnFormCreate выполнить действия:

  • объявить переменную типа HRgn;
  • создать регион функцией CreateRectRgn (для прямоугольного региона) или CreateEllipticRgn (для эллиптического региона);
  • установить этот регион для окна функцией SetWindowRgn.

Например, создадим форму в виде окружности.

procedure TfmCircle.FormCreate(Sender: TObject);
Var Region:HRgn;
begin
Region:=CreateEllipticRgn(30,30,400,400);
SetWindowRgn(fmCircle.Handle,Region,true)
end;

Для создания более сложных форм используется объединение нескольких регионов с помощью функции CombineRgn:

CombineRgn (Rez, A, B: HRgn, fmCombineMode: integer): integer;

где Rez – регион, получаемый после объединения,

A, B – исходные регионы,

fmCombineMode – режим объединения.

Режим объединения задаёт правила, по которым происходит получение результата:

  • Rgn_AND– создаёт регион, являющийся пересечением исходных регионов;
  • Rgn_COPY – создаёт копию региона A;
  • Rgn_DIFF – вычитает из A B;
  • Rgn_OR – объединяет А и B;
  • Rgn_XOR – исключает из объединения А и B зону перекрытия.

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

В качестве примера приведён код создания прямоугольной формы с круглым отверстием и кнопкой для закрытия.

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TfmComby = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
var
fmComby: TfmComby;
implementation
{$R *.dfm}
procedure TfmComby.FormCreate(Sender: TObject);
Var A,B:HRgn;
begin
A:=CreateRectRgn(20,20,400,400);
B:=CreateEllipticRgn(125,125,285,285);
CombineRgn(A,A,B,Rgn_DIFF);
SetWindowRgn(fmComby.Handle,A,true)
end;
procedure TfmComby.Button1Click(Sender: TObject);
begin
Close;
end;
end.