1

Тема: AHK: Как используя GUI сделать MsgBox

Сабж (обсуждаемая тема).
Мне нужно вывести текст, а из контролов достаточно одной кнопки "ОК".

Дайте пожалуйста пример, а то у меня получается ерунда какая то.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

2 (изменено: Indomito, 2012-04-10 05:26:09)

Re: AHK: Как используя GUI сделать MsgBox

Так сделал то что хотел...

;=====Справка по клавишам
^+F1::
gui, font, s12
Gui, Add, ListView, r18 w550 gMyListView, Клавиши|Описание
i := 1
while (arrayTxt[i] != "")
 {
  LV_Add("", arrayKey[i], arrayTxt[i])
  i++
  }
Gui, Add, Button, Default, OK
Gui, Show,, Справка по клавишам Ctrl+Shift+F1
return

MyListView:
LV_ModifyCol(1)
LV_ModifyCol(2)
return

ButtonOK:
Gui, Destroy
return

Но возник вопрос, как избавиться от указания R и W т.е. Gui, Add, ListView, r18 w550 gMyListView, Клавиши|Описание, а что бы была авто подгонка по содержимому.

Подскажите пожалуйста.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

3

Re: AHK: Как используя GUI сделать MsgBox

С количеством строк разобрался, т.е. понял как динамически менять, а вот с шириной ни как, т.е. не могу найти похожего примера или функции которая её (ширину) может поменять.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

4

Re: AHK: Как используя GUI сделать MsgBox

Indomito пишет:

С количеством строк разобрался, т.е. понял как динамически менять, а вот с шириной ни как, т.е. не могу найти похожего примера или функции которая её (ширину) может поменять.

LV_ModifyCol.

5

Re: AHK: Как используя GUI сделать MsgBox

Александр_ я не про это, я про горизонтальный размер окна (width), она то не меняется, т.е. её можно задать вычислив.... а вот что не соображу.
С числом строк то было просто.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

6

Re: AHK: Как используя GUI сделать MsgBox

Indomito пишет:

Александр_ я не про это, я про горизонтальный размер окна (width), она то не меняется, т.е. её можно задать вычислив.... а вот что не соображу.

Т.е. нужно просто подогнать размер диалогового окна под размер ListView?

7

Re: AHK: Как используя GUI сделать MsgBox

Вот код

;=====Справка по клавишам
#q::
^+F1::
HelpKey:
i := 1
while (arrayKey[i,vText] != "")
    i++
Gui, New
gui, font, s11
Gui, Add, ListView, r%i% w450 gMyListView, Клавиши|Описание

i := 1
while (arrayKey[i,vText] != "")
 {
   LV_Add("", arrayKey[i,vKeys], arrayKey[i,vText])
   i++
  }
Gui, Add, Button, Default, OK
Gui, Show,, Справка по клавишам Win+Q или Ctrl+Shift+F1
return

MyListView:
Gosub GuiClose
if A_GuiEvent = DoubleClick
{
    LV_GetText(RowText, A_EventInfo)  
    LabelName := arrayKey[A_EventInfo,vLabels]
   if IsLabel(LabelName)
     Gosub %LabelName% 
   else
     MsgBox , 0
            , ОШИБКА, --- The script has finished its work because of an error --- `n`n Ошибка в массиве меток [arrayLbl] или метки не существует
            , 15
}
return

GuiClose:
ButtonOK:
Gui, Cancel ;Так вроде правильно чем -> Gui, Destroy
return

А вот скрин

http://i29.fastpic.ru/big/2012/0410/e8/484fd6c8bb347b3d525b2bb22fcaa6e8.png

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

8

Re: AHK: Как используя GUI сделать MsgBox

Наверно проще всего определить длины строк через сообщение LVM_GETSTRINGWIDTH и сложить их(возможно ещё с отступами). Ещё можно добавить третий столбец и воспользоваться автовыравниванием, тогда ширина последнего(пустого) столбца и будет лишней. Во втором способе самый серьёзный недостаток- это необходимость сперва создать listview с запасом.

9 (изменено: Indomito, 2012-04-11 17:59:04)

Re: AHK: Как используя GUI сделать MsgBox

Александр_ вроде понял, но задам два вопроса по теме.
1. Я Запускаю из справки по событию if A_GuiEvent = DoubleClick, а как просто по ЛКМ?
2. Надо отцентрировать второй столбец, т.е. сделать align center, но что бы я не писал центрирования не происходит.

И ещё как вызвать LVM_GETSTRINGWIDTH, просто я не программирую в Windows и мне немного не понятно, т.е. некоторые вещи понимаю с трудом после прочтения кучи FAQ

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

10 (изменено: Александр_, 2012-04-11 18:56:28)

Re: AHK: Как используя GUI сделать MsgBox

Indomito пишет:

1. Я Запускаю из справки по событию if A_GuiEvent = DoubleClick, а как просто по ЛКМ?

Задать свойство "AltSubmit" и ловить событие "Normal". Т.е.:

Gui, Add, ListView, r%i% w450 gMyListView AltSubmit, Клавиши|Описание
...
MyListView:
if(A_GuiEvent == "Normal")
{
   ...
}
...
Indomito пишет:

2. Надо отцентрировать второй столбец, т.е. сделать align center, но что бы я не писал центрирования не происходит.

Не понял зачем его центровать, но для этого есть опция "Center". Например "LV_ModifyCol(2, "Center")" центрует вторую колонку, если в колонке уже есть записи, то нужно перерисовать контрол, например функцией "RedrawWindow". Пример:

Gui, Add, ListView, HWNDhListViev r5 w200, число|строка
LV_Add("", "1", "one")
LV_Add("", "2", "two")
Gui, Show, , карамба!
LV_ModifyCol(2, "Center")
DllCall("RedrawWindow", "ptr", hListViev, "ptr", 0, "int", 0, "uint", 1)
LV_Add("", "3", "three")
return

Esc::
GuiClose:
   ExitApp
Indomito пишет:

И ещё как вызвать LVM_GETSTRINGWIDTH, просто я не программирую в Windows и мне немного не понятно, т.е. некоторые вещи понимаю с трудом после прочтения кучи FAQ

Пример:

LV_GetText(OutputVar, 3, 2) ;получаем текст
SendMessage, 0x1057, 0, &OutputVar, , ahk_id%hListViev%
msgbox Ширина текста во втором столбце и третьей строке %ErrorLevel%px

11

Re: AHK: Как используя GUI сделать MsgBox

Спасибо большое, весьма признателен, а то я совсем закопался в "окошках"

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

12 (изменено: Indomito, 2012-04-11 20:50:44)

Re: AHK: Как используя GUI сделать MsgBox

Александр_ да, центрирование оказалось глупостью

Возник вопрос по LVM_GETSTRINGWIDTH
Как я понимаю кодом

LV_GetText(OutputVar, 3, 2) ;получаем текст
SendMessage, 0x1057, 0, &OutputVar, , ahk_id%hListViev%
msgbox Ширина текста во втором столбце и третьей строке %ErrorLevel%px

надо:
- пробежаться по всей таблице;
- найти максимальное значение;
- перерисовать её(таблицу) используя код

DllCall("RedrawWindow", "ptr", hListViev, "ptr", 0, "int", 0, "uint", 1)

Я всё верно понял/изложил?

P.S. Детали я опустил, т.е. что первый код должен быть модифицирован, а перерисовка рассчитывается по максимальному значению суммы обоих столбцов и используется функция LV_ModifyCol() для задания нужного размера (ширины) 1-го и 2-го столбца.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

13

Re: AHK: Как используя GUI сделать MsgBox

Перерисовывать точно ничего не нужно, при изменении размера окна оно само перерисовывается.
Далее- пробежаться по всей таблице, конечно, можно, но лучше определить размер заранее. Зачем запрашивать данные из ListView, когда можно учесть их по ходу добавления? Плюс мы узнаём длину строки, а после добавления в ListView по обе стороны от текста появятся отступы- их тоже надо учесть. Простого способа узнать точные значения этих отступов я не знаю, поэтому предлагаю вычислить их эмпирически. В примере ниже отступы внутри каждой ячейки равны 12-ти пикселям и ещё 4 для всего контрола:

Gui, Add, ListView, HWNDhListViev r5, 1|2
SendMessage, 0x1057, 0, "1", , ahk_id%hListViev%
SizeFirst := ErrorLevel + 12
SendMessage, 0x1057, 0, "2", , ahk_id%hListViev%
SiseSecond := ErrorLevel + 12
LV_ModifyCol(1, SizeFirst)
LV_ModifyCol(2, SiseSecond)
ControlMove, , , , SizeFirst+SiseSecond+4, , ahk_id%hListViev%
Gui, Add, Button, w75 glButtonEnter, Enter
Gui, Add, Edit, xp+100 w75 vEdit1, one
Gui, Add, Edit, xp+100 w75 vEdit2, two
Gui, Show, , карамба!
return

lButtonEnter:
   Gui, Submit, NoHide
   SendMessage, 0x1057, 0, &Edit1, , ahk_id%hListViev%
   Size := ErrorLevel + 12
   if(Size>SizeFirst)
      SizeFirst := Size
   SendMessage, 0x1057, 0, &Edit2, , ahk_id%hListViev%
   Size := ErrorLevel + 12
   if(Size>SiseSecond)
      SiseSecond := Size
   LV_Add("", Edit1, Edit2)
   LV_ModifyCol(1, SizeFirst)
   LV_ModifyCol(2, SiseSecond)
   ControlMove, , , , SizeFirst+SiseSecond+4, , ahk_id%hListViev%
return

Esc::
GuiClose:
ButtonOK:
   ExitApp
return

14 (изменено: Indomito, 2012-04-11 23:36:29)

Re: AHK: Как используя GUI сделать MsgBox

Александр_ здорово, правда не очень понятно
Ну ничего разберусь.
Я код представлял себе иначе, особенно без ErrorLevel 

Не по теме. Если не сложно, посмотри и ответь - AHK: Команда HotKey и три клавиши. просто если нельзя, то я буду писать иначе скрипт.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

15 (изменено: Indomito, 2012-04-12 17:45:17)

Re: AHK: Как используя GUI сделать MsgBox

Александр_ с таблицей разобрался с кнопками тоже, осталась одна проблема.
Есть текст который надо вывести, но текст разный и иногда его нет, т.е. метод Hide|Show
Я попытался сделать так:

Gui, Add, Text,HWNDhText Hidden, %sasa%
; Куча кода
GuiControl, Show ,HWNDhText

и ничего, переменная sasa вроде бы как то описана и работает, но на экране пусто. Что то не хватает видимо, подскажи плз.

Код

DllCall("RedrawWindow", "ptr", hText, "ptr", 0, "int", 0, "uint", 1)

не помогает.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

16

Re: AHK: Как используя GUI сделать MsgBox

sasa := "text"
Gui, Add, Text, HWNDhText Hidden, %sasa%
Gui, Show, w200 h50
GuiControl, Show, %hText%

17 (изменено: Indomito, 2012-04-12 18:18:53)

Re: AHK: Как используя GUI сделать MsgBox

Александр_ да... я как то и не подумал про %%, а ведь хэндлер контрола тоже переменная - думал я все варианты перебрал

;----------------------------

А если содержимое sasa поменялось, то надо вызвать... т.е. что надо сделать то, a то текст один и тот же выводится.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

18

Re: AHK: Как используя GUI сделать MsgBox

Indomito пишет:

А если содержимое sasa поменялось, то надо вызвать... т.е. что надо сделать то, a то текст один и тот же выводится.

GuiControl, , %hText%, New text
или
ControlSetText, , New text, ahk_id%hText%

Предвижу вопрос о размере текста- он уже обсуждался.

19 (изменено: Indomito, 2012-04-12 19:37:50)

Re: AHK: Как используя GUI сделать MsgBox

Не получается, не работает с переменной

sasa := "Execute... "
Gui, Add, Text, HWNDhText, %sasa%
;много кода
sasa := "Execute... " LabelText
;GuiControl, Show, %hText%
GuiControl, , %hText%, %sasa%
ControlSetText, , %sasa%, ahk_id%hText%

только вот такая конструкция GuiControl, , %hText%, "New text"

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

20

Re: AHK: Как используя GUI сделать MsgBox

Всё работает, просто тексты начинаются одинаково, а добавленный текст не влезает на контрол.

21

Re: AHK: Как используя GUI сделать MsgBox

Александр_ да, извиняюсь, поторопился, надо было изначально увеличить размер контрола.
Ещё раз, большое спасибо.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

22

Re: AHK: Как используя GUI сделать MsgBox

Александр_ код из поста №13 не увеличивает размер окна, т.е. элемента ListView, а добавляет слидеры... или я что то не понял в коде вашем.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

23 (изменено: Александр_, 2012-04-14 23:22:36)

Re: AHK: Как используя GUI сделать MsgBox

Indomito пишет:

Александр_ код из поста №13 не увеличивает размер окна, т.е. элемента ListView, а добавляет слидеры... или я что то не понял в коде вашем.

Дык вопрос-то был только про ширину ListView. При необходимости размер всего диалогового окна можно подогнать через Gui, Show, AutoSize, а примерно вычислить необходимую высоту ListView при помощи сообщения LVM_APPROXIMATEVIEWRECT. Как показывает практика, ошибка аппроксимации всегда примерно одинакова и её можно учесть, в примере ниже я этого не делал:

Gui, Add, ListView, HWNDhListViev r1, 1|2
SendMessage, 0x1057, 0, "1", , ahk_id%hListViev%
SizeFirst := ErrorLevel + 12
SendMessage, 0x1057, 0, "2", , ahk_id%hListViev%
SiseSecond := ErrorLevel + 12
LV_ModifyCol(1, SizeFirst)
LV_ModifyCol(2, SiseSecond)
ControlMove, , , , SizeFirst+SiseSecond+4, , ahk_id%hListViev%
Gui, Add, Button, w75 glButtonEnter HWNDhButton, Enter
Gui, Add, Edit, xp+100 w75 vEdit1 HWNDhEdit1, one
Gui, Add, Edit, xp+100 w75 vEdit2 HWNDhEdit2, two
Gui, Show, , карамба!
return
 
lButtonEnter:
   Gui, Submit, NoHide
   SendMessage, 0x1057, 0, &Edit1, , ahk_id%hListViev%
   Size := ErrorLevel + 12
   if(Size>SizeFirst)
      SizeFirst := Size
   SendMessage, 0x1057, 0, &Edit2, , ahk_id%hListViev%
   Size := ErrorLevel + 12
   if(Size>SiseSecond)
      SiseSecond := Size
   LV_Add("", Edit1, Edit2)
   LV_ModifyCol(1, SizeFirst)
   LV_ModifyCol(2, SiseSecond)
   SendMessage, 0x1040, -1, -1, , ahk_id%hListViev%
   ListViewHeight := (ErrorLevel>>16)&0xFFFF
   ControlMove, , , , SizeFirst+SiseSecond+4, ListViewHeight, ahk_id%hListViev%
   ControlMove, , , ListViewHeight+40, , , ahk_id%hButton%
   ControlMove, , , ListViewHeight+40, , , ahk_id%hEdit1%
   ControlMove, , , ListViewHeight+40, , , ahk_id%hEdit2%
   Gui, Show, AutoSize
return
 
Esc::
GuiClose:
ButtonOK:
   ExitApp
return

24

Re: AHK: Как используя GUI сделать MsgBox

Можно тупой вопрос?
А где результат вычислений, т.е. в какой переменной?

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

25

Re: AHK: Как используя GUI сделать MsgBox

Indomito пишет:

Можно тупой вопрос?
А где результат вычислений, т.е. в какой переменной?

SendMessage возвращает результат в ErrorLevel. При LVM_GETSTRINGWIDTH там сразу нужное значение, а при LVM_APPROXIMATEVIEWRECT нужное значение в старшем слове этой переменной(в младшем предполагаемая ширина контрола и нафиг она нужна я не в курсе), в коде это значение содержит переменная ListViewHeight.

26

Re: AHK: Как используя GUI сделать MsgBox

Спасибо, правда почему ListViewHeight, т.е. я про название не "ширина", а "высота",  ну да ладно - это уже риторический вопрос, хотя я искал что то с Width

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

27

Re: AHK: Как используя GUI сделать MsgBox

Indomito пишет:

Спасибо, правда почему ListViewHeight, т.е. я про название не "ширина", а "высота",  ну да ладно - это уже риторический вопрос, хотя я искал что то с Width

Ширина- это слева направо, а сверху вниз- это высота. Ширина сохранялась в переменных Size, SizeFirst и SiseSecond(опечатка).

28

Re: AHK: Как используя GUI сделать MsgBox

Александр_ что я запутался или вы меня запутали или Вопрос был именно про ширину, т.к. с высотой  (числом строк) и так всё прозрачно или я что то недопонимаю?

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

29

Re: AHK: Как используя GUI сделать MsgBox

Indomito пишет:

Александр_ что я запутался или вы меня запутали или Вопрос был именно про ширину, т.к. с высотой  (числом строк) и так всё прозрачно или я что то недопонимаю?

Тогда код из поста #13 полностью решал проблему.