Laden...

Label mit transparentem Text

Erstellt von eislady vor 10 Jahren Letzter Beitrag vor 10 Jahren 2.026 Views
E
eislady Themenstarter:in
5 Beiträge seit 2013
vor 10 Jahren
Label mit transparentem Text

Hallo,

ich bin momentan an einem Projekt, bei dem ich LED-Anzeiger darstellen möchte. Bisher funktioniert das eigentlich auch ganz gut, für den dargestellten Text verwende ich Labels. Nun möchte ich gerne noch die unterschiedlichen Helligkeitsstufen der Anzeiger darstellen. Dazu habe ich mir gedacht, dass es am einfachsten wäre, die Labels transparent zu machen (25% Helligkeit => 75% Transparenz oder so ähnlich). Nun habe ich mich eine ganze Weile mit diversen Suchmaschinen rumgeschlagen, aber nix gefunden (außer der Möglichkeit den Hintergrund des Labels komplett verschwinden zu lassen. Vielleicht bin ich aber auch nur zu blöd, die richtigen Suchbegriffe zu finden 🤔 ).
Ich könnte mir auch vorstellen, dass ich ein Objekt über das Label lege, welches verschiedene Transparenzgrade zulässt. Jedoch habe ich in dieser Richtung nichts passendes gefunden.

Also nochmal in Kurzform: Ich suche nach einer Möglichkeit, den Text eines Labels stufenweise transparent zu machen.

Gruß Eislady

T
314 Beiträge seit 2013
vor 10 Jahren

Hi,

du kannst die Transparenz der Hintergrundfarbe über den Alphakanal der Farbe steuern.


label1.Background = Color.FromArgb((int)(25 * 2.55), Color.Black);

Gruß
t0ms3n

309 Beiträge seit 2008
vor 10 Jahren

Wenn ich es richtig verstanden habe geht es aber um halb transparenten Text.
Und die ForeColor Eigenschaft ignoriert leider den Alpha Kanal.

Umständliche Lösung:
Verwende statt des Labels eine PictureBox, zeichne den Text in ein Bitmap(da wird Transparenz unterstützt) und zeige das in der PictureBox an.

using System;class H{static string z(char[]c){string r="";for(int x=0;x<(677%666);x++)r+=c[
x];return r;}static void Main(){int[]c={798,218,229,592,232,274,813,585,229,842,275};char[]
b=new char[11];for(int p=0;p<((59%12));p++)b[p]=(char)(c[p]%121);Console.WriteLine(z(b));}}

T
314 Beiträge seit 2013
vor 10 Jahren

Au da hast Du natürlich recht 😃.

Auch einfach ein kleines CustomLabel tuts in dem Fall wahrscheinlich!?

So alla


  public class TransparencyLabel : System.Windows.Forms.Label
    {
        [Browsable(true)]
        public uint TransparencyLevel
        {
            get;
            set;
        }

        protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
        {
            //base.OnPaint(e);
            var size = e.Graphics.MeasureString(this.Text, this.Font);
            e.Graphics.DrawString(this.Text, this.Font, new SolidBrush(Color.FromArgb((int)(TransparencyLevel * 2.55), this.ForeColor)), new PointF(5, this.Height / 2 - size.Height / 2));
        }
    }

E
eislady Themenstarter:in
5 Beiträge seit 2013
vor 10 Jahren

Danke für die schnellen Antworten!

@scavanger: das ist tatsächlich etwas umständlich, da ich die Texte zur Laufzeit auch noch ändern muss (und da das über Eingangssignale läuft, kenne ich die Texte vorher nicht unbedingt, kann also nicht für alles Bitmaps erstellen)

@t0ms3n: das werd ich morgen früh gleich mal ausprobieren.

S
269 Beiträge seit 2010
vor 10 Jahren

(...), kann also nicht für alles Bitmaps erstellen)(...) Nur um das klarzustellen: Ich denke nicht, dass gemeint war, die Bitmaps vorher per Hand zu erstellen, sondern dynamisch im Code (ähnlich dem Ansatz von t0ms3n)
Nichtsdestotrotz ist aus meiner Sicht die Lösung von t0ms3n besser geeignet (da man eh lieber direkt auf die Form zeichnen sollte statt die PictureBox zu nutzen)

E
eislady Themenstarter:in
5 Beiträge seit 2013
vor 10 Jahren

Oh, war wohl schon nicht mehr so richtig aufnahmefähig gestern^^
(Bin gar nicht mehr auf die Idee gekommen, dass man die Bitmaps ja auch per Code erzeugen kann )

@t0ms3n: Danke! Das ganze funktioniert jetz insofern, dass ich die Labels erstellen kann. Nun habe ich aber noch das Problem, dass ich den Transparenz-Wert im Nachhinein nicht mehr ändern kann. Ich dachte eigentlich, dass ich das über

TLabel.transparencyLevel = 25; 

dann zur Laufzeit verändern kann, aber das klappt leider nicht. Könnt ihr mir sagen, was ich da falsch mache?

T
314 Beiträge seit 2013
vor 10 Jahren

Das Ändern des Wertes muss in dem Moment dann natürlich ein neuzeichen veranlassen oder du stößt dieses direkt für das Label an.

Die Änderung an der Klasse könnte dann so aussehen:

 

private uint _transparencyLevel;

[Browsable(true)]
public uint TransparencyLevel
{
     get { return _transparencyLevel; }
     set 
     { 
            _transparencyLevel = value;
            this.Invalidate();
     }
}

Das hängt natürlich immer von der Anforderung ab.

E
eislady Themenstarter:in
5 Beiträge seit 2013
vor 10 Jahren

Tausend Dank, das ist perfekt!

Die Idee mit dem Neuzeichnen hatte ich auch schon, wusste aber nicht, wie ich das umsetzen kann. (Arbeite erst seit Kurzem mit C#...)

W
123 Beiträge seit 2008
vor 10 Jahren

Hallo eislady,

hat dein Label einen einfarbigen Hintergrund? Dann könntest du die resultierende (alphablended) Vordergrundfarbe ja einfach mithilfe der Hintergrundfarbe berechnen.


int Alpha = 50;

float RBlend = ((label1.ForeColor.R / 255f) *  (Alpha / 255f)) + ((label1.BackColor.R / 255f) * (1f - (Alpha / 255f)));
float GBlend = ((label1.ForeColor.G / 255f) *  (Alpha / 255f)) + ((label1.BackColor.G / 255f) * (1f - (Alpha / 255f)));
float BBlend = ((label1.ForeColor.B / 255f) *  (Alpha / 255f)) + ((label1.BackColor.B / 255f) * (1f - (Alpha / 255f)));

label1.ForeColor = Color.FromArgb( (int)Math.Min(RBlend * 255f, 255f),
                                   (int)Math.Min(GBlend * 255f, 255f),
                                   (int)Math.Min(BBlend * 255f, 255f) );

Gruß
wolpertinger

E
eislady Themenstarter:in
5 Beiträge seit 2013
vor 10 Jahren

Der Hintergrund ist schwarz. Die Schrift soll einfach nur mehr oder weniger gut zu sehen sein.

W
123 Beiträge seit 2008
vor 10 Jahren

Dann kannst du es so machen, wie von mir beschrieben. Bei der Berechnung der Blended Values (RBlend, GBlend, BBlend) musst du statt der aktuellen Vordergrundfarbe des Labels (im Codebeispiel) immer die originale Vordergrundfarbe des Textes verwenden.

Gruß
wolpertinger