VBA Tipp: Farbauswahl-Dialog

Aus DBWiki
Wechseln zu: Navigation, Suche

Anforderung

Ich möchte den Windows-Farbauswahl-Dialog aufrufen.

Lösung 1

Das geht mit der folgenden API-Deklaration und VBA-Funktion, die in einem globalen Modul hinterlegt werden.

Argumente der Funktion:

  • Vorgabewert (Optional): Es kann ein Farbwert für den Farbauswahldialog vorgegeben werden.
  • ErweiterteAnsicht (Optional): Wenn True, wird das Dialogfenster in der erweiterten Ansicht geöffnet.
'Quelle: http://www.dbwiki.net/
 
Option Explicit
 
Private Type CHOOSECOLOR
   lStructSize    As Long    'Die Länge der Struktur in Bytes.
   hwndOwner      As Long    'Ein Handle auf das Fenster, dem das Dialogfeld gehört.
                             'Dieses Element kann ein beliebiges gültiges Fensterhandle
                             'sein, oder es kann NULL (0) sein, wenn das Dialogfeld
                             'keinen Eigentümer hat.
   hInstance      As Long    'Wenn das Flag CC_ENABLETEMPLATEHANDLE in Flags gesetzt
                             'ist, ist hInstance ein Handle auf ein Speicherobjekt,
                             'das eine Dialogbox-Vorlage enthält. Wenn das Flag
                             'CC_ENABLETEMPLATE gesetzt ist, ist hInstance ein Handle
                             'zu einem Modul, das eine Dialogbox-Vorlage enthält, die
                             'von lpTemplateName benannt wird. Wenn weder
                             'CC_ENABLETEMPLATEHANDLE noch CC_ENABLETEMPLATE gesetzt
                             'ist, wird dieser Eintrag ignoriert.
   rgbResult      As Long    'Wenn das Flag CC_RGBINIT gesetzt ist, gibt rgbResult die
                             'Farbe an, die beim Erstellen des Dialogfensters initial
                             'ausgewählt wurde. Wenn der angegebene Farbwert nicht
                             'unter den verfügbaren Farben ist, wählt das System die
                             'nächste verfügbare Volltonfarbe aus. Wenn rgbResult
                             'gleich Null (0) ist oder CC_RGBINIT nicht gesetzt ist,
                             'ist die ursprünglich gewählte Farbe schwarz. Wenn der
                             'Benutzer auf die Schaltfläche OK klickt, gibt rgbResult
                             'die Farbauswahl des Benutzers an. Um einen COLORREF-
                             'Farbwert zu erzeugen, benutze die RGB-Funktion.
   lpCustColors   As Long    'Ein Zeiger auf ein Array von 16 Werten, die rote, grüne
                             'und blaue (RGB) Werte für die benutzerdefinierten Farb-
                             'felder im Dialogfeld enthalten. Wenn der Benutzer diese
                             'Farben ändert, aktualisiert das System das Array mit den
                             'neuen RGB-Werten. Um neue benutzerdefinierte Farben zwi-
                             'schen Aufrufen der Funktion ChooseColor beizubehalten,
                             'sollten man statischen Speicher für das Array zuweisen.
                             'Um einen COLORREF-Farbwert zu erzeugen, benutze die
                             'RGB-Funktion.
   Flags          As Long    'Ein Satz von Bit-Flags, mit denen man den Farbdialog
                             'initialisieren kann. Sobald die Farbausahl abgeschlossen
                             'wird, setzt der Dialog diese Flags, um die Eingaben des
                             'Benutzers anzuzeigen. Dieses Element kann eine Kombi-
                             'nation der weiter unten aufgeführten Flags sein.
   lCustData      As Long    'Anwendungsdefinierte Daten, die das System an die vom
                             'lpfnHook-Element identifizierte Hook-Prozedur übergibt.
                             'Wenn das System die WM_INITDIALOG-Nachricht an die Hook-
                             'Prozedur sendet, ist der lParam-Parameter der Nachricht
                             'ein Zeiger auf die beim Anlegen des Dialogs angegebene
                             'CHOOSECOLOR-Struktur. Die Hook-Prozedur kann diesen Zei-
                             'ger verwenden, um den Wert lCustData zu erhalten.
   lpfnHook       As Long    'Ein Zeiger auf eine CCHookProc-Hook-Prozedur, die Nach-
                             'richten verarbeiten kann, die für das Dialogfeld vorge-
                             'sehen sind. Dieses Element wird ignoriert, es sei denn,
                             'das Flag CC_ENABLEHOOK ist in Flags gesetzt.
   lpTemplateName As String  'Der Name der Dialogfeld-Vorlagenressource in dem vom
                             'Element hInstance identifizierten Modul. Diese Vorlage
                             'wird durch die Standard-Dialogfenster-Vorlage ersetzt.
                             'Für nummerierte Dialogfeld-Ressourcen kann lpTemplateName
                             'ein Wert sein, der vom MAKEINTRESOURCE-Makro zurückge-
                             'geben wird. Dieses Element wird ignoriert, es sei denn,
                             'das Flag CC_ENABLETEMPLATE ist im Member Flags gesetzt.
End Type
 
   ' Flag-Konstanten
Private Const CC_RGBINIT              As Long = &H1    'Bewirkt, dass das Dialogfeld
                                                       'die im Element rgbResult ange-
                                                       'gebene Farbe als Ausgangsfarbe
                                                       'verwendet.
Private Const CC_FULLOPEN             As Long = &H2    'Bewirkt, dass das Dialogfeld die
                                                       'zusätzlichen Steuerelemente an-
                                                       'zeigt, mit denen der Benutzer
                                                       'benutzerdefinierte Farben erstel-
                                                       'len kann. Wenn dieses Kennzeichen
                                                       'nicht gesetzt ist, muss der Benut-
                                                       'zer auf die Schaltfläche Benutzer-
                                                       'definierte Farbe klicken, um die
                                                       'benutzerdefinierten Farbsteuerele-
                                                       'mente anzuzeigen.
Private Const CC_PREVENTFULLOPEN      As Long = &H4    'Deaktiviert die Schaltfläche
                                                       'Benutzerdefinierte Farbe definieren.
Private Const CC_SHOWHELP             As Long = &H8    'Bewirkt, dass das Dialogfeld die
                                                       'Schaltfläche Hilfe anzeigt. Das
                                                       'hwndOwner-Element muss das Fenster
                                                       'angeben, um die registrierten
                                                       'HELPMSGSTRING-Nachrichten zu emp-
                                                       'fangen, die das Dialogfeld sendet,
                                                       'wenn der Benutzer auf die Schalt-
                                                       'fläche Hilfe klickt.
Private Const CC_ENABLEHOOK           As Long = &H10   'Aktiviert die im lpfnHook-Teil die-
                                                       'ser Struktur angegebene Hook-Proze-
                                                       'dur. Dieses Kennzeichen wird nur
                                                       'zur Initialisierung des Dialog-
                                                       'fensters verwendet.
Private Const CC_ENABLETEMPLATE       As Long = &H20   'Die Elemente hInstance und
                                                       'lpTemplateName geben eine Dialogfeld-
                                                       'Vorlage an, die anstelle der Standard-
                                                       'vorlage verwendet werden soll.
                                                       'Dieses Flag wird nur zur Initiali-
                                                       'sierung des Dialogfensters verwendet.
Private Const CC_ENABLETEMPLATEHANDLE As Long = &H40   'Das Element hInstance identifiziert
                                                       'einen Datenblock, der eine vorinstal-
                                                       'lierte Dialogbox-Vorlage enthält. Das
                                                       'System ignoriert das Element
                                                       'lpTemplateName, wenn dieses Flag ange-
                                                       'geben ist. Dieses Flag wird nur zur
                                                       'Initialisierung des Dialogfensters
                                                       'verwendet.
Private Const CC_SOLIDCOLOR           As Long = &H80   'Bewirkt, dass das Dialogfeld nur Voll-
                                                       'tonfarben in der Grundmenge anzeigt.
Private Const CC_ANYCOLOR             As Long = &H100  'Veranlasst das Dialogfeld, alle ver-
                                                       'fügbaren Farben in der Menge der
                                                       'Grundfarben anzuzeigen.
 
Private Declare Function ChooseColorA Lib "comdlg32" ( _
   LPCHOOSECOLOR As CHOOSECOLOR) As Long
 
Private Declare Function GetActiveWindow Lib "user32" () As Long
 
 
Public Function Farbauswahl(Optional ByVal Vorgabewert As Long, _
                            Optional ByVal ErweiterteAnsicht As Boolean) As Long
 
   Static alCustcolors(15) As Long
 
   Dim cc     As CHOOSECOLOR
   Dim hWnd   As Long
   Dim lngRet As Long
 
   ' Fenster-Handle auslesen
   hWnd = GetActiveWindow()
 
   With cc
      .lStructSize = LenB(cc)   'Strukturgröße
      'cc.hInstance = 0         'Anwendungs-Instanz
      .hwndOwner = hWnd         'Aufrufendes Fenster-Handle
 
      'Benutzerdefinierte Farben zuweisen
      .lpCustColors = VarPtr(alCustcolors(0))
 
      'Flags
      .Flags = CC_RGBINIT Or CC_ANYCOLOR
      If ErweiterteAnsicht Then .Flags = .Flags Or CC_FULLOPEN
 
      .rgbResult = Vorgabewert  'Vorgabewert setzen
   End With
 
   'Rückgabewert
   lngRet = ChooseColorA(cc)
 
   'Wenn Abbrechen gedrückt wurde, -1 zurückgeben (lngRet = 0)
   If lngRet = 0 Then           'bei Abbrechen -1 zurückgeben
      Farbauswahl = &HFFFFFFFF
   Else                         'bei OK Frbwert zurückgeben
      Farbauswahl = cc.rgbResult
   End If
 
End Function

Aufruf

   'Möglichkeit 1: Farbauswahl-Dialog aufrufen
   MsgBox Farbauswahl
 
 
   'Möglichkeit 2: Farbauswahl-Dialog mit Vorgabewert aufrufen
   MsgBox Farbauswahl(vbMagenta)
   'oder auch
   MsgBox Farbauswahl(16711935)
 
 
   'Möglichkeit 3: Farbauswahl-Dialog in erweiterter Ansicht aufrufen
   MsgBox Farbauswahl(, True)
 
 
   'Möglichkeit 4: Falls gewünscht, kann das Drücken der Schaltfläche "Abbrechen" ausgewertet werden.
   'Wenn Abbrechen gedrückt wurde, ist der Rückgabewert der Funktion -1.
   Dim lngrück As Long
 
   lngRet = Farbauswahl
 
   If lngRet = -1 Then
      MsgBox "Abbrechen wurde gedrückt."
   Else
      MsgBox lngRet
   End If

Lösung 2

Das geht mit der folgenden undokumentierten API-Deklaration und VBA-Funktion, die in einem globalen Modul hinterlegt werden muss. Der Farbauswahldialog ist der gleiche, wie in Lösung 1.

Argument der Funktion:

  • Vorgabewert (Optional): Es kann ein Farbwert für den Farbauswahldialog vorgegeben werden.

Verhalten der Funktion:

  • Wenn OK gedrückt wird, wird die gewählte Farbe zurückgegeben.
  • Wenn Abbrechen gedrückt wird, wird der Vorgabewert zurückgegeben. Standardwert ist 0.
  • Der Farbauswahldialog wird in der normalen Ansicht geöffnet, und kann durch den Benutzer in die erweiterte Ansicht vergrößert werden.
  • Das Farbauswahldialogfenster wird zentriert angezeigt.
'Quelle: http://www.dbwiki.net/
 
 
Option Explicit
 
Private Declare Sub AccessFarbAuswahl Lib "msaccess.exe" _
   Alias "#53" ( _
   ByVal Hwnd As Long, _
   ByRef RGB As Long)
 
 
Public Function Farbauswahl(Optional ByVal VorgabeFarbwert As Long) As Long
 
   Call AccessFarbAuswahl(0, VorgabeFarbwert)
   Farbauswahl = VorgabeFarbwert
 
End Function

Aufruf

   'Beispiel 1: Farbauswahl-Dialog aufrufen
   MsgBox Farbauswahl
 
 
   'Beispiel 2: Farbauswahl-Dialog mit Vorgabewert aufrufen
   MsgBox Farbauswahl(vbMagenta)

Wikilinks

Weblinks