Акжан в сети - На уровень вверх(W32) Как создать окна непрямоугольной формы и работать с ними?

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

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

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

Jouri Mamaev

(2:5080/80.66)

и другие.


Попpобуйте вот этот обpаботчик OnCreate :)

Hа меня это пpоизвело впечатление.

procedure TForm1.FormCreate(Sender: TObject);
const W=36*pi/180;
var R,R1,R2: HRgn; X,Y,i:integer;

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 GetStarReg(X,Y,R:integer):HRGN;
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;

Alexander Burnashov

alex@arta.spb.su
(2:5030/254.36)