Что нового

Получение точных данных в Edit Control

Andrey_A

Продвинутый
Сообщения
325
Репутация
68
Столкнулся с двумя проблемами:
1. Получение позиции каретки (курсора) в тексте. Без выделения позицию получить просто, но если есть выделение возникает затруднение: если выделение происходит справа налево, то позиция вычисляется, но если выделение происходит слева направо, то позицию вычислить с помощью 'GetCurrentCol' не получается - всегда возвращается позиция начального выделения, а не там где находится каретка.

2. Получение номера строки где находится курсор при использовании "переноса по словам", номер строки относительно реального текста.

В Блокноте в строке состояния есть вычисление "номера строки" и "Столбца" - там данные выводятся корректно при "переноса по словам" и различных направлениях выделения.

Посмотрел темы англ. форума, но не нашёл решения.
Возможно кто-то уже сталкивался с подобным и может подсказать выход...
Вот пример о чём я написал:
Код:
#include <GUIConstantsEx.au3>
#include <GuiEdit.au3>
#include <MsgBoxConstants.au3>

_MainEdit()

Func _MainEdit()
    Local $iPos,$sText=StringReplace('1. Длинная строка - ааааааааааааааааааааааааааааааааааааааааааааааааааааааааааа|2. Короткая строка|3. Длинная строка - ббббббббббббббббббббббббббббббббббббббббббббббббббббббббббб|4. Короткая строка|5. Длинная строка - ввввввввввввввввввввввввввввввввввввв|6. Короткая строка|7. Длинная строка - гггггггггггггггггггггггггггггггггггггггггггггггггг|8. Короткая строка|9. Длинная строка - ддддддддддддддддддддддддддддддддддддддддддддддддддд|10. Короткая строка','|',@CRLF)
    Local $hGUI=GUICreate('Позиция курсора и номер строки',400,300)
    GUISetFont(10,0,0,'Segoe UI')
    Local $iEdit=GUICtrlCreateEdit('',2,2,394,238,BitOR(4096,0x00200000))
    Global $hEdit=GUICtrlGetHandle(-1)
    $iButton=GUICtrlCreateButton("+",3,248,20)
    GUICtrlSetTip(-1,'Получить позицию курсора')
    Global $Label=GUICtrlCreateLabel('',33,248,350,25)
    GUICtrlSetBkColor(-1,0xfdffae)
    GUISetState()
    _GUICtrlEdit_SetText($iEdit,$sText)
    AdlibRegister('SET_DATA_EDIT',99)
    Do
      Switch GUIGetMsg()
        Case -3
          ExitLoop GUIDelete()
        Case $iButton
          $iPos=_GUICtrlEdit_GetPosCursor($iEdit)
          MsgBox(4096,'Позиция','$Pos =>'&$iPos&'<=')
          _WinAPI_SetFocus($hEdit)
      EndSwitch
    Until 0
EndFunc

Func SET_DATA_EDIT()
  Local $n=ControlCommand($hEdit,'','','GetCurrentLine') ; возвращает номер строки, в котором находится курсор в элементе Edit
  Local $k=ControlCommand($hEdit,'','','GetCurrentCol') ; возвращает номер колонки, в котором находится курсор в элементе Edit
  Local $iIndex=_SendMessage($hEdit,187,$n-1) ; возвращает индекс первого символа указанной строки
  ; $iIndex+$k-1 ; возвращает позицию курсора в документе

  GUICtrlSetData($Label,'Строка: '&$n&', Столбец: '&$k&', Позиция курсора: '&$iIndex+$k-1)
EndFunc

Func _GUICtrlEdit_GetPosCursor($hWnd)
  $hWnd=(IsPtr($hWnd)And IsHWnd($hWnd))? $hWnd : GUICtrlGetHandle($hWnd)
  Return _SendMessage($hWnd,187,ControlCommand($hWnd,'','','GetCurrentLine')-1)+ControlCommand($hWnd,'','','GetCurrentCol')-1
EndFunc


editbloknon.png
 
Верх