vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Mails senden, abrufen und decodieren - ganz easy ;-)  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   RSS-Feeds  | Newsletter  | Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2018
 
zurück
Rubrik: Grafik und Font   |   VB-Versionen: VB2005, VB200812.01.11
ColorDialog: benutzerdefinierte Farben vorgeben

Die Eigenschaft "CustomColors" des "ColorDialog" erwartet Farben als R-G-B-Integer.

Autor:   Manfred BohnBewertung:     [ Jetzt bewerten ]Views:  11.555 
ohne HomepageSystem:  Win2k, WinXP, Vista, Win7, Win8, Win10 Beispielprojekt auf CD 

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 11.555 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


Anzeige

Kauftipp Unser Dauerbrenner!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.
 
   

Druckansicht Druckansicht Copyright ©2000-2018 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
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.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel