Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Formular an bestimmten stellen halbtransparent machen


cbs - Sa 28.08.04 12:35
Titel: Formular an bestimmten stellen halbtransparent machen
hallo users

ich möchte meine form an bestimmten stellen transparent machen. nicht ganz durchsichtig sondern nur halb mit ca 30% transparenz

ich hab mir schon folgenden code angeschaut:

http://www.swissdelphicenter.ch/de/showcode.php?id=982


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:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
private 
    { Private declarations } 
    FullRgn, ClientRgn, CtlRgn: THandle; 
    procedure MakeTransparent; 
    procedure UndoTransparent; 
  end

{...} 

implementation 

{...} 

procedure TForm1.MakeTransparent; 
var 
  AControl: TControl; 
  A, Margin, X, Y, CtlX, CtlY: Integer; 
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(Handle, FullRgn, True); 
end

procedure TForm1.UndoTransparent; 
begin 
  FullRgn := CreateRectRgn(00, Width, Height); 
  CombineRgn(FullRgn, FullRgn, FullRgn, RGN_COPY); 
  SetWindowRgn(Handle, FullRgn, True); 
end

// Test it: 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
  MakeTransparent 
end

procedure TForm1.Button1Click(Sender: TObject); 
begin 
  UndoTransparent 
end;


das scheint genau das zu sein was ich brauche. nur ist der bereich der dort definiert wird voll transparent. gibt es eine möglichkeit für diesen bereich (wie bei TForm AlphaBlend) einen transparent wert zu übergeben?

danke schon einmal im vorraus

mfg cbs


Tino - So 29.08.04 10:53

Guten Morgen!

Ich habe das jetzt nicht getestet aber versuche doch mal die Rect-Angabe in Zeile 20 zu ändern um zu schauen ob man so den Bereich bestimmen kann welcher Transparent dargestellt wird.

Gruß
Tino


cbs - So 29.08.04 11:12

hallo Tino

ja ich kann unter anderem mit dieser angabe den bereich bestimmen.

das ist auch genau das was ich brauche.

nur möchte ich diesen bereich halbtransparent machen. mit oben genannten code ist der bereich vollkommen durchsichtig. ich möchte aber die transparenz wie beim formular (alpablend und alphablendvalue) einstellen können, um z.b. eine 30% transparenz zu erreichen.

es geht also nicht um die definition des bereiches sondern um den grad der transparenz.

trotzdem danke für deine antwort :)


Delete - So 29.08.04 12:10

Ich behaupte jetzt mal, dass es so nicht möglich ist. Alphablend ist ja eine Eigenschaft einer Form. Ich kann mir nicht vorstellen, dass man sozusagen für verschiedene Bereiche der Form auch verschiedene Alphablend werte setzen kann.

Die einige, aber recht komplizierte Lösung, die ich sehe, ist, mehrere Form zu erzeugen und die dann in die jetzigen "ganz durchsichtigen" Löcher maßgerecht reinzuschneidern. Dann kannst du bei denen jeweils die Alphablend Werte nach Belieben setzen.


cbs - So 29.08.04 12:41

hallo Elite*

wenn ich mehrere forms syncron verschieben kann wärs eine lösung.

mir ist aber grade der gedanke gekommen das es auch reichen würde wenn ich das ganze andersrum angehe. heißt das formular 30% tranzparent mache und ich einige elemente voll darstelle. ich brache nur ein paar linien (TShape oder über canvas gemahlt) ein paar labels (oder von mir aus auch über canvas gemahlt) und 2 oder 3 buttons.

ist also nicht viel.

gibs da eine möglichkeit?


Delete - So 29.08.04 13:17

cbs hat folgendes geschrieben:
ich brache nur ein paar linien (TShape oder über canvas gemahlt) ein paar labels (oder von mir aus auch über canvas gemahlt) und 2 oder 3 buttons.


Tja, da gibt es nur ein Problem: All diese Steuerelemente haben auch 30% Transparenz. Oder kann man das irgendwie abstellen?

Ich würde nach wie vor zu Variante 1 tendieren.