2009-04-24 6 views
2

Zuerst arbeite ich an Win32 mit C++.Wie erstellt man ein transparentes Fenster mit nicht transparenten untergeordneten Steuerelementen (oder untergeordneten Fenstern)?

Ich habe versucht, ein transparentes Fenster mit einem Kind Fenster zu implementieren, die zu 100% undurchsichtig bleiben sollen. Es scheint, dass untergeordnete Steuerelemente keine Deckkraft besser (niedriger) als das übergeordnete Element haben können und wenn ich mein übergeordnetes Element 100% transparent mache, erbt mein untergeordnetes Steuerelement auch die Transparenz.

-Code, die ich verwende -

SetLayeredWindowAttributes(GetParent(parentWindowHwnd), 0, 0, LWA_COLORKEY, LWA_ALPHA); 

Jede Hilfe?

Bitte auch antworten, wenn ich mit meiner Frage nicht ganz klar bin.

Antwort

1

Ich bin sicher, dass Sie es in die andere Richtung tun können rund, das heißt ein undurchsichtiges Hauptfenster mit einem transparenten Kind Fenstern, so auch das Gegenteil wahr sein kann. Haben Sie unsetting die WS_EX_LAYERED Flags für die Kind Fenster versucht und dann neu zu zeichnen sie es völlig undurchsichtig wieder zu machen?

// Remove WS_EX_LAYERED from the window styles 
SetWindowLong(hChildWnd, 
       GWL_EXSTYLE, 
       GetWindowLong(hChildWnd, GWL_EXSTYLE) & ~WS_EX_LAYERED); 

RedrawWindow(hChildWnd, 
      NULL, 
      NULL, 
      RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN); 

Die MSDN-Seite auf Layered Windows kann auch helfen.

+0

versucht, aber das hat nicht funktioniert. –

+0

@ManojAwasthi: Wenn es Ihr Problem nicht gelöst hat, akzeptieren Sie es nicht als Antwort. – IInspectable

+0

Ja. Frühe Tage, als ich SO nicht genug verstanden habe. Vielen Dank. –

4

Sie können dies leider nicht tun, untergeordnete Fenster haben immer die gleiche Deckkraft wie ihre Eltern. Die Google Desktop Toolbar hatte einen ordentlichen Trick, um die Illusion einer undurchsichtigen Textbox auf einem durchscheinenden Hintergrund zu erzeugen. Sie erstellten zwei oberste Fenster, eines für den Hintergrund und eines für das Textfeld. Dann setzen sie das Hintergrundfenster als Eigentümer (nicht die übergeordnete) der texbox. Sie setzen dann den Hintergrund transparent. Es ist ziemlich viel Arbeit, um es richtig zu machen, aber es ist der einzige Weg, dies zu tun, ohne das Ganze selbst mit UpdateLayeredWindow zu rendern.

+0

Schnelle Frage: Wie setze ich das Hintergrundfenster als Besitzer der Texbox? – Stefan

+2

Nur zu aktualisieren, beginnend mit Windows 8 ist dies nicht mehr wahr. Jetzt können Kinder geschichtet werden. – Lothar

0

Sie können eine untergeordnete Kontrolle nicht weniger transparent machen als ihre Eltern. Der übliche Ansatz besteht darin, Ihrem Fenster eine unregelmäßige Form zu geben: kein Rechteck. Dies ist viel älter als Alpha-Transparenz - Denken Sie an eine Uhr Anwendung: Sie können Ihr Fenster rund machen, wenn Sie wollten, auch auf Windows 95.
Dies könnte mit der Windows-API-Funktion SetWindowRgn:
Eine einfache (vb) example Google results

Verwandte Themen