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).
| 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. |
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 |
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".
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));
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.
void SetRed(int red)
Setzt den Rot-Anteil der Farbe. Der Wertebereich liegt zwischen 0 und 255.
void SetGreen(int green)
Setzt den Grün-Anteil der Farbe. Der Wertebereich liegt zwischen 0 und 255.
void SetBlue(int blue)
Setzt den Blau-Anteil der Farbe. Der Wertebereich liegt zwischen 0 und 255.
void SetRGB(int red, int green, int blue)
Kombiniert den die Methoden SetRed, SetGreen und SetBlue in einem Schritt.
int GetRed() const
Ermittelt den Rot-Anteil der Farbe. Der zurückgegebene Wert liegt im Bereich von 0 bis 255.
int GetGreen() const
Ermittelt den Grün-Anteil der Farbe. Der zurückgegebene Wert liegt im Bereich von 0 bis 255.
int GetBlue() const
Ermittelt den Blau-Anteil der Farbe. Der zurückgegebene Wert liegt im Bereich von 0 bis 255.
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.
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.
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.
void SetHLS(float hue, float luminance, float saturation)
Kombiniert die Methoden SetHue, SetLuminance und SetSaturation in einem Schritt.
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.
float GetLuminance() const
Ermittelt die Helligkeit der Farbe. Zurückgegeben wird die normierte Helligkeit, die zwischen 0.0 (schwarz) und 1.0 (weiß) liegt.
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.
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.
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.
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.
static int GetNumNames()
Ermittelt die Anzahl der benannten Farbe (identisch mit der Anzahl der Werte in ENamedColor und ENamedColorIndex).
static LPCSTR GetNameFromIndex(int i)
Ermittelt den benutzerfreundlichen Name mit dem Index i.
static CColor GetColorFromIndex(int i)
Ermittelt die Farbe mit dem Index i.