How to read word(s) from RichTextBox only if blue

Posted on 2009-07-13
Last Modified: 2013-11-08
I have a Richtextbox that uses black and blue font color.  The blue ones are key words that I want the user to be able to click on to display some definition.  How can I read only the words that are blue to the left and/or right of the mouse click to look up my definition?
Question by:GarySB
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
LVL 21

Expert Comment

ID: 24842877
if you convert it to xml, it will have all of the attributes and you can then see the colors of the text...

Author Comment

ID: 24842924
I'm already using a richtextbox for highlighting purpose.  I've seen some other code sample that do something similar, but wrapping might be a issue.  Can the letter/character position of the click be found? and How to test the color of the letter for forcolor blue?

Author Comment

ID: 24842948
How do you even add a xml? to a Panel or Form?
Tutorials alone can't teach real engineering

So we built better training tools.

-Hands-on Labs
-Instructor Mentoring
-Scenario-Based Tests
-Dedicated Cloud Servers

All at your fingertips. What are you waiting for?


Author Comment

ID: 24843298
I prefer a Richtextbox solution
LVL 96

Expert Comment

by:Bob Learned
ID: 24876681
I would think that you could start with the SelectionStart, move the selection back until you find a non-blue character, and then move forward until you get the next non-blue character, or the end of the text.  Then, you would have you range, and you could get the text between those 2 character index markers.
LVL 86

Accepted Solution

Mike Tomlinson earned 150 total points
ID: 24888224
Using Bob's suggestion, here is a slight variation:
(my test project had just a Label and a RichTextBox)
Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim words() As String = {"cat", "dog", "fish", "hamster", "snake"}
        Dim colors() As Color = {Color.Red, Color.Blue, Color.Green}
        Dim R As New Random
        For i As Integer = 1 To 50
            AppendWord(words(R.Next(0, words.Length)), colors(R.Next(0, colors.Length)))
    End Sub
    Private Sub AppendWord(ByVal word As String, ByVal clr As Color)
        RichTextBox1.SelectionStart = RichTextBox1.TextLength
        RichTextBox1.SelectionLength = 0
        RichTextBox1.SelectionColor = clr
        RichTextBox1.SelectedText = " " & word & " "
    End Sub
    Private Sub RichTextBox1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles RichTextBox1.Click
        Dim pt As Point = RichTextBox1.PointToClient(Cursor.Position)
        Dim index As Integer = RichTextBox1.GetCharIndexFromPosition(pt)
        RichTextBox1.SelectionStart = index
        RichTextBox1.SelectionLength = 1
        Dim clr As Color = RichTextBox1.SelectionColor
        If clr.Equals(Color.Blue) Then
            While RichTextBox1.SelectionStart > 0
                RichTextBox1.SelectionStart = RichTextBox1.SelectionStart - 1
                RichTextBox1.SelectionLength = RichTextBox1.SelectionLength + 1
                If Not RichTextBox1.SelectionColor.Equals(clr) Then
                    RichTextBox1.SelectionStart = RichTextBox1.SelectionStart + 1
                    RichTextBox1.SelectionLength = RichTextBox1.SelectionLength - 1
                    Exit While
                End If
            End While
            While RichTextBox1.SelectionStart + RichTextBox1.SelectionLength < RichTextBox1.TextLength
                RichTextBox1.SelectionLength = RichTextBox1.SelectionLength + 1
                If Not RichTextBox1.SelectionColor.Equals(clr) Then
                    RichTextBox1.SelectionLength = RichTextBox1.SelectionLength - 1
                    Exit While
                End If
            End While
            Dim BlueWords As String = RichTextBox1.SelectedText.Trim
            RichTextBox1.SelectionLength = 0
            Label1.Text = BlueWords
            RichTextBox1.SelectionLength = 0
            Label1.Text = "{Not Blue}"
        End If
    End Sub
End Class

Open in new window

LVL 86

Expert Comment

by:Mike Tomlinson
ID: 24896650
I didn't realize this was a duplicate question...  =\

Anyhoo, at the very bottom of the other question the author states:

    "Can the function be modified to read 'Richtext box' assuming both words are blue.  In other words when the user clicks the mouse on a blue word it should really read all words left and rgiht of the click that are blue."

The approach I posted here is different from the other and actually handles this additional requirement.  The other solution is inspecting the characters looking for word boundaries while my approach is simply looking for where the blue portion starts and stops.

Just thought I'd throw that out there...delete the question if you want.  =)

Author Closing Comment

ID: 31602966
Thank you for the routine.  As you stated the other solution works for a single word.

Featured Post

More Than Just A Video Library

Train for your certification. Learn the latest DevOps tools. Grow your skillset to do better work.

At Linux Academy, we release new training modules every week so you'll always be up to date on the latest tech.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This article describes some techniques which will make your VBA or Visual Basic Classic code easier to understand and maintain, whether by you, your replacement, or another Experts-Exchange expert.
You can of course define an array to hold data that is of a particular type like an array of Strings to hold customer names or an array of Doubles to hold customer sales, but what do you do if you want to coordinate that data? This article describes…
Get people started with the process of using Access VBA to control Outlook using automation, Microsoft Access can control other applications. An example is the ability to programmatically talk to Microsoft Outlook. Using automation, an Access applic…
This lesson covers basic error handling code in Microsoft Excel using VBA. This is the first lesson in a 3-part series that uses code to loop through an Excel spreadsheet in VBA and then fix errors, taking advantage of error handling code. This l…

726 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question