Directory Contents Search << >>


DaVinci 4: Leonardo: Funktion CreateDIBPalette

Die Leonardo-Funktion CreateDIBPalette entnimmt die Paletten-Daten aus einer DIB und erzeugt eine Farbpalette, welche die Farbpalette der DIB widerspiegelt.

HPALETTE API CreateDIBPalette (HDIB hdib);

hdib

Handle der Quell-DIB.

Rückgabewert:

Der Rückgabewert gibt das Handle der neu erstellten Farbpalette an. Er ist NULL, wenn die Erstellung der Farbpalette mißlang. Das Handle muss von der Applikation mit der Funktion DeleteObject freigegeben werden.

Hinweise zu Farbpaletten:

Während eine DIB die Angaben zu Farbpaletten und Bitmap-Daten in ein Handle zusammenfasst, benötigen Sie zur Verarbeitung der DIB mit Microsoft Windows zwei voneinander unabhängige Handles dazu.

Farbpaletten-Handles werden nur zur Benutzung von Bitmaps auf Bildschirmen mit 256 Farben benötigt. Bei VGA-Schirmen mit 16 Farben kann die Farbzuordnung nicht geändert werden und Bildschirmadapter mit mehr als 256 Farben benötigen keine Farbpaletten.

Da Grafikkarten mit 256 Farben für PCs veraltet sind, werden Sie heute in vielen Fällen keine Farbpaletten mehr in Ihrer Anwendung unterstützen wollen.

Ein Bitmap-Handle ergibt für Windows nur Sinn gemeinsam mit dem dazugehörenden Paletten-Handle. Falls Sie kein Paletten-Handle benutzen, so benutzt Windows die System-Standardpalette mit 20 Standardfarben.

Wenn auch eine Bitmap-Handle ohne das dazugehörende Paletten-Handle keine Aussagekraft hat, so können Sie aber dennoch dasselbe Paletten-Handle für mehrere Bitmaps benutzen, daher werden diese beiden Informationen von Windows grundsätzlich getrennt gespeichert. Sofern es irgendwie möglich ist, sollten Sie auf die Verwendung mehrerer Farbpaletten für ein Hauptfenster verzichten, da sich daraus schwer zu behandelnde Randeffekte ergeben.

Die Erzeugung eines Paletten-Handles wird von der Windows-Funktion CreatePalette durchgeführt.

Um für Windows Farbpalette und Bitmap miteinander zu verbinden, müssen Sie die Palette mit der Function SelectPalette in einen DC wählen. Farbpaletten-Handles sind aber reine Speicherstrukturen. Um die Farbpalette auch zur gültigen Palette des Bildschirmadapters zu machen, rufen Sie anschließend die Funktion RealizePalette auf, wobei der Device-Context Parameter ein Device-Context für ein Fenster angeben muss. RealizePalette wählt die auf dem Bildschirm darstellbaren Farben des Paletten-Handles aus, verändert also wenn notwendig die tatsächlich am Bildschirm angezeigte Farbpalette. Falls die Farbpalette geändert wurde, so teilt RealizePalette dies den anderen WS_OVERLAPPED und WS_POPUP-Fenstern durch die Botschaft WM_PALETTECHANGED mit. Kindfenster erhalten keine derartigen Nachrichten.

Auf WM_PALETTECHANGED reagieren alle an Farbpaletten interessierten Programme so, dass sie sich der veränderten Palette anpassen. In der Regel werden alle angezeigten Bilder neu gezeichnet.

Beim RealizePalette - Vorgang unterscheidet Windows zwischen Vordergrund und Hintergrund-Paletten. Die Vordergrund-Palette ist dem Fenster mit dem Focus zugeordnet. Windows verhindert automatisch, dass ein nicht aktives Fenster eine Vordergrund-Palette realisiert, falls Ihre Applikation aber mehrere Fenster mit mehreren Farbpaletten als Kindfenster hat, so müssen Sie die Steuerung der Farbpalette mit dem dritten Parameter von SelectPalette durchführen.

Vordergrund-Paletten unterscheiden sich von Hintergrund-Paletten folgendermaßen:

Wird eine Vordergrund-Palette realisiert, so löscht Windows alle Informationen über bereits realisierte Farbpalettenfarben aus der Hardware-Palette. D.h. es stehen zunächst 236 Farben zur Verfügung. Anschließend wählt Windows die Farben der Vordergrund-Palette zur Anzeige aus und benachrichtigt die anderen Fenster durch die Nachricht WM_PALETTECHANGED. Diese wählen nun ihre Farbpaletten als Hintergrundpaletten aus, d.h. sie haben nur noch Zugriff auf unbenutzte Bereiche der Hardware-Palette. Ist die Hardware-Palette voll, so werden die bestmöglichen Farben einander zugeordnet.

Um die Anwendung, die gerade den Focus hat, immer in bestmöglicher Qualität darzustellen, sendet Windows bei einem Focus-Wechsel die Nachricht WM_QUERYNEWPALETTE. Die Anwendung sollte nun ihre Farbpalette in den DC ihres Fensters wählen und mit RealizePalette realisieren. Da sie nun den Focus hat, wird die Farbpalette als Vordergrundpalette realisiert und es werden entsprechende WM_PALETTECHANGED Nachrichten versandt.

WM_PALETTECHANGED Nachrichten geben an, welches Fenster die Veränderung der Farbpalette verursacht hat. Eine Anwendung sollte ihre Farbpalette nicht nochmals realisieren, wenn die Veränderung der Farbpalette von ihr selbst verursacht wurde.

Das Schema birgt kritische Stellen:

1.

WM_PALETTECHANGED und WM_QUERYNEWPALETTE gehen nur an Hauptfenster, also NICHT an Control-Elemente in Dialogboxen oder MDI-Kindfenster.

2.

Wenn eine Applikation mehrere Farbpaletten als Vordergrundpaletten realisiert, so kommt es u.a. zu einer Endlosschleife

3.

Wenn eine Applikation keine Farbpalette als Vordergrundpaletten realisiert, so wird je nach Bildschirmtreiber und sonstigen laufenden Applikationen das Bild in unvorteilhaften Farben angezeigt,

Im Allgemeinen realisiert eine Applikation die Farbpalette zu folgenden Gelegenheiten:

1.

Bei jedem Zeichenvorgang (WM_PAINT...)

2.

Bei WM_QUERYNEWPALETTE

3.

Bei WM_PALETTECHANGED (Falls die Anwendung die Nachricht nicht selbst verursacht hat)

Falls Ihr Applikation (z.B. als MDI-Applikation) mehrere Kindfenster mit Farbpaletten hat, so müssen Sie die WM_PALETTECHANGED Nachricht an alle Kindfenster weiterreichen, dagegen die WM_QUERYNEWPALETTE -Nachricht nur an das Kindfenster mit dem Focus. Nur das Fenster mit dem Eingabe-Focus darf bei SelectPalette FALSE im 3. Parameter angeben.

-


Valid HTML 4.01!