Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - transparenter Hintergrund


Schmidti - Sa 01.05.04 23:01
Titel: transparenter Hintergrund
Hallo,

wie bekomme ich denn den Hintergund meiner DELPHI-Anwendung am Besten transparent, so dass die ganzen Objekte dann wie in der Luft schweben?

Danke.

MfG


galagher - So 02.05.04 10:46
Titel: Re: transparenter Hintergrund
Schmidti hat folgendes geschrieben:
wie bekomme ich denn den Hintergund meiner DELPHI-Anwendung am Besten transparent, so dass die ganzen Objekte dann wie in der Luft schweben?


Hallo, das hier ist sicher das, was du suchst:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
{Formular transparent machen}
procedure MakeFormTransparent(Form: TForm);
var
  AControl: TControl;
  A, Margin, X, Y, CtlX, CtlY: Integer;
  ClientRgn, FullRgn, CtlRgn: HRGN;
begin
 with Form do
 begin
  Margin    := (Width - ClientWidth) div 2;
  FullRgn   := CreateRectRgn(00, Width, Height);
  X         := Margin;
  Y         := Height - ClientHeight - Margin;
  ClientRgn := CreateRectRgn(X, Y, X + ClientWidth, Y + ClientHeight);
  CombineRgn(FullRgn, FullRgn, ClientRgn, RGN_DIFF);
  for A := 0 to ControlCount - 1 do
  begin
    AControl := Controls[A];
    if (AControl is TWinControl) or (AControl is TGraphicControl) then with AControl do
      begin
        if Visible then
        begin
          CtlX   := X + Left;
          CtlY   := Y + Top;
          CtlRgn := CreateRectRgn(CtlX, CtlY, CtlX + Width, CtlY + Height);
          CombineRgn(FullRgn, FullRgn, CtlRgn, RGN_OR);
        end;
      end;
  end;
  SetWindowRgn(Form.Handle, FullRgn, True);
 end;
end;

{Formular nicht transparent machen}
procedure UndoFormTransparent(Form: TForm);
var
  FullRgn: HRGN;
begin
 with Form do
 begin
  FullRgn := CreateRectRgn(00, Width, Height);
  CombineRgn(FullRgn, FullRgn, FullRgn, RGN_COPY);
  SetWindowRgn(Handle, FullRgn, True);
 end;
end;


Bedaahr14 - Sa 19.06.04 14:00

Sehr edel gelöst, du könntest allerdings auch nur die Trasparentcolorvalue von der Form auf z.B. schwarz setzen und dann die color auf das gleiche, und transparentcolor:= true. Fertig :wink:


raziel - Sa 19.06.04 14:04

Bedaahr14 hat folgendes geschrieben:
Sehr edel gelöst, du könntest allerdings auch nur die Trasparentcolorvalue von der Form auf z.B. schwarz setzen und dann die color auf das gleiche, und transparentcolor:= true. Fertig :wink:

Was aber afaik nur unter W2k und später funktioniert...

//edit: könnte aber auch sein, dass das nur auf die Alpha-Eigenschaft der Form zutrifft, bin mir nich mehr sicher... Hab grad leider weder W9x mit Delphi drauf zur Hand


MartinPb - Sa 19.06.04 14:31

Bedaahr14 hat folgendes geschrieben:
Sehr edel gelöst, du könntest allerdings auch nur die Trasparentcolorvalue von der Form auf z.B. schwarz setzen und dann die color auf das gleiche, und transparentcolor:= true. Fertig :wink:


Nicht fertig!

Das sind zwei verschiedene Methoden mit zwei verschiedenen Ergebnissen. Deine Methode, Bedaahr14, macht nur das Fourmular durchsichtig. In älteren Windowsversionen kommt an dieser Stelle eine Fehlermeldung, wenn man es nicht abfängt oder Versionsabhängig programmiert. Die Methode von Galagher arbeitet mit Windowsregionen. Alles was innerhalb einer Region ist, ist sichtbar. Alles was außerhalb einer Version ist, ist nicht nur unsichtbar, sondern auch nicht vorhanden. Man kann also nicht nur durch diese leeren Bereiche durchsehen, sondern auch durchklicken. Bei der ersten Variante hat man nur eine durchsichtige Form, bei der zweiten eine Sonderform.


Anonymous - Sa 19.06.04 14:37

Zumindest auf meinem System kann man bei beiden Varianten auch durch das Formular klicken :roll: