Тема: AHK: Переход к нужной строке в контроле Edit окна GUI
Следующий скрипт демонстрирует способ перехода к нужной строке в контроле Edit, в том числе и со включённым режимом Wrap (перенос слов без разбивки на новую строку):
; Создадим текст, состоящий из ста строк:
Loop 100
Text := Text a_index "-я строка`, не укладывающаяся в поле видимости.`r`n"
; Создаём окно, режим Wrap включён по умолчанию, размеры Edit укажем так,
; чтобы каждая из строк, не помещаясь в поле видимости, превращалась в две:
Gui, Add, Edit, x6 y9 w241 h190 hwndhwnd_Edit1, % Text
Gui, Add, Text, x6 y211, Введите номер строки:
Gui, Add, Text, x6 y231, Текущая строка:
Gui, Font, S10
Gui, Add, Edit, x136 y209 w30 h20 Number hwndhwnd_Edit2
ControlFocus,, ahk_id %hwnd_Edit2% ; фокус на поле ввода.
Gui, Add, Button, gPass x178 y208 w70 h22, Enter
Gui, Add, Text, vString x96 y230 w30
Gui, Show, w254, Переход к строке`, +Wrap
; Сейчас в поле редактирования у нас 201 строка (с учётом последнего "`r`n").
; Устанавливаем таймер, следящий за тем, в какой строке находится каретка:
SetTimer, CurrentLine
CurrentLine:
ControlGet, current_Line, CurrentLine,,, ahk_id %hwnd_Edit1%
GuiControl,, String, % current_Line
return
; Собственно переход. Воспользуемся оконными сообщениями:
#IfWinActive, Переход к строке`, +Wrap
Enter::
Pass:
EM_LINEINDEX := 0xBB ; Возвращает порядковый номер первого символа в
; определённой строке, счёт от 0.
; Первый параметр - номер строки.
EM_SETSEL := 0xB1 ; Устанавливает выделение, а, соответственно и каретку.
; Первый параметр - начало выделения, второй - конец.
; В нашем случае они равны, т. е. выделения нет,
; устанавливается только каретка.
EM_SCROLLCARET := 0xB7 ; Прокручивает текст, чтобы каретка оказалась
; в поле видимости.
ControlFocus,, ahk_id %hwnd_Edit1%
ControlGetText, Number,, ahk_id %hwnd_Edit2%
; Проверим, не превышает ли введённое число реальное количество строк:
ControlGet, Line_Count, LineCount,,, ahk_id %hwnd_Edit1%
if (Number > Line_Count)
Number := Line_Count
; Выясняем порядковый номер первого символа искомой строки.
; Счёт от 0, поэтому вычтем из Number еденицу:
SendMessage, EM_LINEINDEX, Number - 1,,,ahk_id %hwnd_Edit1%
; Теперь нужный нам индекс находится в Errorlevel. Установим каретку в эту
; позицию и прокрутим текст, чтобы каретка оказалась в поле видимости:
SendMessage, EM_SETSEL, Errorlevel, Errorlevel,, ahk_id %hwnd_Edit1%
SendMessage, EM_SCROLLCARET,,,, ahk_id %hwnd_Edit1%
; Если раскомментить следующий текст, то искомая строка будет ещё и первой видимой,
; если она не одна из последних:
/*
EM_GETFIRSTVISIBLELINE := 0xCE, EM_LINESCROLL := 0xB6
; Определим номер первой видимой в поле редактирования строки:
SendMessage, EM_GETFIRSTVISIBLELINE,,,, ahk_id %hwnd_Edit1%
; Прокрутим текст, чтобы искомая строка оказалась первой видимой:
Pos := Number - 1 - Errorlevel
SendMessage, EM_LINESCROLL,, Pos,, ahk_id %hwnd_Edit1%
*/
return
GuiClose:
ExitApp
Подробнее об оконных сообщениях для контрола Edit можно узнать здесь.