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 1.351 mal aufgerufen.
Anzeige
![]() ![]() ![]() Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren [email protected]! - 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. |
sevISDN 1.0 ![]() Überwachung aller eingehender Anrufe! Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Tipp des Monats ![]() Dieter Otter PopUp-Menü wird nicht angezeigt :-( In diesem Tipp verraten wir Ihnen, wie Sie Probleme mit PopUp-Menüs umgehen können, wenn diese unter bestimmten Umständen einfach nicht angezeigt werden. Neu! sevPopUp 2.0 ![]() Dynamische Kontextmenüs! Erstellen Sie mit nur wenigen Zeilen Code Kontextmenüs dynamisch zur Laufzeit. Vordefinierte Styles (XP, Office, OfficeXP, Vista oder Windows 8) erleichtern die Anpassung an die eigenen Anwendung... |
||||||||||||||||
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. |