Столкнулся с двумя проблемами:
1. Получение позиции каретки (курсора) в тексте. Без выделения позицию получить просто, но если есть выделение возникает затруднение: если выделение происходит справа налево, то позиция вычисляется, но если выделение происходит слева направо, то позицию вычислить с помощью 'GetCurrentCol' не получается - всегда возвращается позиция начального выделения, а не там где находится каретка.
2. Получение номера строки где находится курсор при использовании "переноса по словам", номер строки относительно реального текста.
В Блокноте в строке состояния есть вычисление "номера строки" и "Столбца" - там данные выводятся корректно при "переноса по словам" и различных направлениях выделения.
Посмотрел темы англ. форума, но не нашёл решения.
Возможно кто-то уже сталкивался с подобным и может подсказать выход...
Вот пример о чём я написал:
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