none
ColorDialog erweitern RRS feed

  • Frage

  • Hallo Leute,

    mit dem Standard-ColorDialog kann ich ja nur RGB-Farben auswählen.

    Ich möchte jetzt aber auch eine Auswahl der Gesamtenfarbpalette, also auch die Systemfarben und die Webfarben. So ähnlich wie im VBNet-Editor. Im Standarddialog ist das ja nun einmal nicht möglich.

    Wie kann ich es aber erreichen, dass ich z. B. die Farbe und den Namen in einem Listview hinzufüge?

    Hat vielleicht einer hierfür schon ein Beispiel?

    Vielen Dank im voraus.

    Gruß Ahmed

    Montag, 1. Oktober 2012 12:27

Antworten

  • Hallo Leute,

    hier ist die Lösung:

    http://www.activevb.de/tipps/vbnettipps/tipp0085.html

    Funktioniert bei mir einwandfrei.

    Gruß Ahmed

    • Als Antwort markiert Elmar Boye Montag, 1. Oktober 2012 14:07
    Montag, 1. Oktober 2012 13:53

Alle Antworten

  • Hallo Leute,

    hier ist die Lösung:

    http://www.activevb.de/tipps/vbnettipps/tipp0085.html

    Funktioniert bei mir einwandfrei.

    Gruß Ahmed

    • Als Antwort markiert Elmar Boye Montag, 1. Oktober 2012 14:07
    Montag, 1. Oktober 2012 13:53
  • Hallo, gucke mal hier. Wieder zurück wandeln kannst du das mittels Color.FromName. Das geht natürlich nur mit den Englischen Farbnahmen. Wenn du weitere haben willst, musst du Sie manuel abhandeln.

    Koopakiller - http://koopakiller.ko.ohost.de/

    Montag, 1. Oktober 2012 13:55
  • Hallo Leute,

    ich habe die ColorComboBox noch einmal um eine Property (SetColor) erweitert.

    Damit kann man jetzt auch noch bestimmen, ob man

      • 0=alle Systemfarben
      • 1=nur Web
      • 3=nur System

    haben möchte. Wenn man die Klasse als Control in die Toolbox zieht und dann in dem Formular mit aufnimmt, kann man die Property leicht entsprechend abändern.

    Hier meine Erweiterung:

    Imports System.ComponentModel
    
    Public Class ComboBoxColors
        Inherits ComboBox
    
        Private m_DefaultColor As Color = Color.Aqua
    
        Private m_SetColor As Integer
    
        <Description("dargestellte Farbe bei Programmstart"), _
        Category("Darstellung")> _
        Public Property DefaultColor() As Color
            Get
                Return m_DefaultColor
            End Get
            Set(ByVal value As Color)
                m_DefaultColor = value
            End Set
        End Property
    
        Public Property SetColor() As Integer
            '0 = Alle
            '1 = nur Web
            '2 = nur System
            Get
                Return m_SetColor
            End Get
            Set(ByVal value As Integer)
                m_SetColor = value
            End Set
        End Property
    
    
        Public Sub New()
            Me.DrawMode = Windows.Forms.DrawMode.OwnerDrawFixed
            Me.DropDownStyle = ComboBoxStyle.DropDownList
        End Sub
    
        Private Sub LoadColors()
            ' Die KnownColors auslesen
            Dim ColorNames() As String = [Enum].GetNames(GetType(KnownColor))
            'For i As Integer = 27 To ColorNames.GetUpperBound(0) - 7
            '^ohne Systemfarben
    
            '=mit allen Systemfarben
    
            Select Case SetColor
                Case 0
                    For i As Integer = ColorNames.GetLowerBound(0) To ColorNames.GetUpperBound(0)
                        Me.Items.Add(ColorNames(i))
                    Next
                Case 1
                    For i As Integer = 27 To ColorNames.GetUpperBound(0) - 7
                        Me.Items.Add(ColorNames(i))
                    Next
                Case 2
                    For i As Integer = ColorNames.GetLowerBound(0) To 26
                        Me.Items.Add(ColorNames(i))
                    Next
    
    
                    For i As Integer = ColorNames.GetUpperBound(0) - 6 To ColorNames.GetUpperBound(0)
                        Me.Items.Add(ColorNames(i))
                    Next
    
            End Select
    
        End Sub
    
        ''' <summary>
        ''' Eintrag in Combo auswählen über die Bezeichnung der Farbe
        ''' </summary>
        ''' <param name="ColorName">Bezeichnung der Farbe</param>
        Public Sub SelectColorByName(ByVal ColorName As String)
            For i As Integer = 0 To Me.Items.Count - 1
                If ColorName.ToUpper = Me.Items(i).ToString.ToUpper Then
                    Me.SelectedIndex = i
                    Exit For
                End If
            Next
        End Sub
    
        ''' <summary>
        ''' Eintrag in Combo auswählen über die Farbe
        ''' </summary>
        ''' <param name="Color">die Farbe</param>
        Public Sub SelectColor(ByVal Color As Color)
            For i As Integer = 0 To Me.Items.Count - 1
                If Color.Name = Me.Items(i).ToString Then
                    Me.SelectedIndex = i
                    Exit For
                End If
            Next
        End Sub
    
        ''' <summary>
        ''' aktuell ausgewählte Farbe abrufen
        ''' </summary>
        Public Function SelectedColor() As Color
            Dim c As Color = Nothing
            If Me.SelectedIndex >= 0 Then
                c = Color.FromName(Me.SelectedItem.ToString)
            End If
            Return c
        End Function
    
        ''' <summary>
        ''' Bezeichnung der aktuell ausgewählten Farbe abrufen
        ''' </summary>
        Public Function SelectedColorName() As String
            Dim s As String = Nothing
            If Me.SelectedIndex >= 0 Then
                s = Me.SelectedItem.ToString
            End If
            Return s
        End Function
    
        ''' <summary>
        ''' (Erst)Aktivierung der Parentform
        ''' </summary>
        Protected Overrides Sub OnCreateControl()
            ' Die KnownColors auslesen
            If Not Me.DesignMode Then
                LoadColors()
                ' Die Defaultfarbe in der Combo auswählen
                If DefaultColor <> Nothing Then
                    SelectColor(DefaultColor)
                End If
            End If
    
            MyBase.OnCreateControl()
        End Sub
    
        ''' <summary>
        ''' Ausklappen der Combo mit Anzeige der Items
        ''' </summary>
        Protected Overrides Sub OnDrawItem( _
            ByVal e As System.Windows.Forms.DrawItemEventArgs)
    
            If e.Index >= 0 Then
                Dim Gr As Graphics = e.Graphics
                Dim x As Single = e.Bounds.Left
                Dim y As Single = e.Bounds.Top
                Dim h As Single = e.Bounds.Height
                Dim w As Single = h
    
                ' Farbe über Bezeichnung laden
                Using SB As New SolidBrush( _
                    Color.FromName(Me.Items(e.Index).ToString))
    
                    ' Ein gefülltes Rechteck zeichnen
                    Gr.FillRectangle(SB, x + 2, y + 1, w, h - 4)
                    Gr.DrawRectangle(Pens.Black, x + 2, y + 1, w, h - 4)
    
                    ' Selected Item Invers, Not Selected Normal
                    Using BR As New SolidBrush(Me.ForeColor)
                        If CBool(e.State And DrawItemState.Selected) Then
                            SB.Color = Color.DarkBlue
                            BR.Color = Me.BackColor
                        Else
                            SB.Color = Me.BackColor
                        End If
                        Gr.FillRectangle(SB, w + 10, y, _
                            e.Bounds.Width - (w + 10), h - 1)
                        Gr.DrawString(Me.Items.Item(e.Index).ToString, _
                            Me.Font, BR, w + 10, y)
                    End Using
                End Using
            End If
        End Sub
    
    End Class
    

    Das funktioniert jetzt genauso wie ich es mir vorgestellt habe.

    Gruß Ahmed

    Montag, 1. Oktober 2012 14:30