Основные функции (см. Help WinAPI), которые тебе понядобятся:
CreateRectRgn - создает прямоугольную область
CreateEllipticRgn - создает эллиптическую область
CreatePolygonRgn - создает многоугольник
CombineRgn - позволяет объединять регионы между собой.
Т.е. можно создать нужную тебе форму (регион), комбинируя эти примитивы с помощью CombineRgn.
Можно создать регион по растру:
Код:
function BitmapToRegion(Bitmap: TBitmap; TransColor: TColor): HRGN;
var X,Y: Integer;
XStart: Integer;
begin
Result := 0;
with Bitmap do
for Y:=0 to Height-1 do begin
X := 0;
while X do begin
// Пропускаем прозрачные точки
while (X<Width and (Canvas.Pixels[X,Y]=TransColor) do Inc(X);
if X >= Width then Break;
XStart := X;
// Пропускаем непрозрачные точки
while (X<Width and (Canvas.Pixels[X,Y]<>TransColor) do Inc(X);
// Создаем новый прямоугольный регион и добавляем его к
// региону всей картинки
if Result=0 then
Result:=CreateRectRgn(XStart, Y, X, Y + 1)
else
CombineRgn(Result, Result,CreateRectRgn(XStart, Y, X, Y + 1), RGN_OR);
end;
end;
end;
Запихнуть создание региона в OnCreate формы. Потом наложить этот регион на другой компонент (хоть TButton, хоть на саму форму), ну и отписать событие нажатия мышкой.
Как элементарный пример:
Код:
// Cоздаем круглый регион
rgn: = CreateEllipticRgn(0,0,100,100);
// Накладываем его на кнопку
SetWindowRgn(Button1.Handle, rgn, true);