Местоположение курсора в текстовом поле и указатель мыши - VB

Узнай цену своей работы

Формулировка задачи:

В этой теме речь идёт о следующем: По текстовом полю скользит указатель мыши. Вот этот указатель "наткнулся" на слово. Как определить местоположение этого слова? Скопировать это слово? И перебросить на метку? Первый шаг в этом направлении я сделал. Можно просто кликнуть мышкой. Предлагаемая вашему вниманию программа находит английское слово, если клик был на этом слове. Но тема создана для решения другого вопроса. (без клика). Как связать координаты курсора мыши и местоположение слова в тексте?? Решение. Если мы имеем однострочное поле и моноширинный шрифт (например Lucida Console), то не так сложно увязать координату X с позицией текстового курсора. А если шрифт иной (например Arial), то тут надо просчитывать ширину каждого символа, учитывать размер шрифта, его стиль И самое главное положение полосы прокрутки. В общем случае (мультиполе) придётся высчитывать номер строки Можно конечно сделать массив текстовых полей и о строке более не заботится. Однако проблем в решении этой задачи более, чем достаточно. Буду рад любой подсказке (например, если какие Api-функции)? Что-то ещё? Как справится с полосами прокрутки? И .... ??? 
Листинг программы
  1. Option Explicit
  2. Dim tt As String, s As String, t1 As String
  3. Dim n%, n1%, n2%, i%
  4. Private Sub txtT_Click()
  5. tt = txtT.Text
  6. tt = " " + tt + " "
  7. n = txtT.SelStart + 2
  8. If Bu(Mid(tt, n, 1)) Then n2 = n Else n2 = n - 1
  9. n1 = n
  10. On Error GoTo 2014
  11. For i = n To n + 20
  12. t1 = Mid(tt, i, 1)
  13. If Not Bu(t1) Then Exit For
  14. n2 = i
  15. Next i
  16. For i = n To 2 Step -1
  17. t1 = Mid(tt, i - 1, 1)
  18. If Not Bu(t1) Then Exit For
  19. n1 = i - 1
  20. Next i
  21. s = Mid(tt, n1, n2 - n1 + 1)
  22. lblL.Caption = s
  23. 2014
  24. End Sub
  25. Private Function Bu(z As String) As Boolean
  26. Bu = False
  27. If z >= "a" And z <= "z" Then Bu = True
  28. End Function
  29. Private Sub txtT_MouseMove(Button As Integer, Shift As Integer, _
  30. X As Single, Y As Single)
  31. ' lblL.Caption = Str(Int(X / 200) + 1) + " " + Str(Int(Y / 300))
  32. End Sub
Удачи вам всем!

Решение задачи: «Местоположение курсора в текстовом поле и указатель мыши»

textual
Листинг программы
  1. Option Explicit
  2. Private Const EM_CHARFROMPOS& = &HD7
  3. 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
  4.  
  5. Private Sub txtText_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  6.     Dim Pos As Long
  7.     X = ScaleX(X, vbTwips, vbPixels): Y = ScaleY(Y, vbTwips, vbPixels)
  8.     Pos = CLng(X) + (CLng(Y) * &H10000)
  9.     Me.Caption = GetWord(txtText, Pos)
  10. End Sub
  11.  
  12. Private Function GetWord(Text As TextBox, Pos As Long) As String
  13.     Dim ptChar As Long, PtLine As Long
  14.     Dim ptStart As Long, ptEnd As Long
  15.     ptChar = SendMessage(Text.hWnd, EM_CHARFROMPOS, 0, ByVal Pos)
  16.     PtLine = ptChar \ &H10000
  17.     ptChar = ptChar And &HFFFF&
  18.     If ptChar <= 0 Then Exit Function
  19.     ptStart = ptChar
  20.     Do Until ptStart <= 0
  21.         If Mid$(Text.Text, ptStart, 1) <= " " Then Exit Do
  22.         ptStart = ptStart - 1
  23.     Loop
  24.     ptEnd = ptChar
  25.     Do Until ptEnd > Len(Text.Text) Or Mid$(Text.Text, ptEnd, 1) <= " "
  26.         ptEnd = ptEnd + 1
  27.     Loop
  28.     If ptStart = ptEnd Then Exit Function
  29.     GetWord = Mid$(Text.Text, ptStart + 1, ptEnd - ptStart - 1)
  30. End Function

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.071 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы