Farben (Dialogfeld)
Zeigt ein modales Dialogfeld an, in dem der Benutzer einen bestimmten Farbwert auswählen kann. Der Benutzer kann eine Farbe entweder aus einer Reihe von einfachen oder benutzerdefinierten Farbpaletten auswählen. Alternativ kann der Benutzer einen Farbwert generieren, indem er die Farbwerte RGB oder Farbton, Sättigung, Leuchtkraft (HSL) der Benutzeroberfläche des Dialogfelds ändert. Das Dialogfeld Farbe gibt den RGB-Wert der vom Benutzer ausgewählten Farbe zurück.
Sie erstellen und zeigen ein Farbdialogfeld an, indem Sie eine CHOOSECOLOR-Struktur initialisieren und die Struktur an die ChooseColor-Funktion übergeben. Indem Sie unterschiedliche Parameterwerte für die CHOOSECOLOR-Struktur festlegen, können Sie beeinflussen, wie das Dialogfeld Farbe angezeigt wird. Sie können z. B. eine vollständige oder teilweise Version der Benutzeroberfläche des Dialogfelds anzeigen. Die folgende Abbildung zeigt die vollständige Version der Benutzeroberfläche des Dialogfelds Farbe .
Wenn der Benutzer auf die Schaltfläche OK klickt, gibt ChooseColorTRUE zurück. Das rgbResult-Element der CHOOSECOLOR-Struktur enthält den RGB-Farbwert der vom Benutzer ausgewählten Farbe. Der RGB-Farbwert gibt die Intensitäten der einzelnen Rot-, Grün- und Blaufarben an, aus denen die ausgewählte Farbe besteht. Die einzelnen Werte liegen zwischen 0 und 255. Verwenden Sie die Makros GetRValue, GetGValue und GetBValue , um einzelne Farben aus einem RGB-Farbwert zu extrahieren.
Wenn der Benutzer das Dialogfeld Farbe abbricht oder ein Fehler auftritt, gibt ChooseColorFALSE zurück, und das rgbResult-Element ist nicht definiert. Um die Fehlerursache zu ermitteln, rufen Sie die CommDlgExtendedError-Funktion auf, um den erweiterten Fehlerwert abzurufen.
Die folgenden Themen werden in diesem Abschnitt behandelt:
- Dialogfelder "Voll- und Teilfarbe"
- Anpassen des Dialogfelds "Farbe"
- Vom Dialogfeld "Farbe" verwendete Farbmodelle
Dialogfelder "Voll- und Teilfarbe"
Das Dialogfeld Farbe verfügt über eine Vollversion und eine Teilversion der Benutzeroberfläche. Die Vollversion enthält die grundlegenden Steuerelemente und verfügt über zusätzliche Steuerelemente, die es dem Benutzer ermöglichen, benutzerdefinierte Farben zu erstellen. Die Teilversion verfügt über Steuerelemente, die die grundlegenden und benutzerdefinierten Farbpaletten anzeigen, aus denen der Benutzer einen Farbwert auswählen kann.
Die Teilversion des Dialogfelds Farbe enthält die Schaltfläche Benutzerdefinierte Farben definieren . Der Benutzer kann auf diese Schaltfläche klicken, um die Vollversion anzuzeigen. Sie können das Dialogfeld Farbe so anweisen, dass immer die Vollversion angezeigt wird, indem Sie das flag CC_FULLOPEN im Flags-Element der CHOOSECOLOR-Struktur festlegen. Um zu verhindern, dass der Benutzer benutzerdefinierte Farben erstellt, können Sie das CC_PREVENTFULLOPEN-Flag festlegen, um die Schaltfläche Benutzerdefinierte Farben definieren zu deaktivieren.
Die Grundfarben stellen eine Auswahl der Farben dar, die auf dem angegebenen Gerät verfügbar sind. Die tatsächliche Anzahl der angezeigten Farben wird vom Anzeigetreiber bestimmt. Beispielsweise zeigt ein VGA-Treiber 48 Farben und ein monochromer Anzeigetreiber nur 16 an.
Die benutzerdefinierten Farben sind die farben, die Sie angeben oder die der Benutzer erstellt. Wenn Sie ein Dialogfeld Farbe erstellen, müssen Sie den lpCustColors-Member der CHOOSECOLOR-Struktur verwenden, um die Anfangswerte für die 16 benutzerdefinierten Farben anzugeben. Wenn die Vollversion des Dialogfelds Farbe geöffnet ist, kann der Benutzer eine benutzerdefinierte Farbe mit einer der folgenden Methoden erstellen:
- Bewegen des Cursors im Farbspektrumsteuerelement und im Foliensteuerelement für Die Leuchtkraft
- Eingeben von RGB-Werten in den Bearbeitungssteuerelementen Rot, Grün und Blau
- Eingeben von HSL-Werten in die Bearbeitungssteuerelemente "Hue", "Sat" und "Lum "
Um der Anzeige benutzerdefinierter Farben eine neue benutzerdefinierte Farbe hinzuzufügen, kann der Benutzer auf die Schaltfläche Zu benutzerdefinierten Farben hinzufügen klicken. Dies führt auch dazu, dass das Dialogfeld den RGB-Wert der neuen Farbe in das entsprechende Element im Array kopiert, auf das das lpCustColors-Element verweist. Um neue benutzerdefinierte Farben zwischen Aufrufen von ChooseColor beizubehalten, sollten Sie statischen Arbeitsspeicher für das Array zuweisen. Weitere Informationen zu den RGB- und HSL-Farbmodellen finden Sie unter Farbmodelle, die vom Dialogfeld "Farbe" verwendet werden.
Anpassen des Dialogfelds "Farbe"
Zum Anpassen eines Farbdialogfelds können Sie eine der folgenden Methoden verwenden:
- Angeben von Werten in der CHOOSECOLOR-Struktur beim Erstellen des Dialogfelds
- Bereitstellen einer benutzerdefinierten Vorlage
- Bereitstellen einer Hookprozedur
Sie können die Darstellung und das Verhalten des Dialogfelds Farbe ändern, indem Sie Flags im Flags-Member der CHOOSECOLOR-Struktur festlegen. Sie können z. B. das flag CC_SOLIDCOLOR so festlegen, dass das Dialogfeld nur Volltonfarben anzeigt. Damit das Dialogfeld zunächst eine andere Farbe als Schwarz auswählt, legen Sie das flag CC_RGBINIT fest, und geben Sie eine Farbe im rgbResult-Element an.
Sie können eine benutzerdefinierte Vorlage für das Dialogfeld Farbe bereitstellen, z. B. wenn Sie zusätzliche Steuerelemente einschließen möchten, die für Ihre Anwendung eindeutig sind. Die ChooseColor-Funktion verwendet Ihre benutzerdefinierte Vorlage anstelle der Standardvorlage.
So stellen Sie eine benutzerdefinierte Vorlage für das Dialogfeld Farbe bereit
- Erstellen Sie die benutzerdefinierte Vorlage, indem Sie die in der Datei Color.dlg angegebene Standardvorlage ändern. Die in der Standarddialogvorlage Farbe verwendeten Steuerelementbezeichner werden in der Datei Color.dlg definiert.
- Verwenden Sie die CHOOSECOLOR-Struktur , um die Vorlage wie folgt zu aktivieren:
Wenn Ihre benutzerdefinierte Vorlage eine Ressource in einer Anwendung oder einer Dynamic Link Library ist, legen Sie das flag CC_ENABLETEMPLATE im Flags-Element fest. Verwenden Sie die Elemente hInstance und lpTemplateName der -Struktur, um den Modul- und Ressourcennamen zu identifizieren.
-Oder-
Wenn sich Ihre benutzerdefinierte Vorlage bereits im Arbeitsspeicher befindet, legen Sie das flag CC_ENABLETEMPLATEHANDLE fest. Verwenden Sie den hInstance-Member , um das Speicherobjekt zu identifizieren, das die Vorlage enthält.
Sie können eine CCHookProc-Hookprozedur für das Dialogfeld Farbe bereitstellen. Die Hookprozedur kann nachrichten verarbeiten, die an das Dialogfeld gesendet werden. Es kann auch registrierte Nachrichten verwenden, um das Verhalten des Dialogfelds zu steuern. Wenn Sie eine benutzerdefinierte Vorlage verwenden, um zusätzliche Steuerelemente zu definieren, müssen Sie eine Hookprozedur zum Verarbeiten von Eingaben für Ihre Steuerelemente bereitstellen.
So aktivieren Sie eine Hookprozedur für das Dialogfeld Farbe
- Legen Sie das flag CC_ENABLEHOOK im Flags-Element der CHOOSECOLOR-Struktur fest.
- Geben Sie die Adresse der Hookprozedur im lpfnHook-Element an.
Nach der Verarbeitung der WM_INITDIALOG Nachricht sendet die Dialogfeldprozedur eine WM_INITDIALOG Nachricht an die Hookprozedur. Der lParam-Parameter dieser Meldung ist ein Zeiger auf die CHOOSECOLOR-Struktur , die zum Initialisieren des Dialogfelds verwendet wird.
Das Dialogfeld sendet die registrierte COLOROKSTRING-Nachricht an die Hookprozedur, wenn der Benutzer auf die Schaltfläche OK klickt. Die Hookprozedur kann die ausgewählte Farbe ablehnen und erzwingen, dass das Dialogfeld geöffnet bleibt, indem null zurückgegeben wird, wenn diese Nachricht empfangen wird. Die Hookprozedur kann erzwingen, dass das Dialogfeld eine bestimmte Farbe auswählt, indem die registrierte SETRGBSTRING-Nachricht an das Dialogfeld gesendet wird. Um diese registrierten Nachrichten zu verwenden, müssen Sie die COLOROKSTRING - und SETRGBSTRING-Konstanten an die RegisterWindowMessage-Funktion übergeben, um einen Nachrichtenbezeichner abzurufen. Anschließend können Sie den Bezeichner verwenden, um nachrichten zu erkennen und zu verarbeiten, die vom Dialogfeld gesendet werden, oder um Nachrichten an das Dialogfeld zu senden.
Vom Dialogfeld "Farbe" verwendete Farbmodelle
Die benutzerdefinierte Farberweiterung des Dialogfelds Farbe ermöglicht es dem Benutzer, eine Farbe mithilfe von RGB- oder HSL-Werten anzugeben. Die CHOOSECOLOR-Struktur verwendet jedoch nur RGB-Werte, um die vom Benutzer erstellten oder ausgewählten Farben zu melden.
RGB-Farbmodell
Das RGB-Modell wird verwendet, um Farben für Displays und andere Geräte festzulegen, die Licht emittieren. Gültige rote, grüne und blaue Werte liegen zwischen 0 und 255, wobei 0 die minimale Intensität und 255 die maximale Intensität angibt. Die folgende Abbildung zeigt, wie die Primärfarben Rot, Grün und Blau kombiniert werden können, um vier zusätzliche Farben zu erzeugen. (Bei Anzeigegeräten ergibt sich die Farbe Schwarz, wenn die Werte rot, grün und blau auf 0 festgelegt sind. In der Displaytechnologie ist Schwarz das Fehlen aller Farben.)
In der folgenden Tabelle sind acht Farben des RGB-Modells und die zugehörigen RGB-Werte aufgeführt.
Color | RGB-Werte |
---|---|
Red | 255, 0, 0 |
Grün | 0, 255, 0 |
Blau | 0, 0, 255 |
Cyan | 0, 255, 255 |
Magenta | 255, 0, 255 |
Gelb | 255, 255, 0 |
White | 255, 255, 255 |
Schwarz | 0, 0, 0 |
Das System speichert interne Farben als 32-Bit-RGB-Werte mit der folgenden hexadezimalen Form: 0x00bbggrr.
Das Byte mit niedriger Ordnung enthält einen Wert für die relative Intensität von Rot; das zweite Byte enthält einen Wert für grün; und das dritte Byte enthält einen Wert für Blau. Das Byte mit hoher Ordnung muss 0 (null) sein.
Sie können das RGB-Makro verwenden, um einen RGB-Wert basierend auf den angegebenen Intensitäten für die roten, grünen und blauen Komponenten abzurufen. Verwenden Sie die Makros GetRValue, GetBValue und GetGValue , um einzelne Farben aus einem RGB-Farbwert zu extrahieren.
HSL-Farbmodell
Das Dialogfeld Farbe enthält Steuerelemente zum Angeben von HSL-Werten. Die folgende Abbildung zeigt das Farbspektrum-Steuerelement und das Leuchtkraft-Foliensteuerelement, die im Dialogfeld Farbe angezeigt werden. Die Abbildung zeigt auch die Wertebereiche, die der Benutzer mit diesen Steuerelementen angeben kann.
Im Dialogfeld Farbe müssen die Sättigungs- und Leuchtkraftwerte im Bereich von 0 bis 240 liegen, und der Farbtonwert muss im Bereich von 0 bis 239 liegen.
Konvertieren von HSL-Werten in RGB-Werte
Die Dialogfeldprozedur, die in Comdlg32.dll für das Dialogfeld Farbe bereitgestellt wird, enthält Code, der HSL-Werte in die entsprechenden RGB-Werte konvertiert. In der folgenden Tabelle sind acht Farben des RGB-Modells und die zugehörigen HSL- und RGB-Werte aufgeführt.
Color | HSL-Werte | RGB-Werte |
---|---|---|
Red | (0, 240, 120) | (255, 0, 0) |
Gelb | (40, 240, 120) | (255, 255, 0) |
Grün | (80, 240, 120) | (0, 255, 0) |
Cyan | (120, 240, 120) | (0, 255, 255) |
Blau | (160, 240, 120) | (0, 0, 255) |
Magenta | (200, 240, 120) | (255, 0, 255) |
White | (0, 0, 240) | (255, 255, 255) |
Schwarz | (0, 0, 0) | (0, 0, 0) |