OVH Cloud OVH Cloud

Modiifer le curseur dans un RTF

2 réponses
Avatar
lolo
Salut à tous !

J'ai un petit problème, je cherche à remplacer le curseur de la souris sur
événement MouseMouve de mon RichTextBox lorsque le mot de mon RTF sur lequel
pointe la souris est de couleur bleu (par exemple).

Merci d'avance pour vos réponse

Laurent.

2 réponses

Avatar
François Picalausa
Hello,

Tu peux tester la couleur comme ceci:
Option Explicit

Private Const EM_CHARFROMPOS = &HD7

Private Declare Function SendMessage _
Lib "user32" _
Alias "SendMessageA" _
( _
ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any _
) _
As Long

Private Type POINTL
x As Long
y As Long
End Type

Private Sub Form_Load()
RichTextBox1.Text = ""
AddText RichTextBox1, "Test "
AddText RichTextBox1, " Red ", vbRed
AddText RichTextBox1, " Green ", vbGreen
AddText RichTextBox1, " some text in blue", vbBlue
End Sub

Private Sub AddText(RTB As RichTextBox, _
Text As String, _
Optional Color As Long = vbBlack, _
Optional append = True)

If append Then
RTB.SelStart = Len(RTB.Text)
End If

RTB.SelColor = Color
RTB.SelText = Text
End Sub

Private Sub RichTextBox1_MouseMove(Button As Integer, Shift As Integer, x As
Single, y As Single)
Dim pt As POINTL
Dim Char As Long
Dim OSS As Long, OSL As Long

With pt
.x = x / Screen.TwipsPerPixelX
.y = y / Screen.TwipsPerPixelY
End With

Char = SendMessage(RichTextBox1.hwnd, EM_CHARFROMPOS, 0, pt)
OSS = RichTextBox1.SelStart
OSL = RichTextBox1.SelLength

RichTextBox1.SelStart = Char
RichTextBox1.SelLength = 1

If RichTextBox1.SelColor = vbBlue Then
RichTextBox1.MousePointer = rtfUpArrow
Else
RichTextBox1.MousePointer = rtfDefault
End If

RichTextBox1.SelStart = OSS
RichTextBox1.SelLength = OSL
End Sub

Pour éviter l'effet de clignotement de la sélection, on peut créer une
deuxième richtextbox invisible avec le même contenu.

Mais peut-être souhaites-tu simplement détecter des URL dans ton RTB? dans
ce cas tu pourrais utiliser EM_AUTOURLDETECT pour autoriser une
autodétection des URL et/ou utiliser CFE_LINK dans le format de caractère
définit par EM_SETCHARFORMAT. En sous classant le richtextbox tu pourrait
alors récupérer EN_LINK dès que le curseur passe sur le lien.

--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com

"lolo" a écrit dans le message de news:
4142b4c5$0$21762$
J'ai un petit problème, je cherche à remplacer le curseur de la
souris sur événement MouseMouve de mon RichTextBox lorsque le mot de
mon RTF sur lequel pointe la souris est de couleur bleu (par exemple).


Avatar
[-LT-]
Merci François.

"François Picalausa" a écrit dans le message de
news:OHbI$
Hello,

Tu peux tester la couleur comme ceci:
Option Explicit

Private Const EM_CHARFROMPOS = &HD7

Private Declare Function SendMessage _
Lib "user32" _
Alias "SendMessageA" _
( _
ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any _
) _
As Long

Private Type POINTL
x As Long
y As Long
End Type

Private Sub Form_Load()
RichTextBox1.Text = ""
AddText RichTextBox1, "Test "
AddText RichTextBox1, " Red ", vbRed
AddText RichTextBox1, " Green ", vbGreen
AddText RichTextBox1, " some text in blue", vbBlue
End Sub

Private Sub AddText(RTB As RichTextBox, _
Text As String, _
Optional Color As Long = vbBlack, _
Optional append = True)

If append Then
RTB.SelStart = Len(RTB.Text)
End If

RTB.SelColor = Color
RTB.SelText = Text
End Sub

Private Sub RichTextBox1_MouseMove(Button As Integer, Shift As Integer, x


As
Single, y As Single)
Dim pt As POINTL
Dim Char As Long
Dim OSS As Long, OSL As Long

With pt
.x = x / Screen.TwipsPerPixelX
.y = y / Screen.TwipsPerPixelY
End With

Char = SendMessage(RichTextBox1.hwnd, EM_CHARFROMPOS, 0, pt)
OSS = RichTextBox1.SelStart
OSL = RichTextBox1.SelLength

RichTextBox1.SelStart = Char
RichTextBox1.SelLength = 1

If RichTextBox1.SelColor = vbBlue Then
RichTextBox1.MousePointer = rtfUpArrow
Else
RichTextBox1.MousePointer = rtfDefault
End If

RichTextBox1.SelStart = OSS
RichTextBox1.SelLength = OSL
End Sub

Pour éviter l'effet de clignotement de la sélection, on peut créer une
deuxième richtextbox invisible avec le même contenu.

Mais peut-être souhaites-tu simplement détecter des URL dans ton RTB? dans
ce cas tu pourrais utiliser EM_AUTOURLDETECT pour autoriser une
autodétection des URL et/ou utiliser CFE_LINK dans le format de caractère
définit par EM_SETCHARFORMAT. En sous classant le richtextbox tu pourrait
alors récupérer EN_LINK dès que le curseur passe sur le lien.

--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com

"lolo" a écrit dans le message de news:
4142b4c5$0$21762$
> J'ai un petit problème, je cherche à remplacer le curseur de la
> souris sur événement MouseMouve de mon RichTextBox lorsque le mot de
> mon RTF sur lequel pointe la souris est de couleur bleu (par exemple).