Windows Systemfarben

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.

GetSysColor

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.

GetSysColorBrush

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)

Weitere Informationen

 

Informationen im dFPUG Portal

Die folgenden Dokumente stehen nur dFPUG Mitgliedern zur Verfügung. Weitere Informationen zur Mitgliedschaft finden Sie hier.

 
 

Zurück zum Archiv