BigBastis Blog

.NET: Ein Transparentes Label erstellen

Introduction

user

Sebastian Gross

Sebastian 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.


LATEST POSTS

Handling too long scrollspy menus 10th June, 2015

Java: Create ZIP archive 23rd March, 2015

.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.

profile

Sebastian Gross

http://www.bigbasti.com

Sebastian 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.

Comments
user

Author bigbasti87

Posted at 06:12 8. September 2010.

Bloggd: .NET: Ein Transparentes Label erstellen – http://blog.bigbasti.com/net-ein-transpa

user

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

Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

View Comments (2) ...
Navigation