vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Top-Preis! AP-Access-Tools-CD Volume 1  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
Rubrik: Controls · TextBox & RichTextBox   |   VB-Versionen: VB2010 - VB201515.05.20
RichTextBox - richtige Hintergrundfarbe passend zu verschiedenen Vordergrundfarben eines Textes

Es wird eine Methode gezeigt, wie man zu einem RTF-Text, der verschiedene Textfarben enthält, den geeigneten schwarzen oder weißen Hintergrund ermitteln kann.

Autor:   Dietrich HerrmannBewertung:     [ Jetzt bewerten ]Views:  2.281 
ohne HomepageSystem:  Win7, Win8, Win10, Win11kein Beispielprojekt 

In meinem Projekt sind in einer SQL-Datenbank RTF-Texte gespeichert, die ich in einer RichTextBox anzeigen wollte. Dabei ergab sich als Aufgabe, dass die Texte verschiedenfarbig formatiert sind und dass nicht immer ein weißer Hintergrund die farbigen Texte lesbar macht. Deshalb habe ich unter Zuhilfenahme zweier Grafik-Funktionen es folgendermaßen gelöst:

Mittels RegEx.Match ermittle ich alle im RTF-Text vorkommenden Farben. Aus dieser Menge ermittle mittels einer Funktion zur Berechnung der Farbhelligkeiten die Farbe mit der minimalsten Helligkeit. Diese Farbe verwende ich in der Funktion zur Berechnung von entweder schwarz oder weiß. Das Ergebnis wird dann für den Hintergrund der RichTextBox verwendet.

Notwendig:

Imports System.Text.RegularExpressions

Hier der Code; bspw. angewendet in der EreignisProzedur TextChanged der RichTextBox:

Private Sub RichTextBox1_TextChanged(sender As Object, e As EventArgs) _
  Handles RichTextBox1.TextChanged
 
  Dim rtf As RichTextBox = DirectCast(sender, RichTextBox)
  Dim t, tt As String, a, b As String(), i, min As Short
  Dim c, cm As Color
 
  t = rtf.Rtf
  min = 1
  For Each Item As Match In Regex.Matches(t, "\redd{1,3}\greend{1,3}\blued{1,3}")
    tt += Item.Value.Substring(1) + ";"
  Next
  a = Split(tt, ";")
  For i = 0 To a.Length - 1
    If a(i) <> "" Then
      a(i) = a(i).Replace("red", "").Replace("green", "").Replace("blue", "")
      b = Split(a(i), "")
      c = Color.FromArgb(0, CShort(b(0)), CShort(b(1)), CShort(b(2)))
      If getColorBright(c) > min Then
        min = getColorBright(c)
        cm = c
      End If
    End If
  Next 
  rtf.BackColor = GegenFarbe_sw(cm)
  t = ""
End Sub

Und das sind die beiden verwendeten Grafikfinktionen:

Public Function getColorBright(farbe As Color) As Short
  Dim R As Integer = farbe.R ' Farb-Anteile
  Dim G As Integer = farbe.G
  Dim B As Integer = farbe.B
 
  Return CInt(Math.Sqrt(R * R * 0.241 + G * G * 0.691 + B * B * 0.068))
End Function
Public Function GegenFarbe_sw(farbe As Color) As Color
  Dim R As Integer = farbe.R ' Farb-Anteile
  Dim G As Integer = farbe.G
  Dim B As Integer = farbe.B
 
  R = R * 2 : G = G * 5 : B = B
  If R + G + B > 1024 Then
    Return Color.Black     ' schwarz, weil sehr hell
  Else
    Return Color.White     ' weiss, weil sehr dunkel
  End If
End Function

Dieser Tipp wurde bereits 2.281 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

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-2024 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