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
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
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));}}
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));
}
}
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.
(...), 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)
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?
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.
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#...)
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
Der Hintergrund ist schwarz. Die Schrift soll einfach nur mehr oder weniger gut zu sehen sein.
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