Достаточно создать регион нужной формы и вызвать 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; |