Dialogfeld "Farbe"
Zeigt ein modales Dialogfeld an, in dem der Benutzer einen bestimmten Farbwert auswählen kann. Der Benutzer kann eine Farbe 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, Leuchtdichte (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 dialogfeld Farbe an, indem Sie eine CHOOSECOLOR- Struktur initialisieren und die Struktur an die ChooseColor-Funktion übergeben. Durch Festlegen unterschiedlicher Parameterwerte für die CHOOSECOLOR- Struktur können Sie sich darauf auswirken, wie das Dialogfeld "Farbe" angezeigt wird. Sie können z. B. eine vollständige oder teilweise Benutzeroberflächenversion des Dialogfelds anzeigen. Die folgende Abbildung zeigt die vollständige Version der Benutzeroberfläche des Dialogfelds Color.
Wenn der Benutzer auf die Schaltfläche OK klickt, gibt ChooseColor-TRUE-zurück. Das rgbResult Mitglied 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 GetRValue, GetGValue, und GetBValue Makros, um einzelne Farben aus einem RGB-Farbwert zu extrahieren.
Wenn der Benutzer das Dialogfeld Farbe abbricht oder ein Fehler auftritt, gibt ChooseColor-FALSE- zurück, und das rgbResult Member ist nicht definiert. Rufen Sie zum Ermitteln der Ursache des Fehlers 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"
- Farbmodelle, die vom Dialogfeld "Farbe"
Dialogfelder "Vollfarbe" 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, mit denen der Benutzer benutzerdefinierte Farben erstellen kann. Die Teilversion verfügt über Steuerelemente, mit denen die grundlegenden und benutzerdefinierten Farbpaletten angezeigt werden, aus denen der Benutzer einen Farbwert auswählen kann.
Die Partielle Version des Dialogfelds "Farbe" enthält eine Schaltfläche Benutzerdefinierte Farben definieren. Der Benutzer kann auf diese Schaltfläche klicken, um die Vollversion anzuzeigen. Sie können das Dialogfeld "Farbe" so weiterleiten, dass immer die Vollversion angezeigt wird, indem Sie das CC_FULLOPEN Flag im Flags Member 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 an, und ein monochromer Anzeigetreiber zeigt nur 16 an.
Die benutzerdefinierten Farben sind diejenigen, die Sie angeben oder die der Benutzer erstellt. Wenn Sie ein Dialogfeld "Farbe" erstellen, müssen Sie das lpCustColors Member der CHOOSECOLOR Struktur verwenden, um die Anfangswerte für die benutzerdefinierten Farben von 16 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 Farbspektrum-Steuerelement und des Leuchtdichte-Foliensteuerelements
- Eingeben von RGB-Werten in den Red, Greenund Blue Bearbeitungssteuerelemente
- Eingeben von HSL-Werten in den steuerelementen Hue, Satund Lum Bearbeitungssteuerelemente
Um der Anzeige der benutzerdefinierten Farben eine neue benutzerdefinierte Farbe hinzuzufügen, kann der Benutzer auf die Schaltfläche Zu benutzerdefinierten Farben hinzufügen klicken. Dies bewirkt auch, dass das Dialogfeld den RGB-Wert der neuen Farbe in das entsprechende Element im Array kopiert, auf das durch das lpCustColors Member verwiesen wird. Um neue benutzerdefinierte Farben zwischen Aufrufen von ChooseColorbeizubehalten, sollten Sie statischen Speicher für das Array zuweisen. Weitere Informationen zu den RGB- und HSL-Farbmodellen finden Sie unter Farbmodelle, die vom Farbdialogfeldverwendet werden.
Anpassen des Dialogfelds "Farbe"
Zum Anpassen eines Dialogfelds "Farbe" können Sie eine der folgenden Methoden verwenden:
- Angeben von Werten in der CHOOSECOLOR- Struktur beim Erstellen des Dialogfelds
- Bereitstellen einer benutzerdefinierten Vorlage
- Bereitstellen eines Hook-Verfahrens
Sie können das Erscheinungsbild und Verhalten des Dialogfelds "Farbe" ändern, indem Sie Im Flags Member der CHOOSECOLOR- Struktur Kennzeichnungen festlegen. Sie können z. B. die kennzeichnung 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 CC_RGBINIT Flag fest, und geben Sie eine Farbe im rgbResult Member 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 steuerelementbezeichner, die in der Standarddialogvorlage "Farbe" verwendet werden, werden in der Datei "Color.dlg" definiert.
- Verwenden Sie die CHOOSECOLOR- Struktur, um die Vorlage wie folgt zu aktivieren:
Wenn es sich bei Der benutzerdefinierten Vorlage um eine Ressource in einer Anwendungs- oder Dynamische Linkbibliothek handelt, legen Sie das CC_ENABLETEMPLATE Flag im Flags Member fest. Verwenden Sie die hInstance und lpTemplateName Member der Struktur, um den Modul- und Ressourcennamen zu identifizieren.
-Oder-
Wenn sich Ihre benutzerdefinierte Vorlage bereits im Arbeitsspeicher befindet, legen Sie das CC_ENABLETEMPLATEHANDLE Flag fest. Verwenden Sie das hInstance Member, um das Speicherobjekt zu identifizieren, das die Vorlage enthält.
Sie können ein CCHookProc- Hook-Verfahren für das Dialogfeld "Farbe" bereitstellen. Die Hook-Prozedur kann Nachrichten verarbeiten, die an das Dialogfeld gesendet werden. Sie 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 Hook-Prozedur zum Verarbeiten von Eingaben für Ihre Steuerelemente bereitstellen.
So aktivieren Sie ein Hook-Verfahren für das Dialogfeld "Farbe"
- Legen Sie das CC_ENABLEHOOK Flag im Flags Member der CHOOSECOLOR--Struktur fest.
- Geben Sie die Adresse der Hook-Prozedur im lpfnHook Member an.
Nach der Verarbeitung der WM_INITDIALOG Nachricht sendet die Dialogfeldprozedur eine WM_INITDIALOG Nachricht an die Hook-Prozedur. Der lParam- Parameter dieser Nachricht ist ein Zeiger auf die CHOOSECOLOR- Struktur, die zum Initialisieren des Dialogfelds verwendet wird.
Das Dialogfeld sendet die COLOROKSTRING- registrierte Nachricht an die Hook-Prozedur, wenn der Benutzer auf die Schaltfläche OK klickt. Die Hook-Prozedur kann die ausgewählte Farbe ablehnen und erzwingen, dass das Dialogfeld geöffnet bleibt, indem null zurückgegeben wird, wenn sie diese Nachricht empfängt. Die Hook-Prozedur kann erzwingen, dass das Dialogfeld eine bestimmte Farbe auswählt, indem die SETRGBSTRING- registrierte 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. Sie können dann den Bezeichner verwenden, um nachrichten zu erkennen und zu verarbeiten, die aus dem Dialogfeld gesendet werden, oder um Nachrichten an das Dialogfeld zu senden.
Farbmodelle, die vom Dialogfeld "Farbe" verwendet werden
Mit der Erweiterung für benutzerdefinierte Farben des Dialogfelds "Farbe" kann der Benutzer eine Farbe mit RGB- oder HSL-Werten angeben. 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 reichen von 0 bis 255, wobei 0 die Mindestintensität angibt 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. Bei der Anzeigetechnologie ist Schwarz das Fehlen aller Farben.)
In der folgenden Tabelle sind acht Farben des RGB-Modells und die zugehörigen RGB-Werte aufgeführt.
Farbe | RGB-Werte |
---|---|
Rot | 255, 0, 0 |
Grün | 0, 255, 0 |
Blau | 0, 0, 255 |
Zyan | 0, 255, 255 |
Magenta | 255, 0, 255 |
Gelb | 255, 255, 0 |
Weiß | 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 Reihenfolge enthält einen Wert für die relative Intensität von Rot; das zweite Byte einen Wert für Grün enthält; und das dritte Byte enthält einen Wert für Blau. Das Byte mit hoher Reihenfolge muss 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 GetRValue, GetBValueund GetGValue Makros, um einzelne Farben aus einem RGB-Farbwert zu extrahieren.
HSL-Farbmodell
Das Dialogfeld "Farbe" stellt Steuerelemente zum Angeben von HSL-Werten bereit. Die folgende Abbildung zeigt das Farbspektrum-Steuerelement und das Leuchtdichte-Foliensteuerelement, das im Dialogfeld "Farbe" angezeigt wird. Die Abbildung zeigt auch die Wertebereiche, die der Benutzer mit diesen Steuerelementen angeben kann.
Im Dialogfeld "Farbe" müssen sich die Sättigungs- und Leuchtdichtewerte im Bereich 0 bis 240 befinden, und der Farbtonwert muss sich im Bereich 0 bis 239 befinden.
Konvertieren von HSL-Werten in RGB-Werte
Die in Comdlg32.dll für das Dialogfeld "Farbe" bereitgestellte Dialogfeld 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.
Farbe | HSL-Werte | RGB-Werte |
---|---|---|
Rot | (0, 240, 120) | (255, 0, 0) |
Gelb | (40, 240, 120) | (255, 255, 0) |
Grün | (80, 240, 120) | (0, 255, 0) |
Zyan | (120, 240, 120) | (0, 255, 255) |
Blau | (160, 240, 120) | (0, 0, 255) |
Magenta | (200, 240, 120) | (255, 0, 255) |
Weiß | (0, 0, 240) | (255, 255, 255) |
Schwarz | (0, 0, 0) | (0, 0, 0) |