2008-12-17 5 views
5

Ich habe eine einfache Benutzersteuerung geschaffen, die manuell mit so etwas wieEinstellung der Eltern eines Usercontrol verhindert, dass es transparent ist

MyUserControl ctrl = new MyUserControl(); 

Die Steuerung entwickelt wurden Backcolor = Color.Transparent haben erstellt und das funktioniert gut, bis ich die Parent des Steuerelements auf ein Formular festgelegt, zu welcher Zeit es in die Farbe des Formulars verwandelt.

Kann klingen wie seine transparente, aber was es tut, ist, alle Kontrollen, die auf dem Formular auch vorhanden sind, auszublenden. Ich bin nicht 100% sicher, es ist das Steuerelement, das einen soliden Hintergrund oder etwas anderes, das passiert, wenn ich es einhakte, was verhindert, dass andere Steuerelemente angezeigt werden.

Grundsätzlich, wenn Sie dies tun

  • Erstellen Sie ein Formular
  • Lassen Sie eine Taste auf sie
  • Im Click-Handler für die Schaltfläche Sie die folgende

Beispiel

MyUserControl ctrl = new MyUserControl(); 
ctrl.Parent = this; 
ctrl.BackColor = Color.Transparent; 
ctrl.Size = this.Parent.ClientRectangle.Size; 
ctrl.Location = this.Parent.ClientRectangle.Location; 
ctrl.BringToFront(); 
ctrl.Show(); 

Grundsätzlich ich Die Benutzersteuerung soll das gesamte Formular überlagern und dabei die darunterliegenden Steuerelemente auf dem Formular anzeigen (daher der transparente Hintergrund). Ich möchte es nicht zur Formularsteuerungssammlung hinzufügen, weil es nicht wirklich zum Formular gehört, es wird einfach oben auf allem anderen gezeigt

Ich habe versucht, das gleiche zu tun, aber ohne die Eltern, aber dann die Kontrolle zeigte sich überhaupt nicht.

Danke!

EDIT: Wenn ich die OnPaintBackground Methode in der Benutzersteuerung überschreiben und verhindern, dass der Hintergrund gemalt wird, funktioniert es, aber das versaut die transparenten Teile eines PNG-Bildes im Bild in der Steuerung mit DrawImage, was Sinn macht.

Antwort

6

Windows Forms unterstützt keine transparenten Steuerelemente.
Sie können diese Einschränkung umgehen, indem Sie die CreateParams-Eigenschaft des Steuerelements überschreiben und einen benutzerdefinierten Stil festlegen (suchen Sie es auf Google).
Weiterhin müssen Sie das Bild Ihres Steuerelements überschreiben, so dass nicht nur Ihr Steuerelement, sondern auch das übergeordnete Steuerelement neu gezeichnet wird. Der Grund ist, dass der Hintergrund gemalt werden muss, bevor sich Ihre Kontrolle selbst malt.
Schließlich sollten Sie die OnPaintBackground-Methode, wie Sie getan haben, überschreiben, um sicherzustellen, dass kein Hintergrund gemalt wird.

Ziemlich ungeschickt, und nicht perfekt, aber es sollte funktionieren.

+0

Meinst du ich sollte das WS_CLIPCHILDREN Flag verwenden, wenn Sie das Kontrollfenster erstellen? – TheCodeJunkie

+0

Nein, ich denke du meinst WS_EX_TRANSPARENT – TheCodeJunkie

+1

Ich habe gerade nachgeschaut. Sie sollten ODER die ExStyle-Eigenschaft der CreateParams-Objekte mit EX_TRANSPARENT (0x00000020) –

Verwandte Themen