Регионы

Ноя 14, 2016

Вступление

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

Задача 1

Ограничить форму размерами определенного контрола

Решение

procedure TForm1.FormCreate(Sender: TObject);
var
  FormRgn: THandle;
begin
  BorderStyle := bsNone;
  FormRgn := CreateRectRgn(Label1.left, Label1.top, 
    Label1.left + Label1.width, Label1.top + Label1.Height);
  SetWindowRgn(Handle, FormRgn, True);
end;Code language: Delphi (delphi)

Комментарий

Изменение стиля рамки формы упрощает получение координат для создания региона, который совпадает с размером компонента Label1.

Design-Time
Run-Time

Задача 2

Получить форму, используя в качестве шаблона изображение

Решение

procedure TForm1.CreateRegionFromBitmap(Bitmap: TBitmap;
  TransparentColor: Tcolor; Range: Integer);
var
  X, Y, FirstX: Integer;
  LastBeen: boolean;
  ComplexRGN, TempRGN: HRGN;
begin
  ComplexRGN := CreateRectRgn(0, 0, 1, 1);
  for Y := 0 to Bitmap.Height - 1 do
  begin
    FirstX := 0;
    LastBeen := false;
    for X := 0 to Bitmap.Width - 1 do
    begin
      if (abs(Bitmap.Canvas.Pixels[X, Y] - TransparentColor) > Range) and
        (X <> pred(Bitmap.Width)) then
      begin
        if not LastBeen then
        begin
          LastBeen := true;
          FirstX := X;
        end;
      end
      else
      begin
        if LastBeen then
        begin
          LastBeen := false;
          TempRGN := CreateRectRgn(FirstX, Y, X, Y + 1);
          CombineRgn(ComplexRGN, ComplexRGN, TempRGN, RGN_OR);
          DeleteObject(TempRGN);
        end;
      end;
    end;
  end;
  SetWindowRgn(Form1.Handle, ComplexRGN, true);
end;Code language: Delphi (delphi)

Комментарий

Разместите на форме нужное изображение в качестве фона, поверх которого можно расположить другие контролы. В методе FormCreate вызовите вышеописанный метод:

procedure TForm1.FormCreate(Sender: TObject);
begin
  CreateRegionFromBitmap(Image1.Picture.Bitmap, clWhite, 1);
end;Code language: CSS (css)

Первый параметр – изображение, второй – цвет фона (прозрачности), третий параметр позволяет указывать точность определения фонового цвета (обычно равен 1 ).

Design-Time
Run-Time

Верификация

Delphi XE5, Win7

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *