Option Explicit
Private Const EM_CHARFROMPOS& = &HD7
Private Type POINTAPI
X As Long
Y As Long
End Type
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVa
l hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As
Long
' Return the word the mouse is over.
Public Function RichWordOver(rtf As RichTextBox, X As Single, Y As Single) A
s String
Dim pt As POINTAPI
Dim pos As Integer
Dim start_pos As Integer
Dim end_pos As Integer
Dim ch As String
Dim txt As String
Dim txtlen As Integer
' 把位置坐标转换为像素.
pt.X = X \ Screen.TwipsPerPixelX
pt.Y = Y \ Screen.TwipsPerPixelY
' Get the character number
pos = SendMessage(rtf.hWnd, EM_CHARFROMPOS, 0&, pt)
If pos <= 0 Then Exit Function
'查找单词的开始位置.
txt = rtf.Text
For start_pos = pos To 1 Step -1
ch = Mid$(rtf.Text, start_pos, 1)
' 允许数字,字母,下划线
If Not ( _
(ch >= "0" And ch <= "9") Or _
(ch >= "a" And ch <= "z") Or _
(ch >= "A" And ch <= "Z") Or _
ch = "_" _
) Then Exit For
Next start_pos
start_pos = start_pos + 1
'查找单词的结尾
txtlen = Len(txt)
For end_pos = pos To txtlen
ch = Mid$(txt, end_pos, 1)
' 允许数字,字母,下划线
If Not ( _
(ch >= "0" And ch <= "9") Or _
(ch >= "a" And ch <= "z") Or _
(ch >= "A" And ch <= "Z") Or _
ch = "_" _
) Then Exit For
Next end_pos
end_pos = end_pos - 1
If start_pos <= end_pos Then _
RichWordOver = Mid$(txt, start_pos, end_pos - start_pos + 1)
End Function
Private Sub Form_Load()
rtfTest.Text = "Welcome to use source code provided by Alp Studio" & _
vbCrLf & vbCrLf & "This example program is provided as is with no wa
rranty of any kind" & _
vbCrLf & vbCrLf & "Send the control the EM_CHARFROMPOS message to ma
ke it return the character closest to the mouse position." & _
vbCrLf & vbCrLf & "http://dropwater.163.net"
End Sub
Private Sub rtftest_MouseMove(Button As Integer, Shift As Integer, X As Sing
le, Y As Single)
Dim txt As String
txt = RichWordOver(rtfTest, X, Y)
If lblCurrentWord.Caption <> txt Then _
lblCurrentWord.Caption = txt
End Sub