Die "ColorDialog"-Klasse (Namespace: "System.Windows.Forms") stellt ein Standarddialogfeld dar, in dem die verfügbaren Farben angezeigt werden und das Steuerelemente enthält, mit denen benutzerdefinierte Farben erstellt bzw. gewählt werden können. Die "CustomColors"- Eigenschaft dieser Klasse ruft den im Dialogfeld angezeigten Satz benutzerdefinierter Farben ab oder legt diesen fest. Diese Farben sind in einem Integer-Array enthalten, dessen (max. 16) Elemente aus den zum Erstellen der Farbe erforderlichen RGB-Werten (rot, grün und blau) bestehen (VB-Doku, sinngemäß). Obwohl die Eigenschaften dieses Farbwahl-Dialog mit Variablen des Typs "System.Drawing.Color" arbeiten, akzeptiert die "CustomColors"-Eigenschaft im übergebenen Array keine Integer-Werte, die per "ToArgb"-Methode dieser Struktur erstellt worden sind, sondern verlangt statt dessen R-G-B-Integer (=fehlender Alpha-Kanal). Solche Werte können durch die "RGB"-Funktion (in "Microsoft.VisualBasic.Information") gebildet werden. Die Demo-Funktion "Color_Dialog" erwartet als zweiten Parameter ein Array benutzerdefinierter Farben des Typs System.Drawing.Color ("customcolors") und wandelt es in ein RGB-Array um. Der Benutzer muss im Dialog eine der vorgegebenen Farben wählen. Der ByRef-Parameter "Color_Index" meldet den Array-Index der gewählten Farbe oder bei Abbruch -1 bzw. Funktionsrückgabe "false". Der Colordialog besitzt keine Titel-Eigenschaft und wird deshalb geeignet erweitert ("SetWindowText"). Imports System.Windows.Forms Public Class clsColorDialog Inherits System.Windows.Forms.ColorDialog Private Const WM_INITDIALOG As Integer = &H110 <System.Runtime.InteropServices.DllImport("user32.dll", _ CharSet:=System.Runtime.InteropServices.CharSet.Auto)> _ Private Shared Function SetWindowText(ByVal hWnd As System.IntPtr, _ ByVal text As String) As Boolean End Function Private _Title As String = "Farbe wählen" Public Sub New(ByVal Title As String) MyBase.New() If Not String.IsNullOrEmpty(Title) Then _Title = Title End Sub Protected Overrides Function HookProc(ByVal hWnd As System.IntPtr, _ ByVal msg As Integer, ByVal wparam As System.IntPtr, _ ByVal lparam As System.IntPtr) As System.IntPtr If msg = WM_INITDIALOG Then SetWindowText(hWnd, _Title) Return MyBase.HookProc(hWnd, msg, wparam, lparam) End Function End Class Die Demo-Funktion: ''' <summary>Dialog zur Auswahl einer Farbe aus benutzerdefinierter Vorgabe</summary> ''' <Title>Dialog-Überschrift</Title> ''' <param name="color_Index">Index der Farbvor- bzw. Rückgabe (oder -1)</param> ''' <param name="customcolors">Array mit benutzerdefinierten Farben</param> Public Function Color_Dialog(ByVal Title As String, _ ByVal customcolors() As Drawing.Color, _ ByRef Color_Index As Integer) As Boolean ' max. Zahl benutzerdefinierter Farben Const MaxColors As Integer = 16 Dim coloranz As Integer = 0, cc(MaxColors) As Integer ' Ab VB 2008: Verweis auf System.Linq erforderlich ' customcolors = (From x As Drawing.Color In customcolors Distinct).ToArray ' Umwandlung der benutzerdefinierten Farben in RGB-Integerwerte coloranz = customcolors.Length If coloranz > MaxColors Then coloranz = MaxColors For i As Integer = 0 To coloranz - 1 cc(i) = ColorToInteger(customcolors(i)) Next i For i As Integer = coloranz To 15 cc(i) = ColorToInteger(Drawing.Color.Black) Next i If Color_Index < 0 Or Color_Index > MaxColors - 1 Then Color_Index = 0 Dim Initcolor As Drawing.Color = customcolors(Color_Index) Color_Index = -1 Dim ok As Boolean = False Dim coldia As New clsColorDialog(Title) With coldia .AnyColor = False : .SolidColorOnly = False : .ShowHelp = False .FullOpen = False : .AllowFullOpen = False .CustomColors = cc Do .Color = Initcolor If .ShowDialog = Windows.Forms.DialogResult.Cancel Then Return False For i As Integer = 0 To coloranz - 1 If RGB_Equals(.Color, customcolors(i)) Then Color_Index = i : Return True End If Next i MsgBox("Sie müssen eine der " & CStr(coloranz) & _ " benutzerdefinierten Farben wählen", MsgBoxStyle.Information, "Farbe") Loop End With End Function Private Function ColorToInteger(ByVal c As Drawing.Color) As Integer ' Alpha-Kanal wird ignoriert Return Microsoft.VisualBasic.Information.RGB(c.R, c.G, c.B) End Function Private Function RGB_Equals(ByVal col1 As Drawing.Color, _ ByVal col2 As Drawing.Color) As Boolean If col1.R <> col2.R Then Return False If col1.G <> col2.G Then Return False If col1.B <> col2.B Then Return False Return True End Function Anwendungsbeispiel: Dim customcolors(5) As Drawing.Color, Color_Index As Integer = 2 ' Array füllen - als Vorgabe für benutzerdefinierte Farben customcolors(0) = Drawing.Color.Red customcolors(1) = Drawing.Color.FromName("GREEN") customcolors(2) = Drawing.Color.FromKnownColor(Drawing.KnownColor.Azure) customcolors(3) = Drawing.Color.FromArgb(255, 120, 140, 160) customcolors(4) = Drawing.SystemColors.ButtonFace customcolors(5) = Drawing.Color.FromName(ConsoleColor.DarkMagenta.ToString) If Color_Dialog("Farbauswahl", customcolors, Color_Index) Then Me.BackColor = customcolors(Color_Index) End If Dieser Tipp wurde bereits 15.700 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 (einschl. Beispielprojekt!) Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
vb@rchiv CD Vol.6 Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! Online-Update-Funktion Entwickler-Vollversionen u.v.m. Tipp des Monats April 2024 Skyfloy Chart von Microsoft und dazu noch gratis Tutorial für Microsoft Chart Controls für Microsoft .NET Framework 3.5 Neu! sevEingabe 3.0 Einfach stark! Ein einziges Eingabe-Control für alle benötigten Eingabetypen und -formate, inkl. Kalender-, Taschenrechner und Floskelfunktion, mehrspaltige ComboBox mit DB-Anbindung, ImageComboBox u.v.m. |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |