CColor - RGB und HLS in einer Klasse kombiniert

English Translation

Die CColor Klasse ist aus der Not heraus entstanden, Farben im HLS Modell zu manipulieren, also z.B. die Helligkeit oder die Farbsättigung direkt zu verändern. Im HLS Modell ist es außerdem sehr einfach, solche Dinge wie einen Farbverlauf zwischen beliebigen Farben zu zeichnen, oder inverse Farben zu bestimmen. Vielleicht wird es ab NT5.0 eine Unterstützung in Form von Konvertierungsfunktionen geben, aber so lange wollte ich nicht warten. Die CColor Klasse kapselt den altbekannten COLORREF Typ und erweitert ihn um das HLS Farbmodell. Ein CColor Objekt repräsentiert eine Farbe, deren RGB und HLS Eigenschaften direkt gelesen und manipuliert werden können. Sie macht den Gebrauch des Typs COLORREF und der dazugehörigen Makros überflüssig.

Ein weiteres praktisches Feature, welches ich in der Win32 API vermisse, sind benannte Farben: dabei lassen sich die am häufigsten benutzten Farben über Namen (und nicht über RGB Werte) ansprechen. Wenn man nur mit wenigen Farben, z.B. zum Hervorheben von Texten arbeitet, führt die Verwendung von benannten Farben meiner Meinung nach zu verständlicherem Code. Außerdem können die Farbnamen zur Kommunikation mit dem Benutzer verwendet werden. Unter X11 gibt schon immer benannte Farben, allerdings mit dem Hintergedanken die damals noch begrenzte Hardwarepalette optimal auszunutzen. In der Internet Explorer Html Dokumentation habe ich ebenfalls benannte Farben entdeckt, und beschlossen, genau diese in die CColor Klasse zu integrieren.

CColor unterstützt die Serialisierung in einem anwenderfreundlichem Textformat, daß sich besonders für die Registry oder Datenbanken eignet.

Das Beispielprogramm demonstriert die Verwendung der CColor Klasse. Im oberen Bereich lassen sich die Parameter, nach denen der Farbkreis gezeichnet wird variieren. Der untere Bereich zeigt alle benannten Farben. Tooltips über dem Farbkreis und den benannten Farben zeigen den Farbnamen und den RGB Wert. Im Beispielprogramm wurden auch einige Tricks für die Behandlung von MFC-Tooltips verwendet. Das gesamte Tooltip-Handling wird von der virtuellen Funktion OnToolHitTest implementiert. Anschauen und staunen (oder schaudern ;-)

ColorApp.png (28672 Byte)
Das CColor Beispielprogramm

ColorApp.exe (32k)
Das Beispielprogramm wurde mit Visual C++ 6.0 übersetzt und benötigt daher auch die neuesten DLLs dieses Compilers.

ColorAppStatic.zip (69k)
Das statisch gelinkte Beispielprogramm sollte auch ohne die neuesten DLLs funktionieren, ist dafür aber deutlich größer (148k).

Demo Source (19k)
Der Quelltext des Beispielprogramms.

CColor Reference
Die ausführliche Dokumentation der CColor Klasse.

Beispiel 2: Zeichnen eines Farbgradienten mit CColor

void DrawGradient(CDC& dc, int x, int y, CColor c1, CColor c2, int width, int height)
{
  ASSERT(width > 0);

  float dh = (c2.GetHue() - c1.GetHue()) / width;
  float dl = (c2.GetLuminance() - c1.GetLuminance()) / width;
  float ds = (c2.GetSaturation() - c1.GetSaturation()) / width;

  for (int i = 0; i < width; ++i)
  {
    CPen pen(PS_SOLID, 1, c1);
    CPen* pOld = dc.SelectObject(&pen);
    dc.MoveTo(x + i, y);
    dc.LineTo(x + i, y + height);
    dc.SelectObject(pOld);
    c1.SetHue(c1.GetHue() + dh);
    c1.SetLuminance(c1.GetLuminance() + dl);
    c1.SetSaturation(c1.GetSaturation() + ds);
  }
}