.NET
.NET: Ein Transparentes Label erstellen
Posted on .Immer häufiger fragen Leute in Foren nach, wie man das Label dazu bringen kann den Hintergrund transparent darzustellen. Es wird vieles versucht, doch am Ende müssen alle feststellen, dass es mit dem „normalen“ Label aus dem Framework nicht möglich ist eine transparente Darstellung zu erreichen.
Bild1: So wie es ist und wie es sein sollte
Das verwirrende hierbei ist, dass das Label es erlaubt die Hintergrundfarbe auf „Transparent“ zu stellen, doch das macht den Hintergrund nicht wirklich transparent, sondern setzt den Hintergrund des Labels auf das des Containers in dem sich das Label befindet. Also wenn man das Label auf der Form Platziert und die Form Blau als Hintergrundfarbe hat wird das Label ebenfalls Blau als Hintergrund bekommen, wenn es auf Transparent gestellt ist.
Dies erweckt den Eindruck von Transparenz, doch was wenn man andere Steuerelemente oder Farbverläufe mit dem Label überdeckt? – Das führt zu einem unschönem Ergebnis (siehe Bild oben). Um diesen Fall ordentlich darzustellen muss man das Control selber zeichnen.
Ich habe hier für euch eine kleine Klasse namens TransparentLabel erstellt, dass nach einem Compile-Vorgang in eurer Werkzeugleiste als Steuerelement auftauchen wird. Hierbei mache ich nichts anderes, als den Text des Controls selbst zu zeichnen und dafür zu sorgen dass der Hintergrund nicht gezeichnet wird in dem man die Methode überschreibt und leer lässt.
Hier der Code:
//Unser Transparent Label erbt alles vom "nemalen" Control class TransparentLabel : Control { //Wenn sich der Text ändert soll das Steuerelement //neugezeichnet werden protected override void OnTextChanged(EventArgs e) { base.OnTextChanged(e); Invalidate(); } //Das Zeichnen des Elements übernehmen wir selbst: protected override void OnPaint(PaintEventArgs e) { //base.OnPaint(e); //Erst erstellen wir einen Pinsel mit der Farbe //Die der Benutzer für das Control eingestellt hat Brush myBrush = new SolidBrush(ForeColor); //Den Text zeichnen e.Graphics.DrawString(Text, Font, myBrush, new PointF(-1, 0)); } //Den Hintergrund nicht zeichnen protected override void OnPaintBackground(PaintEventArgs pevent) { //base.OnPaintBackground(pevent); } //Mit dem Überschreiben der CreateParams //Können wir den Hintergrund "wirklich" //tranzparent machen. protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.ExStyle |= 0x20; return cp; } } }Und für VB.NET Nutzer:
Class TransparentLabel Inherits Control 'Wenn sich der Text ändert soll das Steuerelement 'neugezeichnet werden Protected Overrides Sub OnTextChanged(e As EventArgs) MyBase.OnTextChanged(e) Invalidate() End Sub 'Das Zeichnen des Elements übernehmen wir selbst: Protected Overrides Sub OnPaint(e As PaintEventArgs) 'base.OnPaint(e); 'Erst erstellen wir einen Pinsel mit der Farbe 'Die der Benutzer für das Control eingestellt hat Dim myBrush As Brush = New SolidBrush(ForeColor) 'Den Text zeichnen e.Graphics.DrawString(Text, Font, myBrush, New PointF(-1, 0)) End Sub 'Den Hintergrund nicht zeichnen Protected Overrides Sub OnPaintBackground(pevent As PaintEventArgs) 'base.OnPaintBackground(pevent); End Sub 'Mit dem Überschreiben der CreateParams 'Können wir den Hintergrund "wirklich" 'tranzparent machen. Protected Overrides ReadOnly Property CreateParams() As CreateParams Get Dim cp As CreateParams = MyBase.CreateParams cp.ExStyle = cp.ExStyle Or &H20 Return cp End Get End Property End Class
Wie man sieht ist es wirklich nicht viel (Ergebnis seht ihr ja im Bild oben). Ich habe hier zwar nur die Grundfunktionen implementiert, diese reichen aber schon völlig aus, um es als ein transparentes Label zu benutzen. Nach Bedarf könnt ihr diese Klasse ja schnell und einfach erweitern.
Sebastian Gross
http://www.bigbasti.comSebastian Gross arbeitet in Bielefeld als Softwareentwickler für .NET und Java im Bereich Web.Als Fan der .NET-Plattform lässt er sich kein Userguppen Treffen und Community Event im Raum OWL entgehen.Dabei hat er eine besondere Vorliebe für das ASP.NET MVC Framework und für das Test Driven Development (TDD) entwickelt.
Author bigbasti87
Posted at 06:12 8. September 2010.
Bloggd: .NET: Ein Transparentes Label erstellen – http://blog.bigbasti.com/net-ein-transpa…
Author Thomas Baumann
Posted at 21:26 9. September 2010.
Du könntest dir mal MyBase.SetStyle anschaun, denn könntest du dir das CreateParams sparen 😉
Generell ist aber vorsicht geboten mit solchen Controls. Die fressen Resourcen wie sau, leider