Détection des mots dans un textbox ou un richtextbox au passage de la souris.

Description

Exemple de code permettant la détection des mots à la position de la souris dans les contrôles "TextBox" ou "RichTextBox" vous pouvez l'utiliser par exemple pour afficher la définition du mot survolé par la souris, ou l'affichage d'un "tooltip" avec un contenu relatif au mot..

Vous pouvez associer la procédure de détection aux divers évènements relatif à la souris; sauf, pour raison d'inutilité, les évènements s'effectuant une seule fois par entrée dans la région du "textbox", à savoir: "MouseHover", "MouseEnter", "MouseCaptureChanged" et évidement "MouseLeave"

Il est pourtant possible de le modifier pour ne pas recevoir la position de la souris mais plutôt d'une ... (Votre imagination intervient ici).

Source / Exemple :


'/XDarwin Source/
'Subject    : TextBox Control
'Title      : Word@Mouse
'Description: Détection des mots dans un contrôle TextBox
'Notes      : 
'1)Ce code n'est pas très "optimisé" vous trouverer des corrections totalement empiriques sur les valeurs pas besoin de me les indiquer.
'2)Quand au temp processeur lorsqu'on utilise l'évenement MouseMove, Un ptit delay entre deux detections successives le soulagera suffisament.
'3)Les fonctions utilisés pour la detection sont prise en charge par les contrôles RichTextBox, vous pouvez donc utiliser cette méthode pour ces
'derniers
'/Enjoy/

Public Class Form1

#Region "Initialisation"
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        MousePosCorrection = IIf((TextBox1.BorderStyle = BorderStyle.Fixed3D), New Point(2, 2), New Point(0, 0)) + TextBox1.Location

    End Sub

#End Region '        Initialisation........

    '====================================================================================================================

#Region "Variables utilisées"
    ''' <summary>
    '''Variable utilisée pour enregistrer des résultats intermédiaires.
    '''(le resultat de la derniere fonction appelée parmis GetWordStart et GetWordLength)
    ''' </summary>
    ''' <remarks></remarks>
    Private TempIndex As Integer

    ''' <summary>
    '''MousePosCorrection: La correction de la valeur MousePosition sur TextBox1 Selon le style de bordure de ce dernier.
    ''' </summary>
    ''' <remarks></remarks>
    Private MousePosCorrection As Point

    Private Word As String

#End Region '   Variables utilisées...

    '====================================================================================================================

#Region "Méthode Appellante"
    ' J'ai choisis d'appeller le traitement par l'évennement MouseMove, mais il est possible de le faire autrement..
    Private Sub TextBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseMove
        If TextBox1.Text <> Nothing Then
            'Décommentez l'instruction suivante si vous voulez que le mot soit séléctionné

            'Me.TextBox1.Select(GetWordStart, GetWordLength) : GoTo 0 'L'instruction suivante sera ignoré si celle là est décommentée

            Word = TextBox1.Text.Substring(GetWordStart, GetWordLength) : GoTo 1

0:          Word = TextBox1.SelectedText

1:          text6.Text = Word

        End If
    End Sub

#End Region '    Méthode Appellante....

    '====================================================================================================================

#Region "Fonctions De Sélection"
    ''' <summary>
    ''' GetWordStart: Retourne l'index du premier caractere (char) du mot le plus proche de la souris
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function GetWordStart() As Integer

        'La Premiere étape consiste à detecter l'index du caractere le plus proche de la souris dans le textbox :
        '=============================================================================================================
        Dim ClosestCharIndex As Integer
        ClosestCharIndex = TextBox1.GetCharIndexFromPosition(PointToClient(MousePosition) - MousePosCorrection)
        ''Cette opération est effectué par la fonction "GetCharIndexFromPosition(pt as Drawing.point)"
        ''On affecte au parametre "pt" de cette fonction la valeur: PointToClient(MousePosition) - MousePosCorrection
        ''Où PointToClient(MousePosition) retourne la position de la souris relativement à notre Formulaire : "Form1"
        ''MousePosCorrection Corrige cette valeur selon La Position du TextBox et son style de bordure (Fixed3D:2pix)

        text1.Text = ClosestCharIndex 'Affiche l'index du caractere le plus proche de la souris
        text2.Text = "''" & TextBox1.Text(ClosestCharIndex) & "''" 'Affiche ce caractere
        '-------------------------------------------------------------------------------------------------------------

        '2ème Etape: Rechercher le début du mot le plus proche: 
        '=============================================================================================================
        'Il s'agit de faire décrémenter l'indice trouver tant que le caractere à la nouvelle valeur de cet indice est 
        'une lettre sinon arreter la décrémentation; la derniere valeur trouvée sera nécéssairement le début du mot.

        While ClosestCharIndex > 0 And Char.IsLetter(TextBox1.Text(ClosestCharIndex))
            ClosestCharIndex -= 1
        End While

        'Petite correction de la valeur si le début du mot n'est pas le premier caractere du text box:
        If ClosestCharIndex > 0 And ClosestCharIndex < TextBox1.TextLength Then
            ClosestCharIndex += 1
        End If

        'Enregistrement de la valeur trouvée:
        TempIndex = ClosestCharIndex
        '--------------------------------------------------------------------------------------------------------------
        text3.Text = TempIndex
        If ClosestCharIndex < TextBox1.TextLength Then
            text4.Text = "''" & TextBox1.Text(TempIndex) & "''"
        Else
            text4.Text = "Rien à cette position."
        End If

        'Retourner le résultat:
        '======================
        Return TempIndex
        '----------------------

    End Function

    ''' <summary>
    ''' GetWordLength: Retourne la longueur du mot commensant par l'index trouvé dans "GetWordStart".
    ''' (À l'éxécution de "GetWordStart" le résultat de cette derniere est conservé dans "TempIndex" 
    ''' jusqu'à l'appel de la fonction actuelle)
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function GetWordLength()
        'On a toujours besoin de TempIndex pour calculer la longueur du mot.
        Dim i As Int32 = TempIndex

        'Là il s'agit d'incrémenter l'index tant que le caractere à la nouvelle valeur est une lettre 
        'et qu'on a pas atteind la fin de la chaine TextBox.Text
        If i < TextBox1.Text.Length Then
            While i < TextBox1.Text.Length - 1 And Char.IsLetter(TextBox1.Text(i))
                i += 1
            End While
        End If
        'Calculer la longueur du mot
        TempIndex = i - TempIndex

        If i = TextBox1.TextLength - 1 Then
            If Char.IsLetter(TextBox1.Text(i)) Then
                TempIndex += 1
            End If
        End If

        text5.Text = TempIndex
        Return TempIndex
    End Function

#End Region 'Fonctions De Sélection

End Class

Conclusion :


Voilà, j'espère que ça va vous être utile.
J'apprécierai vos commentaires..

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.