vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: Verschiedenes / Sonstiges   |   VB-Versionen: VB200822.05.09
IsNamedColor

Eine Funktion zur Prüfung, ob eine ARGB-Farbe in der KnownColor-Auflistung (System.Drawing) enthalten ist. Der Vergleich erfolgt durch die RGB-Komponenten

Autor:   Manfred BohnBewertung:  Views:  9.836 
ohne HomepageSystem:  WinXP, Vista, Win7, Win8, Win10kein Beispielprojekt 

Im Namespace 'System.Drawing' ist die Struktur 'Color' verfügbar, die u.a. zahlreiche ARGB-Farben durch Bezeichnungen definiert. Die Enumeration 'KnownColor' listet diese Farb-Namen auf. Zusätzlich sind darin die System-Farbkonstanten aufgeführt.

Die Eigenschaft 'IsKnownColor' informiert darüber, ob eine bestimmte Farbe in dieser Liste enthalten ist. Allerdings mit einer erheblichen Einschränkung. Die Überprüfung erfolgt nicht anhand der A-R-G-B-Komponenten einer Farbe, sondern nur aufgrund ihrer Erstellungsmethode ('FromName' oder 'FromKnownColor'). Hat man die Farbe durch die 'FromARGB'-Methode erstellt, ist diese Funktion unbrauchbar. Sie liefert stets 'False'.

Die hier vorgeschlagene Funktion 'IsNamedColor' überprüft statt dessen durch den Vergleich der Farbkomponenten, ob eine Farbe "bekannt" (= benannt) ist (Rückgabe: true).

Der Parameter 'UseAlpha' bestimmt, ob neben den R-G-B-Komponenten auch die Alpha-Komponente verglichen wird. (Die benannten Farben besitzen alle die Alpha-Komponente 255).

Der optionale Rückgabe-Parameter 'ColorName' enthält die Bezeichnung der Farbe, falls eine gefunden werden konnte.

Die Funktion erstellt beim ersten Aufruf eine STATIC-Liste der 'KnownColor'-Einträge und verwendet dabei als Schlüssel den Integer-Wert der Farbe (gebildet von 'ToArgb'). Die Systemfarb-Konstanten und 'Transparent' werden dabei ausgefiltert. Einige Farben sind doppelt benannt. Diese Doubletten werden ausgesondert. Zur Auflistung der KnownColor-Enumeration wird die Funktion "Enum_GetMembers" verwendet (VBARCHIV-Tipp: Enumerationen auflisten).

In der Funktion erfolgt die Überprüfung einer Farbe (nach deren ToARGB-Konvertierung) durch die Abfrage, ob ein entsprechender Schlüssel in der Liste vorliegt ('ContainsKey').

''' <summary>Handelt es sich um eine benannte VB-Farbe?</summary>
''' <param name="color">zu beurteilende ARGB-Farbe</param>
''' <param name="UseAlpha">Sollen Alpha-Unterschiede 
''' beachtet werden?</param>
''' <param name="ColorName">Name der Farbe (oder Empty)</param>
''' <returns>Benannte Farbe?</returns>
Public Function IsNamedColor(ByVal color As Drawing.Color, _
  Optional ByVal UseAlpha As Boolean = False, _
  Optional ByRef ColorName As String = Nothing) As Boolean
 
  ' Liste der KnownColors-Benennungen 
  Static NamedColors As Collections.Generic.Dictionary(Of Integer, String)
 
  If NamedColors Is Nothing Then
    ' Liste benannter Farben erstellen
    ' (KnownColor-Enumeration auflisten)
    Dim ColorDict As Collections.Generic.Dictionary(Of Integer, String) = _
      Enum_GetMembers(Of Drawing.KnownColor, Integer)()
 
    ' gefilterte Liste benannter Farben speichern (STATIC) 
    NamedColors = New Collections.Generic.Dictionary(Of Integer, String)
 
    ' Liste füllen
    Dim key_integer As Integer
 
    For Each kvp As Collections.Generic.KeyValuePair(Of Integer, String) In ColorDict
      If kvp.Value.ToUpper <> "TRANSPARENT" Then
        ' Systemfarb-Konstanten in der Enumeration ausfiltern
        If Not Drawing.Color.FromName(kvp.Value).IsSystemColor Then
          ' Farb-Bezeichnung erhält ToArgb-Wert als Schlüssel 
          key_integer = Drawing.Color.FromName(kvp.Value).ToArgb
          ' Doppelte Farb-Benennungen ggf. filtern
          If Not NamedColors.ContainsKey(key_integer) Then
            NamedColors.Add(key_integer, kvp.Value)
          End If
        End If
      End If
    Next kvp
  End If
 
  ' Die übergebene Farbe in den ARGB-Integer transformieren
  Dim color_integer As Integer
  If UseAlpha Then
    ' Alpha-Komponente der Farbe bleibt unverändert
    color_integer = color.ToArgb
  Else
    ' Alpha-Komponente der Farbe auf 255 setzen
    color_integer = Drawing.Color.FromArgb(255, color.R, color.G, color.B).ToArgb
  End If
 
  ' Prüfen, ob die Farbe in der Liste enthalten ist
  With NamedColors
    If .ContainsKey(color_integer) Then
      ' Farb-Bezeichnung zurückgeben
      ColorName = .Item(color_integer)
      Return True
    Else
      ' Keine benannte Farbe ...
      ColorName = String.Empty
      Return False
    End If
  End With
End Function



Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6

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.
 
 
Copyright ©2000-2019 vb@rchiv Dieter OtterAlle 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.