unit Unit7;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TfrmTemplate = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmTemplate: TfrmTemplate;

implementation

{$R *.dfm}


//Фукция создает регион, включающий все точки рисунка, цвет которых не равен
//
function RegionFromPicture(pict :TPicture; backcolor: TColor): HRGN;
var
  rgn, resRgn: HRGN;
  x, y, xFirst: Integer;
begin
  resRgn := CreateRectRgn(0, 0, 0, 0); //Результирующий регион
  //Анализируем каждую скан-линию рисунка (по горизонтали)
  for y := 0 to pict.Height - 1 do
  begin
    x := 0;
    while x < pict.Width do
    begin
      if (pict.Bitmap.Canvas.Pixels[x, y] <> backcolor) then
      begin
        xFirst := x;
        Inc(x);
        //Определим часть линии, окрашенной не цветом фона
        while (x < pict.Width) and
              (pict.Bitmap.Canvas.Pixels[x, y] <> backcolor) do Inc(x);
        //Создаем регион для части скан-линии и добавляем его к результурующему
        rgn := CreateRectRgn(xFirst, y, x-1, y+1);
        CombineRgn(resRgn, resRgn, rgn, RGN_OR);
        DeleteObject(rgn);
      end;
      Inc(x);
    end;
  end;

  RegionFromPicture := resRgn;
end;

procedure TfrmTemplate.FormCreate(Sender: TObject);
var
  pict: TPicture;
begin
  //Загрузка изображение и создание региона (считаем, что цвет фона - белый)
  pict := TPicture.Create;
  pict.LoadFromFile('back.bmp');
  SetWindowRgn(Handle, RegionFromPicture(pict, RGB(255,255,255)), TRUE);
end;

end.
