ColorMath-Klasse
Funktionen zum Überblenden mehrerer Farben, zur Konvertierung zwischen HSL- und RGB-Farbraum, Graustufen-Konvertierung und weitere Hilfsfunktionen zum Umgang mit Farben.
Das Problem
Eine gute Praxis für GUI-Anwendungen ist es, das vom Benutzer ausgewählte Farbschema zu beachten, anstatt generell alle Listen weiß und alle Schaltflächen grau darzustellen. Das sorgt für vertraute Farben auf dem Bildschirm und ist ein Baustein für Software, die sich gut in das Betriebssystem integriert. Das führt zu einer höheren wahrgenommenen Qualität des Programms und letztlich zu mehr Anwenderakzeptanz.
Für Windows-Forms-Anwendungen stellt das .NET-Framework die SystemColors
-Klasse bereit, mit deren Eigenschaften die Farbwerte der einzelnen GUI-Bestandteile abgerufen werden können. Oft möchte man aber eine dieser Farben verändern, sie heller oder dunkler gestalten, oder zwei Farben miteinander mischen. Bei der Verwendung konstanter Farben kann man das zur Entwurfszeit mit jedem Bildbearbeitungsprogramm oder meinem Farbeimer austüfteln. Wenn dynamische Farben verwendet werden, ist das aber nicht möglich, sondern die Mischberechnung muss dann zur Laufzeit erfolgen. Das ist mathematisch kein Problem, aber im Code auf die Dauer doch recht unübersichtlich.
Die Lösung
Die ColorMath-Klasse vereinfacht den Umgang mit Farben. Mehrere Farben können mit einem Funktionsaufruf in einem beliebigen Verhältnis gemischt, aufgehellt oder abgedunkelt werden. Das ermöglicht bereits die Herstellung der meisten Farbtöne und -schattierungen, die für eine intuitive Benutzeroberfläche benötigt werden. Je nach Helligkeit (Grauwert für das menschliche Auge) einer Hintergrundfarbe kann automatisch die passende Schriftfarbe (z. B. schwarz oder weiß) gewählt werden, um die beste Lesbarkeit sicherzustellen.
Mit der Konvertierung zwischen dem RGB- und dem HSL-Farbraum lassen sich die Farben zudem viel intuitiver zusammenstellen. So können die Komponenten Farbton, Sättigung und Helligkeit unabhängig voneinander eingestellt werden. Einen leichten Einstieg in die Zusammenhänge der Farbräume bietet die Anwendung Farbeimer, die ebenfalls diese Klasse verwendet.
Kompatibilität:
Beispiel
Die folgenden Beispielcode-Schnipsel zeigen, wie die ColorMath-Klasse verwendet werden kann:
var selectionColor = ColorMath.Blend(SystemColors.Highlight, listItem.BackColor, 0.5);
// ToolStrip-Hintergrund bei Windows-XP-typischem Grau etwas aufhellen
Color backColor;
if (ColorMath.RgbToHsl(SystemColors.Control).L > 215)
{
// Could be Aero (L=240) or Luna (L=225-226),
// the Control colour is (almost) light enough to use it directly
// (A little lighting up makes it better)
backColor = ColorMath.Blend(SystemColors.Control, SystemColors.Window, 0.2);
}
else
{
// Could be Classic (L=206), the Control colour is too dark and must be lit up
// (keeping its hue)
backColor = ColorMath.Blend(SystemColors.Control, SystemColors.Window, 0.6);
}
toolStrip1.BackColor = backColor;
// Benutzer hat den Farbton und eine relative Helligkeit (1 bis 5) ausgewählt,
// Farbwert zur Anzeige berechnen
var hsl = new HslColor(hue, 200, 128 + (light - 3) * 32);
var userColor = ColorMath.HslToRgb(hsl);
Download
ColorMath.cs4,4 KiBQuelltext der ColorMath-Klasse
Änderungen
Darken
und Lighten
MixedColor
in Blend
umbenannt.
GetLightness
in ToGray
umbenannt.
GetLightness
und IsDarkColor
MixedColor
-Funktion.
Lizenz und Nutzungsbedingungen
Vervielfältigung und Weiterverbreitung dieser Datei, verändert oder unverändert, sind gestattet, vorausgesetzt die Urheberrechtsangabe und dieser Hinweis bleiben erhalten. Diese Datei wird wie vorliegend ohne jegliche Garantie oder Gewährleistung angeboten. (GNU All-Permissive-Lizenz)
Statistische Daten
- Erstellt am 2007-08-30, aktualisiert am 2012-01-13.