Как создать окна непрямоугольной формы и работать с ними

Достаточно создать регион нужной формы и вызвать SetWindowRgn -

HRGN rgn := CreateEllipticRgn( 10,10,100,100 );
SetWindowRgn( hMyWnd,rgn ); // Вот и будет круглое окно

При этом регион этот теперь используется Windows и будет уничтожен при закрытии окна.

Попpобуйте вот этот обpаботчик OnCreate : Hа меня это пpоизвело впечатление.

procedure TForm1.FormCreate(Sender: TObject);
const W=36*pi/180;
var
function S(a:integer;R:integer):integer;
begin
Result:=round(R*sin(W*a));
end;

function C(a:integer;R:integer):integer;
begin
Result:=round(R*cos(W*a));
end;

function var P : array [0..4] of TPoint;
begin
P[0] := Point(X, Y-R);
P[1] := Point(X-S(4,R), Y-C(4,R));
P[2] := Point(X-S(8,R), Y-C(8,R));
P[3] := Point(X-S(2,R), Y-C(2,R));
P[4] := Point(X-S(6,R), Y-C(6,R));
Result := CreatePolygonRgn(P, 5, WINDING);
end;

begin
X:=Width div 2;
Y:=Height div 2;
R:=GetStarReg(X,Y,100);
i:=1;
repeat
R1:=GetStarReg(X-S(i,120),Y-C(i,110),40);
CombineRgn(R,R,R1,RGN_OR);
inc(i,2);
until i>9;
R1:=GetStarReg(X,Y,30);
CombineRgn(R,R,R1,RGN_DIFF);

R1:=CreateEllipticRgn(3,3,Width-6,Height-6);
R2:=CreateEllipticRgn(20,10,Width-20,Height-10);
CombineRgn(R1,R1,R2,RGN_DIFF);
CombineRgn(R,R,R1,RGN_OR);

SetWindowRgn(Handle, R, True);
end;

 
« Предыдущая статья   Следующая статья »