// Unter Punkt 1. und Punkt 2. ist das Fenster scheinbar durchsichtig, weil der
// Hintergrund nicht gezeichnet wird. Bei Veränderung der Position des Fensters
// oder Änderung des Desktops, ist es jedoch deutlich erkennbar.

// Man nutzt diese Prozedur, um das Zeichnen des Standard-Hintergrundes
// zu unterdrücken, wenn man einen eigenen Fensterhintergrund (Bitmap)
// definiert hat. Siehe dazu auch
den Fensterhintergrund mit einem Bild ausfüllen
// Unter
3. wird das Fenster mittels Regionen tatsächlich durchsichtig.

// Getestet mit D4 unter Win98

// 1. (interessante) Möglichkeit 
... 
private 
procedure WMEraseBkgnd(var m: TWMEraseBkgnd); message WM_ERASEBKGND; 
public 
{ Public-Deklarationen} 
end; 
 
var 
  Form1: TForm1; 
 
implementation 
 
{$R *.DFM} 
 
procedure TForm1.FormCreate(Sender: TObject); 
begin 
  borderstyle := bsNone; 
end; 
 
procedure TForm1.WMEraseBkgnd(var m: TWMEraseBkgnd); 
begin 
  m.Result := LRESULT(False); 
end; 
 
procedure TForm1.Button1Click(Sender: TObject); 
begin 
  close; 
end; 
 

// 2. (einfache) Möglichkeit 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
  borderstyle := bsNone; 
  brush.style := bsclear; 
end; 
 
procedure TForm1.Button1Click(Sender: TObject); 
begin 
  close; 
end; 

// 3. (empfohlene) Möglichkeit

    ...
    Button1: TButton; 
    Button2: TButton; 
    procedure Button1Click(Sender: TObject); 
    procedure Button2Click(Sender: TObject); 
  private 
    { Private-Deklarationen } 
  public 
    procedure durchsichtig; 
    procedure normal; 
  end; 
 
var 
  Form1: TForm1; 
 
implementation 
 
{$R *.DFM} 
 
var 
  RGN: HRGN; 
 
procedure TForm1.durchsichtig; 
var 
  c: TControl; 
  i, rand, x, y, cx, cy: Integer; 
  clientRgn, cRgn: HRGN; 
begin 
  rand := (width - ClientWidth) div 2; 
  RGN := CreateRectRgn(0, 0, width, height); 
  x := rand; 
  y := height - ClientHeight - rand; 
  clientRgn := CreateRectRgn(x, y, x + ClientWidth, y + ClientHeight); 
  CombineRgn(RGN, RGN, clientRgn, RGN_DIFF); 
  for i := 0 to ControlCount - 1 do 
  begin 
    c := Controls[i]; 
    if (c is TWinControl) or (c is TGraphicControl) then 
      with c do begin 
        if visible then begin 
          cx := x + Left; 
          cy := y + Top; 
          cRgn := CreateRectRgn(cx, cy, cx + width, cy + height); 
          CombineRgn(RGN, RGN, cRgn, RGN_OR); 
        end; 
      end; 
  end; 
  SetWindowRgn(handle, RGN, true); 
end; 
 
procedure TForm1.normal; 
begin 
  RGN := CreateRectRgn(0, 0, width, height); 
  SetWindowRgn(handle, RGN, true); 
end;                                                    
 
procedure TForm1.Button1Click(Sender: TObject); 
begin 
  durchsichtig; 
end; 
 
procedure TForm1.Button2Click(Sender: TObject); 
begin 
  normal; 
end;

Siehe dazu auch Punkt 6 unter Fenstern verschiedene Umrisse zuweisen


 

Zugriffe seit 6.9.2001 auf Delphi-Ecke