1 (изменено: serzh82saratov, 2014-05-22 16:20:25)

Тема: AHK: Видимый переход к нужному месту в контроле Edit

Покурил тему teadrinker AHK: Переход к нужной строке в контроле Edit окна GUI, но так и не соображу.


Gui, Add, Edit, r10 -Wrap +HScroll vResult hwndhResult w400
Gui, Show 
Loop
{
    GuiControlGet, Result
    GuiControl, -Redraw, Result
    GuiControl, , Result, % Result "AddText. " (Mod(A_Index, 20) < 15 ? "" : "`n")
    SetTimer, GoLastChar, -10
    Sleep Mod(A_Index, 20) < 15 ? 100 : 200
}
Return


GoLastChar:   
    PostMessage, 0x00B1, StrLen(Result)*2, StrLen(Result)*2, , ahk_id %hResult%    ;  EM_SETSEL
    SendMessage, 0xB7,,,, ahk_id %hResult%    ;  EM_SCROLLCARET 
    ControlGet, LineCount, LineCount,,, ahk_id %hResult% 
    ControlGet, CurrentCol, CurrentCol,,, ahk_id %hResult%
    SendMessage, 0xB6, CurrentCol, LineCount,, ahk_id %hResult%    ;  EM_LINESCROLL
    GuiControl, +Redraw, Result
    GuiControl, Focus, Result
    Return

Хочется всегда видеть каретку у последнего символа, в данном случае скролл горизонтально не перемещается, да и вертикально каретку видно не всегда. Был вариант с горизонтальным перемещением, но вертикально не работало.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

2 (изменено: serzh82saratov, 2014-05-22 18:23:39)

Re: AHK: Видимый переход к нужному месту в контроле Edit

Вроде дошло:


Gui, Add, Edit, r10 -Wrap +HScroll vResult hwndhResult w300   
Gui, Show 

Loop   
{
    GuiControlGet, Result 
    GuiControl, , Result, % Result "AddText. " (Mod(A_Index, 25) < 15 ? "" : "`n")
    Gosub GoLastChar 
    Sleep 100
}
Return
 
     
GoLastChar:   
    ControlGet, RowCount, LineCount,,, ahk_id %hResult% 
    SendMessage, 0xBB, RowCount - 1,,,ahk_id %hResult%    ;  EM_LINEINDEX
    LINEINDEX := Errorlevel
    SendMessage, 0x00B1, LINEINDEX, LINEINDEX, , ahk_id %hResult%    ;  EM_SETSEL
    SendMessage, 0x00C1, -1, , , ahk_id %hResult%    ;  EM_LINELENGTH
    LastPos := Errorlevel + LINEINDEX
    SendMessage, 0x00B1, LastPos, LastPos, , ahk_id %hResult%    ;  EM_SETSEL
    SendMessage, 0xB7,,,, ahk_id %hResult%    ;  EM_SCROLLCARET 
    Return

Или так:


Gui, Add, Edit, r10 -Wrap +HScroll vResult hwndhResult w300   
Gui, Show 

Loop   
{
    GuiControl, , Result, % Result "AddText. " (Mod(A_Index, 25) < 15 ? "" : "`n") 
    Gosub GoLastChar 
    Sleep 100
}
Return
  
GoLastChar:    
    GuiControlGet, Result
    StringReplace, Str, Result, `n, ||, 1 
    StringReplace, Str, Str, `r, ||, 1 
    LastPos := StrLen(Str) 
    SendMessage, 0x00B1, LastPos, LastPos, , ahk_id %hResult%    ;  EM_SETSEL
    SendMessage, 0xB7,,,, ahk_id %hResult%    ;  EM_SCROLLCARET 
    Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

3

Re: AHK: Видимый переход к нужному месту в контроле Edit

Вот только вопрос по EM_LINELENGTH, и по оптимальности решения.
Он что может узнать длинну только той строки, на которой каретка?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

4 (изменено: serzh82saratov, 2014-05-22 21:57:44)

Re: AHK: Видимый переход к нужному месту в контроле Edit

Укороченный вариант:


Gui, Add, Edit, r10 -Wrap +HScroll vResult hwndhResult w300   
Gui, Show 

Loop   
{
    GuiControlGet, Result
    GuiControl, , Result, % Result "AddText. " (Mod(A_Index, 25) < 15 ? "" : "`n") 
    SendMessage, 0x0E, , , , ahk_id %hResult%    ;  WM_GETTEXTLENGTH
    PostMessage, 0x00B1, Errorlevel, Errorlevel, , ahk_id %hResult%    ;  EM_SETSEL
    PostMessage, 0xB7,,,, ahk_id %hResult%    ;  EM_SCROLLCARET 
    Sleep 100
}
Return

Насчёт EM_LINELENGTH всё также интересно.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

5 (изменено: serzh82saratov, 2014-05-23 14:32:46)

Re: AHK: Видимый переход к нужному месту в контроле Edit

Всем спасибо, разобрался с EM_LINELENGTH, нашёл человечий перевод.
Пример перехода в конец нужной строки:


    Row = 3
    SendMessage, 0xBB, Row - 1,,,ahk_id %hResult%    ;  EM_LINEINDEX 
    LINEINDEX := Errorlevel
    SendMessage, 0x00C1, LINEINDEX, , , ahk_id %hResult%    ;  EM_LINELENGTH
    RowEnd := Errorlevel+LINEINDEX
    PostMessage, 0x00B1, RowEnd, RowEnd, , ahk_id %hResult%    ;  EM_SETSEL 
    PostMessage, 0xB7,,,, ahk_id %hResult%    ;  EM_SCROLLCARET  
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

6

Re: AHK: Видимый переход к нужному месту в контроле Edit

а как быть с программами типа текстовых редакторов с функцией wrap lines? Как получить реальный индекс строки, а не индекс её части?