Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Formbereiche Transparent machen


maxk - Mi 06.08.03 10:08
Titel: Formbereiche Transparent machen
Hi,
ich habe auf meinem Form nur ein Label (Caption='Test'; Transparent=True). Logischer Weise, ist von der Transparenz nicht zu sehen, da das Form nicht durchsichtig ist :schade:. Gerade das soll aber so sein. Ich weiß, dass ich Windows mitteilen muss, dass meine Fensterkoordinaten kein Rechteck bilden. Aber wie sage ich Windows, dass mein Fenster nur die Schrift ist. Ich möchte nicht über Images arbeiten, da sich der Inhalt unter meinem Fenster oft ändert. (Wer jetzt noch weiß, was meine Frage ist, hat einen Award verdient :roll: )


oPPi - Mi 06.08.03 10:58
Titel: RE: Formbereiche Transparent machen
Hy,

probiers mal hiermit vielleicht meinste ja sowas:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.FormCreate(sender: TObject);
begin
    Form1.Brush.Style:=bsClear;
    Form1.BorderStyle:=bsNone;
end;

//Fenster schließen
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
    Application.Terminate;
end;

Mußt nur noch in deinem Label.Transparent := True setzten und schon haste das was du wolltest, so wie ich dich verstanden habe.

Gruß

oPPi


maxk - Mi 06.08.03 13:44

Ich wollte gerade schreiben, dass das bei Forms nicht geht. Dann habe ich es ausprobiert :lol:

Es funktioniert :party:


maxk - Mi 06.08.03 14:01

Mist, es funktioniert doch nicht so, wie ich es wollte. Zwar funktioniert der Trick über Brush.Style:
Bild entfernt
Ändert sich aber das Fenster unter dem Programm:
Bild entfernt
D.h. eigentlich arbeitet auch diese Methode mit Images - nur das Delphi sich darum kümmert. Auffällig ist, dass der Hintergrund aktualisiert wird, wenn Windows das Fenster anweist, sich neu zu zeichnen. Also ist eine folgefrage, was ich machen muss, damit das Fenster neugezeichnet wird (Repaint funktioniert nicht).

maxk

PS: Auch über eine andere Lösung des Transparenzproblems wäre ich dankbar.

Edit: Bilder entfernt


Delete - Mi 06.08.03 14:06

Das Stichwort heißt Regions.


maxk - Mi 06.08.03 21:28

Genau, ich glaube die Funktion heißt SetWindowRegion();. Aber wie bekomme ich diese Region - es handelt sich ja nicht um einfache Formen wie Kreise oder Rechtecke. Sondern Text, der sich im laufe des Progs ändert.


maxk - Mi 06.08.03 21:45

Ich hab's. Mit diesem Thread [http://www.delphi-forum.de/viewtopic.php?t=13458], bin ich auf die Idee gekommen.

Delphi-Quelltext
1:
2:
3:
4:
5:
FormStyle:=fsStayOnTop;
BorderStyle:=bsNone;
Color:=clWhite;
TransparentColor:=True;
TransparentColorValue:=clWhite;
Das Delphi-Forum ist Klasse :D

Moderiert von user profile iconTino: Delphi-Tags hinzugefügt.


Thunder00 - Mi 06.08.03 22:09

Hey Leute.

Ich hab das fette Problem, dass ich bis jetzt mit allen Methoden kein Erfolg hatte.

Diese hier:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure FormCreate(Sender: TObject); 
procedure WMEraseBkGnd(var Msg: TWMEraseBkGnd); message WM_EraseBkGnd; 


//für elliptische Formulare: 
procedure TForm1.FormCreate(Sender: TObject); 
var h: THandle; 
begin 
inherited
h := CreateEllipticRgn(Left, Top, Width, Height); 
SetWindowRgn(Handle,h,TRUE); 
end

//für Transparenten Hintergrund: 
procedure TForm1.WMEraseBkGnd(Var Msg: TWMEraseBkGnd); 
begin 
{ kein Hintergrund = Transparent ! } 
end;

und die von oPPi. Ich führe das auf die EasyMove-Funktion zurück, die bei mir noch is.. die sieht so aus:

Diese Procedure musst Du im Private-Abschnitt deklarieren:

Delphi-Quelltext
1:
2:
procedure WMNCHitTest(var M: TWMNCHitTest);
  message wm_NCHitTest;

Und hier die eigentliche Implementation der Procedure:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.WMNCHitTest (var M: TWMNCHitTest);
begin
  inherited;
  if M.Result = htClient then
    M.Result := htCaption;
end;

Ich hab grad noch andere EasyMove-Funktionen gefunden. Ich probier die ma aus, ob es da einbahnfrei funzt... danke schonma...

oPPi's Version is echt genai!

cu

Moderiert von user profile iconTino: Delphi-Tags hinzugefügt.


maxk - Do 07.08.03 15:41

Das Arbeiten mit TransparentColor hat noch einen weiteren Vorteil: Das Form ist nicht nur Transparent, sondern auch (nicht vorhanden). D.h. ein Klick auf die transparente Fläche landet auf dem Fenster unter der App. - Toll!
Mit SetWindowRGN müsste das auch funktionieren.


Delete - Do 07.08.03 15:54

Biutte beachten:
Delphi-Hilfe hat folgendes geschrieben:

Note:
TransparentColor does not work on all systems. The application must be running under Windows 2000 or better, and the machine must be a P90 or better


maxk - Do 07.08.03 15:57

Nein! Das darf doch nicht wahr sein - immer wenn man denkt, dass alles glatt läuft, gibt es doch noch einen Haken. Damit ist die Frage wieder unbeantwortet :cry:


oPPi - Do 07.08.03 19:26

Also ich hab jetzt mal meinen weiter oben geposteten Quelltext unter

getestet und da wird die Form transparent angezeigt, wie das unter Win9x aussieht kann ich leider nicht sagen da ich kein Win98 (SE) mehr am laufen hab.

gruß
oPPi


maxk - Fr 08.08.03 22:38

oPPi hat folgendes geschrieben:
Also ich hab jetzt mal meinen weiter oben geposteten Quelltext unter

    1. WinME (@Luckie)
    2. W2k
    3. WinXP

getestet und da wird die Form transparent angezeigt, wie das unter Win9x aussieht kann ich leider nicht sagen da ich kein Win98 (SE) mehr am laufen hab.
Das Problem ist ein Anderes. Die Form ist nicht transparent, sondern nur auf einem Bild, dass den Hintergrund enthält.


Motzi - Sa 09.08.03 13:54

Leute... Luckie hat doch bereits gesagt das Stichwort heißt Regions!!

Damit kann man auch komplexe Regionen wie zB Schriftzüge erstellen (nicht nur einfach Ellipsen etc)!

Mit:

Quelltext
1:
2:
BeginPath()
EndPath()

erstellst du einen Pfad und mit

Quelltext
1:
PathToRegion                    

erstellst du aus diesem Pfad eine Region die du dann ganz einfach mit SetWindowRgn deinem Fenster zuweisen kannst!


Frase - So 10.08.03 21:14

Luckie hat recht. Beziehungsweise die Delphi-Hilfe.

Die Transparenz funktioniert laut Delphi-Hilfe nur auf XP und 2000.
Ist WinME eigentlich vor oder nach Win2000 rusgekommen? Es heißt ja schließlich Millenium-Edition.

Ich jedenfalls hab noch ein 98 SE und da geht die Transparenz nicht.