Windows erlaubt es einem Anwender, die Systemfarben zu ändern, entweder einzeln (z.B. rote Titelleiste von Fenstern) oder als sogenanntes Schema, z.B. Windows-klassisch, Windows-Standard, Wüste oder Kontrast etc.
Wenn Sie nun in ihren Programmen die Farben für Ihre Steuerelemente oder den Fensterhintergrund auf einen festen Farbwert setzen, kann es sein, dass diese Farbe zwar gut zu Ihrem Windows Farbschema passt, wenn ein Anwender aber ein anderes Farbschema wählt erhält er nun plötzlich schwarze Schrift auf schwarzem Grund oder ähnlich unbrauchbare Kombinationen.
Um solchen bösen Überraschungen bereits beim Design der Oberfläche entgegen zu wirken, empfiehlt es sich, wenn man mit den von FoxPro vorgegebenen Farbschemata nicht das Auslangen findet (oder finden möchte), die einzelnen Einstellungen für BackColor und ForeColor nicht mit hartcodierten Farbwerten wie RGB(255,0,0) zu setzen, sondern stattdessen geeignete Systemfarben zu verwenden.
Die Windows API bietet die Funktion GetSysColor(), die einen numerischen Index als Parameter erwartet und die aktuell vom Anwender eingestellte Farbe ebenfalls als numerischen Wert, der mit den FoxPro Farbwerten kompatibel ist, zurück gibt.
Diese Funktion müssen wir z.B. im Hauptprogramm einmal deklarieren, wobei die Groß-/Kleinschreibung unbedingt zu beachten ist, und anschließend kann sie wie eine echte FoxPro Funktion aufgerufen werden:
DECLARE Integer GetSysColor ; IN WIN32API ; Integer nIndex
Das Microsoft Platform SDK definiert zur Zeit folgende Werte für nIndex:
#define COLOR_SCROLLBAR 0 #define COLOR_BACKGROUND 1 #define COLOR_ACTIVECAPTION 2 #define COLOR_INACTIVECAPTION 3 #define COLOR_MENU 4 #define COLOR_WINDOW 5 #define COLOR_WINDOWFRAME 6 #define COLOR_MENUTEXT 7 #define COLOR_WINDOWTEXT 8 #define COLOR_CAPTIONTEXT 9 #define COLOR_ACTIVEBORDER 10 #define COLOR_INACTIVEBORDER 11 #define COLOR_APPWORKSPACE 12 #define COLOR_HIGHLIGHT 13 #define COLOR_HIGHLIGHTTEXT 14 #define COLOR_BTNFACE 15 #define COLOR_BTNSHADOW 16 #define COLOR_GRAYTEXT 17 #define COLOR_BTNTEXT 18 #define COLOR_INACTIVECAPTIONTEXT 19 #define COLOR_BTNHIGHLIGHT 20 #define COLOR_3DDKSHADOW 21 #define COLOR_3DLIGHT 22 #define COLOR_INFOTEXT 23 #define COLOR_INFOBK 24 *-- Ab Windows 2000: #define COLOR_HOTLIGHT 26 #define COLOR_GRADIENTACTIVECAPTION 27 #define COLOR_GRADIENTINACTIVECAPTION 28 *-- Ab Windows XP: #define COLOR_MENUHILIGHT 29 #define COLOR_MENUBAR 30
In neueren Versionen von Windows kann diese Liste gegebenenfalls noch erweitert werden.
Wenn Sie GetSysColor() mit einem Wert für nIndex aufrufen, der von der aktuellen Windows Version nicht unterstützt wird (z.B. COLOR_MENUBAR auf Windows 2000), dann liefert die Funktion den Wert 0 zurück. Um nun einen Fehlerwert von der Farbe 0 (schwarz) unterscheiden zu können, müssen Sie die Windows API Funktion Funktion GetSysColorBrush() aufrufen. Der Rückgabewert ist in FoxPro zwar nicht direkt verwendbar, weil es sich um ein Handle handelt (HBRUSH), hier bedeutet 0 aber eindeutig einen Fehler. Der zurückgegebene Handle darf übrigens keinesfalls mit CloseHandle() oder ähnlichen API Funktionen freigegeben werden.
Die Windows API Funktion GetSysColorBrush wird in FoxPro wie folgt deklariert:
DECLARE Integer GetSysColorBrush ; IN WIN32API ; Integer nIndex
Wir können also nach erfolgter Deklaration der beiden Windows API Funktionen eine FoxPro Funktion schreiben, die uns eine Systemfarbe zurückliefert oder bei ungültigem nIndex einen Fehler auslöst:
FUNCTION SYSTEMCOLOR LPARAMETERS tnIndex ASSERT VARTYPE(tnIndex) = "N" && siehe FoxPro Hilfe "SET ASSERTS Command" IF GetSysColorBrush(tnIndex) = 0 ERROR 11 && Ungültiger Parameter RETURN RGB(255,0,0) && Rot zurückgeben wenn beim Debuggen "Ignorieren" gewählt ENDIF RETURN GetSysColor(tnIndex)
Damit sind Sie in der Lage, geeignete Kombinationen für BackColor und ForeColor festzulegen, die für alle in Windows vordefinierten Farbschemata gute Ergebnisse liefern. Hier ein paar Beispiele:
BackColor | ForeColor | Bildelement | Anmerkungen |
---|---|---|---|
COLOR_ACTIVECAPTION | COLOR_CAPTIONTEXT | Titelleiste des aktiven Fensters | - |
COLOR_INACTIVECAPTION | COLOR_INACTIVECAPTIONTEXT | Titelleiste des inaktiven Fensters | - |
COLOR_MENU | COLOR_MENUTEXT | Menü | - |
COLOR_BTNFACE | COLOR_BTNTEXT | 3D-Objekte | Schaltflächen, etc. |
COLOR_WINDOW | COLOR_WINDOWTEXT | Fenster | Text in TextBox, ListBox etc. |
COLOR_HIGHLIGHT | COLOR_HIGHLIGHTTEXT | Markierte Elemente | Markierter Text in TextBox, ListBox etc. |
COLOR_INFOBK | COLOR_INFOTEXT | QuickInfo | Tooltipps |
COLOR_BACKGROUND | - | Desktop | - |
COLOR_APPWORKSPACE | - | Hintergrund der Anwendung | Z.B. Hintergrund des Winword Hauptfensters |
Sie können das folgende Beispielprogramm herunterladen, in dem die Verwendung von GetSysColor() und GetSysColorBrush() demonstriert wird. Es enthält eine Funktion SYSTEMCOLOR, die Sie auch in eigene Anwendungen übernehmen können.
syscolor.zip (2
kB)
Die folgenden Dokumente stehen nur dFPUG Mitgliedern zur Verfügung. Weitere Informationen zur Mitgliedschaft finden Sie hier.