Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Transparente, "Durchklickbare" Form aber Inhalte anzeigen?


MephistoFFF - Do 15.01.15 21:51
Titel: Transparente, "Durchklickbare" Form aber Inhalte anzeigen?
Hallo!

Ich versuche gerade ein kleines Programm zu schreiben welches mir einen Rahmen aus TLabels um bzw über ein anderes, fremdes Fenster legt.
Ich positionere dazu 4 TLabels in Rahmenform auf einer Form (Borderstyle bsnone) und lasse die Form über besagtes Fenster legen.
Ich muss nun den Bereich innerhalb des Rahmens transparent und vor allem auch "durchklickbar" bekommen, dass ich das Programm hinter meinem Rahmen immer noch bedienen kann. Ich habe Google nun weit über eine Stunde lang gequält aber habe nichts brauchbares gefunden.

Ist das überhaupt möglich? Vielen dank schon mal im Voraus!


Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Do 15.01.2015 um 22:27


Martok - Do 15.01.15 22:59

Moin!

Du suchst Layered Windows [http://msdn.microsoft.com/en-us/library/ms997507.aspx]. Eigentlich konnte ich mich noch an SetWindowRgn erinnern, aber so wie die das in diesem Artikel schreiben, war das schon 2000 nicht mehr cool :lol:

Je nach Anwendungsfall (einfache Formen) könnte SetWindowRgn [http://msdn.microsoft.com/en-us/library/windows/desktop/dd145102%28v=vs.85%29.aspx] allerdings trotzdem einfacher sein. Wenn du das nur einmal machen musst, kannst du die Region prinzipiell auch aus einem Bitmap generieren [http://delphi.xcjc.net/viewthread.php?tid=44431]. An der Stelle lohnt sich dann allerdings ein LayeredWindow schon fast wieder.


WasWeißDennIch - Fr 16.01.15 08:24

Evtl. interessant: http://www.delphipraxis.net/155563-semitransparente-fenster-mittels-update-layeredwindow.html oder auch http://parnassus.co/transparent-graphics-with-pure-gdi-part-1/


MephistoFFF - Sa 17.01.15 19:24

Danke, hat funktioniert!


Quelltext
1:
2:
3:
4:
CLFRgn:=CreateRectRgn(0,0,Form1.Width,Form1.Height);
CLFRgnTmp:=CreateRectRgn(PanelLeft.width,PanelTop.Height,Form1.Width-PanelRight.width,panelBottom.top);
CombineRgn(CLFRgn,CLFRgn,CLFRgnTmp,RGN_DIFF);
SetWindowRgn(Form1.Handle,CLFRgn,True);