CColor

English Translation

[Methodenübersicht]

Die Klasse CColor kapselt den GDI-Farbwert (COLORREF) und erweitert ihn um einige bequeme Funktionen: direktes Manipulieren der RGB und HSL Farbattribute , Stringkonvertierung für das Ablegen in der Registry und anwenderfreundliche Farbnamen. Durch benutzerdefinierte Konstruktoren und Konvertierungsoperatoren kann ein CColor Objekt überall dort benutzt werden, wo ansonsten ein COLORREF Wert erwartet wird.

Die Attribute Red, Green und Blue können einzeln gelesen und verändert werden. Dies ist ein Fortschritt gegenüber der Verwendung der Makros RGB, GetRValue, GetBValue und GetGValue. Auch die Attribute des HLS-Farbmodells, Hue, Luminance und Saturation, können einzeln gelesen und manipuliert werden. Dadurch wird das Zeichnen von Farbverläufen a la Windows98 Fenstertiteln oder Farbauswahldialogen zum Kinderspiel. In der MSDN Library gibt es eine Beschreibung des HLS-Farbmodells unter dem Titel "HLS Color Spaces".

Farben lassen sich in der Registry oder in Datenbanken zwar auch als DWORDs numerisch ablegen, ihre Manipulation via Regedit oder SQL gestaltet sich dann aber unnötig schwer. Praktischer ist es, Farben als Text im RRGGBB Format hexadezimal abzulegen. Dieser Text kann im Fall der Fälle durch einen erfahrenen Anwender oder Systemadministrator manuell angepaßt werden. Dafür gibt es die praktischen Funktionen GetString und SetString.

Unter X11 kann man schon lange benannte Farben benutzen und auch HTML (bzw. der Internet Explorer) unterstützt diese Vorgehensweise. Für alle benannten Farben des Internet Explorers wurden Konstanten und Strings definiert. Dadurch werden Programme lesbarer, da die Konstante "chocolate" verständlicher ist, als der Ausdruck "RGB(0xD2691E)". Der Name einer Farbe kann auch als String ermittelt werden, und so zur Kommunikation des Anwenders mit dem Programm benutzt werden.

Ein Hinweis: Die CColor Klasse unterstützt keine Paletten und bringt daher den größten Nutzen, wenn Windows mit mehr als 256 Farben betrieben wird (Farbtiefe größer 15/16Bit).

Methodenübersicht

CColor Konstruktor für die COLORREF Kompatibilität.
operator COLORREF Konvertierungsoperator für die COLORREF Kompatibilität.
RGB
SetRed Setzt den Rot-Anteil der Farbe (0 - 255).
SetGreen Setzt den Grün-Anteil der Farbe (0 - 255).
SetBlue Setzt den Blau-Anteil der Farbe (0 - 255).
SetRGB Setzt Rot, Grün und Blau Anteile in einem Schritt.
GetRed Liefert den Rot-Anteil der Farbe (0 - 255).
GetGreen Liefert den Grün-Anteil der Farbe (0 - 255).
GetBlue Liefert den Blau-Anteil der Farbe (0 - 255).
HSL
SetHue Setzt den Farbton (0.0 - 360.0, Winkel im Farbkreis).
SetLuminance Setzt die Helligkeit (0.0 - 1.0).
SetSaturation Setzt die Farbsättigung (0.0 - 1.0).
SetHLS Setzt Farbton, Helligkeit und Farbsättigung in einem Schritt.
GetHue Liefert den Farbton (0.0 - 360.0, Winkel im Farbkreis).
GetLuminance Liefert die Helligkeit (0.0 - 1.0).
GetSaturation Liefert die Farbsättigung (0.0 - 1.0).
String
SetString Setzt die Farbe mit einem String, der den Farbwert im Hexadezimalformat (RRGGBB) enthält.
GetString Liefert den Farbwert im Hexadezimalformat als String (RRGGBB).
Benannte Farben
GetName Liefert den 'sprechenden' Namen für die Farbe.
Static
GetNameFromIndex Liefert den zu einem ENamedColorIndex gehörenden Namen als Text.
GetColorFromIndex Liefert ein CColor Objekt, welches die durch einen ENamedColorIndex-Wert repräsentierte Farbe enthält.
GetNumNames Liefert die Anzahl der benannten Farben.

Konstanten

CColor::ENamedColor

Für 140 Farben sind Namen definiert. Es handelt sich dabei um die gleichen Namen die in Html verwendet werden. Sie sind der Internet Explorer Dokumentation entnommen (im MSDN unter "Platform SDK/Internet/DHTML/Additional References/Color Table" zu finden. Weil die Elemente einer Enumeration implizit in einen Integer konvertiert werden, und ein COLORREF nichts anderes als ein Integer ist, kann überall dort, wo ein COLORREF Objekt oder ein CColor Objekt erwartet wird, ein Wert aus ENamedColor verwendet werden. Ein Beispiel:

[...]
CClientDC dc(this)
dc.SetTextColor(CColor::blueviolet);

[...]
CToolTipCtrl* pToolTip = AfxGetThreadState()->m_pToolTip;
pToolTip->SetTipTextColor(CColor::gold);

Die folgende Farbtabelle ist aus der HTML - Farbtabelle der Internet Explorer Dokumentation kopiert (wobei der "fuchia" Bug korrigiert und die Farbwerte entfernt wurden):

aliceblue antiquewhite aqua aquamarine
azure beige bisque black
blanchedalmond blue blueviolet brown
burlywood cadetblue chartreuse chocolate
coral cornflower cornsilk crimson
cyan darkblue darkcyan darkgoldenrod
darkgray darkgreen darkkhaki darkmagenta
darkolivegreen darkorange darkorchid darkred
darksalmon darkseagreen darkslateblue darkslategray
darkturquoise darkviolet deeppink deepskyblue
dimgray dodgerblue firebrick floralwhite
forestgreen fuchsia gainsboro ghostwhite
gold goldenrod gray green
greenyellow honeydew hotpink indianred
indigo ivory khaki lavender
lavenderblush lawngreen lemonchiffon lightblue
lightcoral lightcyan lightgoldenrodyellow lightgreen
lightgrey lightpink lightsalmon lightseagreen
lightskyblue lightslategray lightsteelblue lightyellow
lime limegreen linen magenta
maroon mediumaquamarine mediumblue mediumorchid
mediumpurple mediumseagreen mediumslateblue mediumspringgreen
mediumturquoise mediumvioletred midnightblue mintcream
mistyrose moccasin navajowhite navy
oldlace olive olivedrab orange
orangered orchid palegoldenrod palegreen
paleturquoise palevioletred papayawhip peachpuff
peru pink plum powderblue
purple red rosybrown royalblue
saddlebrown salmon sandybrown seagreen
seashell sienna silver skyblue
slateblue slategray snow springgreen
steelblue tan teal thistle
tomato turquoise violet wheat
white whitesmoke yellow yellowgreen

[Methodenübersicht]


CColor::ENamedColorIndex

Für Meta-Applikationen kann es nützlich sein, auf einen Farbnamen direkt über seinen Index zuzugreifen. Dafür gibt es die Enumeration ENamedColorIndex. Die Namen leiten sich aus der ENamedColor ab: diesen wird lediglich daß Präfix "i_" vorangestellt. Die Farbe "snow" hat also den Index "i_snow".

[Methodenübersicht]


CColor::CColor

CColor(COLORREF cr = black)

Konstruiert ein Objekt der Klasse CColor und initialisiert es mit der übergebenen Farbe cr. Implementiert wird gleichermaßen der Default Konstruktor und der Umwandlungskonstruktor vom Typ COLORREF in den Typ CColor. Dadurch ist folgende Code legal, obwohl kein spezieller Zuweisungsoperator implementiert wird:

CColor black;                // wird defaultmäßig mit schwarz initialisiert
CColor c1(RGB(255, 0, 0));   // wird mit rot initialisiert 
CColor c2(CColor::seagreen); // CColor::ENamedColor ist COLORREF kompatibel

COLORREF r = RGB(200, 50, 200);

c1 = r;                  // legal, da impliziter Aufruf von CColor::CColor(r)
c2 = RGB(100, 150, 200); // dito, da CColor::CColor(RGB(100, 150, 250));

[Methodenübersicht]


operator COLORREF

operator COLORREF() const

Implementiert die Typumwandlung von CColor nach COLORREF. Dadurch kann überall da, wo ein COLORREF erwartet wird, ein CColor Objekt verwendet werden. Folgender Code ist also legal:

CColor color(CColor::yellow);
[...]
COLORREF cr = color; // legal, ruft implizit CColor::operator COLORREF() auf

Vorsicht bei Funktionen, die eine nicht konstante Referenz auf ein COLORREF (COLORREF&) erwarten: das CColor Objekt kann nicht verändert werden, stattdessen wird das temporäre COLORREF Objekt verändert.

[Methodenübersicht]


SetRed

void SetRed(int red)

Setzt den Rot-Anteil der Farbe. Der Wertebereich liegt zwischen 0 und 255.

[Methodenübersicht]


SetGreen

void SetGreen(int green)

Setzt den Grün-Anteil der Farbe. Der Wertebereich liegt zwischen 0 und 255.

[Methodenübersicht]


SetBlue

void SetBlue(int blue)

Setzt den Blau-Anteil der Farbe. Der Wertebereich liegt zwischen 0 und 255.

[Methodenübersicht]


SetRGB

void SetRGB(int red, int green, int blue)

Kombiniert den die Methoden SetRed, SetGreen und SetBlue in einem Schritt.

[Methodenübersicht]


GetRed

int GetRed() const

Ermittelt den Rot-Anteil der Farbe. Der zurückgegebene Wert liegt im Bereich von 0 bis 255.

[Methodenübersicht]


GetGreen

int GetGreen() const

Ermittelt den Grün-Anteil der Farbe. Der zurückgegebene Wert liegt im Bereich von 0 bis 255.

[Methodenübersicht]


GetBlue

int GetBlue() const

Ermittelt den Blau-Anteil der Farbe. Der zurückgegebene Wert liegt im Bereich von 0 bis 255.

[Methodenübersicht]


SetHue

void SetHue(float hue)

Setzt den Farbton, wobei der Parameter hue als Winkel am Farbkreis interpretiert wird (0.0 - 360.0 Grad). Rot liegt bei 0 Grad, Grün bei 120 Grad und Blau bei 240 Grad.

[Methodenübersicht]


SetLuminance

void SetLuminance(float luminance)

Setzt die Helligkeit der Farbe. Der Parameter luminance enthält die normierte Helligkeit, die zwischen 0.0 (schwarz) und 1.0 (weiß) liegt.

[Methodenübersicht]


SetSaturation

void SetSaturation(float saturation)

Setzt die Farbsättigung bzw. Farbreinheit. Der Parameter saturation enthält die normierte Sättigung, die zwischen 0.0 (grau) und 1.0 (maximale Farbreinheit) liegt.

[Methodenübersicht]


SetHLS

void SetHLS(float hue, float luminance, float saturation)

Kombiniert die Methoden SetHue, SetLuminance und SetSaturation in einem Schritt.

[Methodenübersicht]


GetHue

float GetHue() const

Ermittelt den Farbton. Der Farbton wird als Winkel am Farbkreis interpretiert wird (0.0 - 360.0 Grad). Rot liegt bei 0 Grad, Grün bei 120 Grad und Blau bei 240 Grad.

[Methodenübersicht]


GetLuminance

float GetLuminance() const

Ermittelt die Helligkeit der Farbe. Zurückgegeben wird die normierte Helligkeit, die zwischen 0.0 (schwarz) und 1.0 (weiß) liegt.

[Methodenübersicht]


GetSaturation

float GetSaturation() const

Ermittelt die Farbsättigung bzw Farbreinheit. Zurückgegeben wird die normierte Sättigung, die zwischen 0.0 (grau) und 1.0 (maximale Farbreinheit) liegt.

[Methodenübersicht]


GetString

CString GetString() const

Liefert den RGB-Wert der Farbe als Text im Hexadezimalformat im Format RRGGBB. Beispiele: Rot wird als "FF0000", Grün als "00FF00" und Blau als "0000FF" zurückgegeben.

[Methodenübersicht]


SetString

bool SetString(LPCTSTR pcColor)

Initialisiert das Objekt mit der Farbe, die im übergebenen String pcColor im Hexadezimalformat RRGGBB gefunden wird. Ergibt der String keine gültige Farbe, wird false zurückgegeben, ansonsten true. Beispiele: "FF0000" wird als Rot,  "00FF00" als Grün und "0000FF" als Blau interpretiert.

[Methodenübersicht]


GetName

CString GetName() const

Ermittelt den benutzerfreundlichen Namen der Farbe. Ist für die Farbe kein Name bekannt, wird stattdessen die Html-Repräsentation der Farbe im Format "#RRGGBB" zurückgegeben.

[Methodenübersicht]


GetNumNames

static int GetNumNames()

Ermittelt die Anzahl der benannten Farbe (identisch mit der Anzahl der Werte in ENamedColor und ENamedColorIndex).

[Methodenübersicht]


GetNameFromIndex

static LPCSTR GetNameFromIndex(int i)

Ermittelt den benutzerfreundlichen Name mit dem Index i.

[Methodenübersicht]


GetColorFromIndex

static CColor GetColorFromIndex(int i)

Ermittelt die Farbe mit dem Index i.

[Methodenübersicht]