1 (изменено: teadrinker, 2009-01-05 22:00:51)

Тема: 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 можно узнать здесь.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder