1

Тема: AHK: Автоподстройка высоты окна GUI под содержимое

Всем привет.
Есть такой код:

#SingleInstance force
#NoEnv
SetBatchLines, -1
SetTitleMatchMode, 3

sender = Джубадзе
col = navy
font = Calibri
tex = В чащах юга жил был кактус, но фальшивый экземпляр. Слово экземпляр и этот текст уже не отображаются.

gui, +hwndguihwnd
gui, font, s14 c%col%, %font%
gui, add, text, w380 center vm
gui, add, button, x155 default, Хорошо!

guicontrol,,m,%tex%
guicontrol, move, m, autosize
gui, show, w400 center, Сообщение от %sender%
winwaitclose, ahk_id %guihwnd%

buttonХорошо!:
guiclose:
gui, destroy
exitapp
return

Это тестовый скриптик для иллюстрации проблемы. Проблема в том, что текст не вмещается в текстовое поле, не переносится на следующую строку, а поле не увеличивается. Надо, чтобы поле автоматически подстраивало свой размер (высоту) под текст. Я добавил autosize, но это не работает. Есть идеи?

2 (изменено: serzh82saratov, 2015-10-22 23:38:23)

Re: AHK: Автоподстройка высоты окна GUI под содержимое

Если просто при старте, то так:


#SingleInstance force
#NoEnv
SetBatchLines, -1
SetTitleMatchMode, 3

sender = Джубадзе
col = navy
font = Calibri
tex = В чащах юга жил был кактус, но фальшивый экземпляр. Слово экземпляр и этот текст уже не отображаются.

gui, +hwndguihwnd
gui, font, s14 c%col%, %font%
gui, add, text, w380 center vm -Wrap,%tex%
gui, add, button, x155 default, Хорошо!

guicontrol,,m,%tex%
guicontrol, move, m, autosize
gui, show, w400 center, Сообщение от %sender%
winwaitclose, ahk_id %guihwnd%

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

3

Re: AHK: Автоподстройка высоты окна GUI под содержимое

У вас -wrap,%tex% добавлено в момент создания окна. Но в этот момент переменная tex ещё не содержит текста (да, в этом примере содержит, но этот скрипт просто для иллюстрации), в реальном коде переменная обретает значение уже после строки

gui, add, button, x155 default, Хорошо!

Поэтому ресайзить под текст, видимо надо уже на этапе guicontrol...

4

Re: AHK: Автоподстройка высоты окна GUI под содержимое

Только что методом научного тыка (guicontrol, move, m, h200) выяснил, что сам по себе текст на следующую строку переносится, проблема только в том, что не ресайзится окно, не подстраивается под текст.

5

Re: AHK: Автоподстройка высоты окна GUI под содержимое

sender = Джубадзе
col = navy
font = Calibri

tex1 = В чащах юга жил был кактус, но фальшивый экземпляр. Слово экземпляр и этот текст уже не отображаются. 
tex2 = Только что методом научного тыка (guicontrol, move, m, h200) выяснил, что сам по себе текст на следующую строку переносится, проблема только в том, что не ресайзится окно, не подстраивается под текст.
tex3 = В чащах юга жил был кактус

gui, font, s14 c%col%, %font%
gui, add, text, w380 center hwndm -Wrap
gui, add, button, x155 y+10 default vbutton, Хорошо!
gui, show, w400
return

buttonХорошо!:
    i := (!i || i = 3) ? 1 : ++i
    DllCall("DestroyWindow", "Ptr", m)
    gui, add, text, w380 xm ym center hwndm -Wrap, % tex%i%
    GuiControlGet, p, Pos, %m%
    guicontrol, move, button, % "y" py+ph+10 
    gui, show, w400   autosize, Сообщение от %sender% 
    return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

6

Re: AHK: Автоподстройка высоты окна GUI под содержимое

Indrik пишет:

Только что методом научного тыка (guicontrol, move, m, h200) выяснил, что сам по себе текст на следующую строку переносится, проблема только в том, что не ресайзится окно, не подстраивается под текст.

Немного неверно, в первую очередь размер самого контрола text не меняется при изменении в нём текста.

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

7

Re: AHK: Автоподстройка высоты окна GUI под содержимое

Да, ваш скрипт ресайзит всё как надо. Только он работает не так как было задумано. Например, в строке 12 в моём случае не нужно делать gui, show, т.к. там ещё нечего показывать. Но когда я закомментировал эту строку, то скрипт вообще перестал что-либо показывать. Многое в коде непонятно (откуда берётся у+10, почему 10?, почему wrap идёт с минусом, если это как раз должно отменять перенос слов, ну и другие моменты). В общем, буду разбираться.

8

Re: AHK: Автоподстройка высоты окна GUI под содержимое

Вот такая морковина получилась.

#SingleInstance force
#NoEnv
SetBatchLines, -1
SetTitleMatchMode, 3

sender = Джубадзе
col = navy
font = Calibri
tex = В чащах юга жил был кактус, но фальшивый экземпляр. Слово экземпляр и этот текст уже не отображаются. Здесь пишу произвольный длинный текст, проверяю отображение при длинном тексте. Ехал грека через реку, видит грека – в реке рак, сунул грека руку в реку, рак за руку грека цап!

gui, +hwndguihwnd
gui, font, s14 c%col%, %font%
gui, add, text, w380 center vt
gui, add, button, x155 y+10 default vb, Хорошо!

DllCall("DestroyWindow", "Ptr", t)
gui, add, text, w380 xm ym center hwndt, %tex%
GuiControlGet, position, Pos, %t%
guicontrol, move, b, % "y" positiony+positionh+10
gui, show, w400 autosize center, Сообщение от %sender%
winwaitclose, ahk_id %guihwnd%

buttonХорошо!:
guiclose:
gui, destroy
exitapp
return

Но я нигде не использовал -wrap. Так и не понял, зачем он. В остальном вроде разобрался.

9 (изменено: Indrik, 2015-10-23 02:18:55)

Re: AHK: Автоподстройка высоты окна GUI под содержимое

Пытаюсь сделать точную центровку по горизонтали. Не удаётся получить данные только что созданного элемента. Вот:

#SingleInstance force
#NoEnv
SetBatchLines, -1
SetTitleMatchMode, 3

sender = Джубадзе
col = navy
font = Calibri
tex = В чащах юга жил был кактус, но фальшивый экземпляр. Слово экземпляр и этот текст уже не отображаются. Здесь пишу произвольный длинный текст, проверяю отображение при длинном тексте. Ехал грека через реку, видит грека – в реке рак, сунул грека руку в реку, рак за руку грека цап!

gui, +hwndguihwnd
gui, font, s14 c%col%, %font%
gui, add, text, w380 center vt
gui, add, button, x155 y+10 default vb, Хорошо!
GuiControlGet, posb, Pos, %b%

msgbox, %posbx%
exitapp

msgbox отображает пустой текст. guicontrolget не работает с кнопками?

10

Re: AHK: Автоподстройка высоты окна GUI под содержимое

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

11

Re: AHK: Автоподстройка высоты окна GUI под содержимое

Да, действительно. А почему с текстовой областью нужны проценты, а с кнопкой нет?

12

Re: AHK: Автоподстройка высоты окна GUI под содержимое

Не с текстовой областью, а с переменной содержащей хэндл.
Есть разница?

gui, add, text, w380 center hwndt

и

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

13 (изменено: Indrik, 2015-10-23 03:04:48)

Re: AHK: Автоподстройка высоты окна GUI под содержимое

Да, спасибо. С хэндлами я не очень дружу.
Но центровку всё равно сделать не получается. Кнопка явно чуть смещена влево. Где-то на 15-20 пикселей.

gui, +hwndguihwnd
gui, font, s14 c%col%, %font%
gui, add, text, w380 center vt
gui, add, button, x1 y+10 default vb, Хорошо!
GuiControlGet, posb, Pos, b

DllCall("DestroyWindow", "Ptr", t)
gui, add, text, w380 xm ym center hwndt, %tex%
GuiControlGet, post, Pos, %t%

guicontrol, move, b, % "y" posty+posth+10 "x" round((postw/2)-(posbw/2))
gui, show, w400 autosize center, Сообщение от %sender%
winwaitclose, ahk_id %guihwnd%

buttonХорошо!:
guiclose:
gui, destroy
msgbox, % round((postw/2)-(posbw/2))
exitapp
return

14

Re: AHK: Автоподстройка высоты окна GUI под содержимое

gui, font, s14 c%col%, %font% 
gui, add, button, x1 y+10 default vb, I        I        I  
DllCall("DestroyWindow", "Ptr", t)
gui, add, text, w380 xm ym center hwndt, I
GuiControlGet, text, Pos, %t%
GuiControlGet, button, Pos, b
guicontrol, move, b, % "y" texty+texth "x" textx+textw//2-buttonw//2 
gui, show, w400 autosize center, Сообщение от %sender%
return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

15

Re: AHK: Автоподстройка высоты окна GUI под содержимое

А, ну т.е. отсчёт надо было явно ставить от текстового блока. Хотя в документации сказано, что текстовый блок добавляется borderless, т.е. без оконтовочных пикселей. Ну да ладно, видимо у них всё-таки есть какая-то оконтовка (не у текстового блока, так у самого gui).
В общем, вот что получилось, может, кому пригодится:

#SingleInstance force
#NoEnv
SetBatchLines, -1
SetTitleMatchMode, 3

sender = Джубадзе
col = navy
font = Calibri
tex = В чащах юга жил был кактус, но фальшивый экземпляр.

gui, +hwndguihwnd
gui, font, s14 c%col%, %font%
gui, add, text, w400 center vt
gui, add, button, x156 y+10 default vb, Хорошо!
GuiControlGet, posb, Pos, b

DllCall("DestroyWindow", "Ptr", t)
gui, add, text, w400 xm ym center hwndt, %tex%
GuiControlGet, post, Pos, %t%

guicontrol, move, b, % "y" posty+posth+10 "x" postx+round((postw/2)-(posbw/2))
gui, show, w400 autosize center, Сообщение от %sender%
winwaitclose, ahk_id %guihwnd%

buttonХорошо!:
guiclose:
gui, destroy
exitapp
return

Большое спасибо serzh82saratov-у! Вы мне очень помогли!

P.S. Кстати, то что у меня в одном месте стояло 380, а в другом 400, на позицию кнопки не влияло. Я пробовал ставить 400 везде, но кнопка всё равно была смещена влево. Это прошло только когда я задал postx+round((postw/2)-(posbw/2))

16 (изменено: serzh82saratov, 2015-10-23 03:56:49)

Re: AHK: Автоподстройка высоты окна GUI под содержимое

Хотя в документации сказано, что текстовый блок добавляется borderless, т.е. без оконтовочных пикселей

Читайте Margin.

Если обнулить Margin, то и ваш старый код подойдёт:


gui, +hwndguihwnd
gui, Margin, 0 
gui, font, s14 c%col%, %font%
gui, add, text, w380 center vt
gui, add, button, x1 y+10 default vb, |   |   |
GuiControlGet, posb, Pos, b

DllCall("DestroyWindow", "Ptr", t)
gui, add, text, w380 xm ym center hwndt, |   |   |
GuiControlGet, post, Pos, %t%

guicontrol, move, b, % "y" posty+posth+10 "x" round((postw/2)-(posbw/2))
gui, show, w400 autosize center, Сообщение от %sender%
winwaitclose, ahk_id %guihwnd%
return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

17 (изменено: serzh82saratov, 2015-10-23 04:24:23)

Re: AHK: Автоподстройка высоты окна GUI под содержимое

Да и тут:

gui, show, w400 autosize

w400 ничего не даёт, ведь действует autosize.

В общих случаях как то так:


col = navy
font = Calibri

sender1 = Джубадзе
sender2 = Меладзе
sender3 = Орджоникидзе

text1 = В чащах юга жил был кактус, но фальшивый экземпляр. Слово экземпляр и этот текст уже не отображаются.`n|
text2 = Только что методом научного тыка (guicontrol, move, m, h200) выяснил, что сам по себе текст на следующую строку переносится, проблема только в том, что не ресайзится окно, не подстраивается под текст.`n|
text3 = В чащах юга жил был кактус`n|

gui, Margin, 88
gui, font, s14 c%col%, %font%
gui, add, text, w380 center hwndhtext
gui, add, button, default vbutton, |    |    | 
gosub Move

Loop {
    Sleep 600 
    DllCall("DestroyWindow", "Ptr", htext)
    i := (i="" || i = 3) ? 0 : ++i
    gui, add, text, w380 xm ym center hwndhtext, % text%i% 
    gosub Move
}

Move:
    GuiControlGet, text_, Pos, %htext%
    GuiControlGet, but_, Pos, button
    guicontrol, move, button, % "y" text_y+text_h+10 "x" text_x+round((text_w/2)-(but_w/2))
    gui, show, autosize, % "Сообщение от " sender%i%
    Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui