Systempalette
Das System verwaltet eine Systempalette für jedes Gerät, das Paletten verwendet. Die Systempalette enthält die Farbwerte für alle Farben, die derzeit vom Gerät angezeigt oder gezeichnet werden können. Abgesehen von der Anzeige des Inhalts der Systempalette können Anwendungen nicht direkt auf die Systempalette zugreifen. Stattdessen hat das System die vollständige Kontrolle über die Systempalette und lässt den Zugriff nur durch die Verwendung logischer Paletten zu.
Eine Anwendung kann den Inhalt der Systempalette mithilfe der GetSystemPaletteEntries-Funktion anzeigen. Diese Funktion ruft den Inhalt eines oder mehrerer Einträge bis zur Gesamtzahl der Einträge in der Systempalette ab. Die Summe entspricht immer der Zahl, die von der GetDeviceCaps-Funktion für den SIZEPALETTE-Wert zurückgegeben wird, und entspricht der maximalen Größe für eine beliebige logische Palette.
Obwohl Anwendungen farben in der Systempalette nicht direkt ändern können, können sie änderungen verursachen, wenn logische Paletten realisiert werden. Um eine Palette zu realisieren, untersucht das System jede angeforderte Farbe und versucht, einen Eintrag in der Systempalette zu finden, der eine genaue Übereinstimmung enthält. Wenn das System eine übereinstimmende Farbe findet, ordnet es den Index der logischen Palette dem entsprechenden Systempalettenindex zu. Wenn das System keine genaue Übereinstimmung findet, kopiert es die angeforderte Farbe in einen nicht verwendeten Systempaletteneintrag, bevor die Indizes zugeordnet werden. Wenn alle Systempaletteneinträge verwendet werden, ordnet das System den Index der logischen Palette dem Systempaletteneintrag zu, dessen Farbe der angeforderten Farbe am ehesten entspricht. Nachdem diese Zuordnung festgelegt wurde, können Anwendungen sie nicht mehr überschreiben. Beispielsweise können Anwendungen keine Systempalettenindizes verwenden, um Farben anzugeben. nur logische Palettenindizes sind zulässig.
Anwendungen können die Art und Weise ändern, wie Indizes zugeordnet werden, indem sie beim Erstellen der logischen Palette den peFlags-Member der PALETTEENTRY-Struktur auf ausgewählte Werte festlegen. Beispielsweise weist das PC_NOCOLLAPSE-Flag das System an, die angeforderte Farbe sofort in einen nicht verwendeten Systempaletteneintrag zu kopieren, unabhängig davon, ob ein Systempaletteneintrag diese Farbe bereits enthält. Außerdem weist das flag PC_EXPLICIT das System an, den Index der logischen Palette einem explizit angegebenen Systempalettenindex zuzuordnen. (Die Anwendung gibt den Systempalettenindex im Wort mit niedriger Reihenfolge der PALETTEENTRY-Struktur an.)
Paletten können entweder als Hintergrundpalette oder als Vordergrundpalette realisiert werden, indem sie true bzw . FALSE für den bForceBackground-Parameter in der SelectPalette-Funktion angeben. Es kann jeweils nur eine Vordergrundpalette im System vorhanden sein. Wenn das Fenster das aktuell aktive Fenster oder ein Nachkomme des aktuell aktiven Fensters ist, kann es eine Vordergrundpalette realisieren. Andernfalls wird die Palette unabhängig vom Wert des bForceBackground-Parameters als Hintergrundpalette realisiert. Die kritische Eigenschaft einer Vordergrundpalette besteht darin, dass sie, wenn sie realisiert wird, alle Einträge (mit Ausnahme der statischen Einträge) in der Systempalette überschreiben kann. Das System erreicht dies, indem alle Einträge, die in der Systempalette nicht statisch sind, vor der Realisierung einer Vordergrundpalette als nicht verwendet markiert werden, wodurch alle verwendeten Einträge beseitigt werden. Es erfolgt keine Vorverarbeitung auf der Systempalette für eine Hintergrundpalettenrealisierung. Die Vordergrundpalette legt alle möglichen nichtstatischen Farben fest. Hintergrundpaletten können nur das festlegen, was offen bleibt und priorisiert wird. In der Regel verwenden Anwendungen Hintergrundpaletten für untergeordnete Fenster, die ihre eigenen individuellen Paletten realisieren. Dies trägt dazu bei, die Anzahl der Änderungen zu minimieren, die an der Systempalette auftreten.
Ein nicht verwendeter Systempaletteneintrag ist jeder Eintrag, der nicht reserviert ist und keine statische Farbe enthält. Reservierte Einträge werden explizit mit dem PC_RESERVED-Wert gekennzeichnet. Diese Einträge werden erstellt, wenn eine Anwendung eine logische Palette für die Palettenanimation realisiert. Statische Farbeinträge werden vom System erstellt und entsprechen den Farben in der Standardpalette. Die GetDeviceCaps-Funktion kann verwendet werden, um den NUMRESERVED-Wert abzurufen, der die Anzahl der Systempaletteneinträge angibt, die für statische Farben reserviert sind.
Da die Systempalette über eine begrenzte Anzahl von Einträgen verfügt, kann sich die Auswahl und Realisierung einer logischen Palette für ein bestimmtes Gerät auf die Farben auswirken, die anderen logischen Paletten für dasselbe Gerät zugeordnet sind. Diese Farbänderungen sind besonders dramatisch, wenn sie auf dem Display auftreten. Eine Anwendung kann sicherstellen, dass angemessene Farben für die aktuell ausgewählte logische Palette verwendet werden, indem sie die Palette vor jeder Verwendung zurückgesetzt. Eine Anwendung setzt die Palette zurück, indem die Funktionen UnrealizeObject und RealizePalette aufgerufen werden. Die Verwendung dieser Funktionen bewirkt, dass das System die Farben in der logischen Palette vernünftigen Farben in der Systempalette neu ordnet.