ColorMath class
Functions for blending of multiple colours, conversion between HSL and RGB colour space, greyscale conversion and more helper functions for handling of colours.
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.
Compatibility:
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.
Licence and terms of use
Copying and distribution of this file, with or without modification, are permitted provided the copyright notice and this notice are preserved. This file is offered as-is, without any warranty. (GNU All-Permissive licence)
Statistic data
- Created on 2007-08-30, updated on 2012-01-13.