Листинг 1.19. Построение региона по шаблону
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;
Загрузка изображения-шаблона и создание региона может происходить, например, при создании формы следующим образом (листинг 1.20).