1 (изменено: Dr.Jekyll, 2013-11-25 14:29:35)

Тема: AHK: Открытие окна Gui,2: как слайдер от основного Gui. Возможно ли?

Добрый день, господа!

Возникла очередная мысль из серии "извращения", но не знаю, как реализовать :

Возможно ли сделать так, чтобы окно Gui,2: открывалось как слайдер при нажатии на кнопку "Submit" или "Ok" (не важно) в основном Gui?

Может есть какие-то другие интересные варианты оформления Gui? ....

Лучше день потерять, потом за пять минут долететь!

2

Re: AHK: Открытие окна Gui,2: как слайдер от основного Gui. Возможно ли?

Возможно ли сделать так, чтобы окно Gui,2: открывалось как слайдер при нажатии на кнопку "Submit" или "Ok" (не важно) в основном Gui?

Например:

Gui, +hwndhGui1
Gui, Add, Button, x70 y20 w70, OK
Gui, Show, w150 h50
return

ButtonOK:
   WinGetPos, X, Y, W,, ahk_id %hGui1%
   Gui, +AlwaysOnTop
   Loop
   {
      Sleep, 10
      Gui, 2:Show, % "x" (x2 := X + A_Index*3) " y" Y " w" 150 " h" 50 " NA"
   } Until x2 >= X + W
   Gui, -AlwaysOnTop
   return

Может есть какие-то другие интересные варианты оформления Gui?

Не сомневайтесь, их тысячи

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

3 (изменено: serzh82saratov, 2016-04-05 03:11:11)

Re: AHK: Открытие окна Gui,2: как слайдер от основного Gui. Возможно ли?

Я понял задумку, как появление второго окна внутри первого. Думаю ТС мог-бы приложить больше усилий в "озадачивании"


#SingleInstance Force
effecttime := 555

Gui, +HWNDhGui1 -DPIScale
Gui, Color, 95746A 
Gui, Add, Button, x10 y200 w70, OK 
Gui, Show, w370 h233
 
Gui, 2: Margin, 0, 0 
Gui, 2: Color, FFAA00 
Gui, 2: Font, s42
Gui, 2: +Parent%hGui1% +HWNDhGui2 -Caption 
Gui, 2: Add, Text, Center, SLIDER`neffect 
Gui, 2: Show, na x100 y70 hide
Return

ButtonOK:  
    DllCall("AnimateWindow","UInt",hGui2,"Int", effecttime,"UInt", 0x00040008) 
    Sleep effecttime
    DllCall("AnimateWindow","UInt",hGui2,"Int", effecttime,"UInt", 0x00050009) 
    Return

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

4

Re: AHK: Открытие окна Gui,2: как слайдер от основного Gui. Возможно ли?

serzh82saratov пишет:

Думаю ТС мог-бы приложить больше усилий в "озадачивании" smile

Прикольно, но вряд ли ТС имел в виду именно это. В основном окне ведь изначально что-то должно быть, а не просто пустое место.

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

5

Re: AHK: Открытие окна Gui,2: как слайдер от основного Gui. Возможно ли?

В основном окне ведь изначально что-то должно быть, а не просто пустое место.

Кто знает этих тс. Может там есть контролы, и он хочет периодически прикрывать это место.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

6

Re: AHK: Открытие окна Gui,2: как слайдер от основного Gui. Возможно ли?

Скорей уж так как-то:

Gui, +hwndhGui1
Gui, Add, Button, x125 y40 w70 gButton vButton, % Chr(0x2192)
Gui, Show, w200 h70

Gui, 2:+hwndhGui2 +owner1 -Caption +Border
Gui, 2:Add, Text,, Здесь какая-то информация
VarSetCapacity(WI, 60)

OnMessage(0x3, "WM_MOVE")
OnMessage(0x112, "WM_MOVE")   ; WM_SYSCOMMAND = 0x112
return

Button:
   DllCall("GetWindowInfo", Ptr, hGui1, Ptr, &WI)
   if i := !i
      Gui, 2:Show, % "x" NumGet(WI, 12, "UInt") " y" NumGet(WI, 24, "UInt") 
                  . " h" NumGet(WI, 32, "UInt") - NumGet(WI, 24, "UInt") " hide"
   DllCall("AnimateWindow", Ptr, hGui2, UInt, 400, UInt, 0x40000|(i ? 1 : 0x10002))
   GuiControl,, Button, % Chr(0x2190|(i ? 0 : 2))
   return
   
GuiClose:
   ExitApp
   
WM_MOVE(wp, lp, msg, hwnd)
{
   global hGui1, WI, i
   static k
   if (msg = 0x112)
   {
      if (wp = 0xF020 && k := 1)   ; SC_MINIMIZE = 0xF020
         Gui, 2:Show, Hide
      
      if (wp = 0xF120 && !(k := 0) && i)   ; SC_RESTORE = 0xF120
         Gui, 2:Show
   }
   
   if (!i || hwnd != hGui1 || k = 1)
      return
   
   DllCall("GetWindowInfo", Ptr, hGui1, Ptr, &WI)
   Gui, 2:Show, % "x" NumGet(WI, 12, "UInt") " y" NumGet(WI, 24, "UInt") 
               . " h" NumGet(WI, 32, "UInt") - NumGet(WI, 24, "UInt") " NA"
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

7 (изменено: Dr.Jekyll, 2013-11-21 11:30:39)

Re: AHK: Открытие окна Gui,2: как слайдер от основного Gui. Возможно ли?

Wow! Сколько ответов! Большое благодарю ВСЕХ! Все варианты интересны!
teadrinker, мне очень понравился последний вариант - это именно то, что я хотел. А как сделать, чтобы слайдер "выезжал" не справа, а снизу?

Еще хотел узнать, можно ли "загнать" в такое GUI окно-слайдер например калькулятор? Чтобы он не открывался, как ему вздумается, в любом месте монитора, а был, типа компонента скрипта с GUI ...

Про позиционирование на мониторе окон других программ я знаю. Вопрос именно во встраивании в скрипт с GUI ...

Лучше день потерять, потом за пять минут долететь!

8

Re: AHK: Открытие окна Gui,2: как слайдер от основного Gui. Возможно ли?

Вниз:

Gui, +hwndhGui1
Gui, Add, Button, x125 y40 w70 gButton vButton, % Chr(0x2193)
Gui, Show, w200 h70

Gui, 2:+hwndhGui2 +owner1 -Caption +Border
Gui, 2:Add, Text,, Здесь какая-то информация
VarSetCapacity(WI, 60)

OnMessage(0x3, "WM_MOVE")
OnMessage(0x112, "WM_MOVE")   ; WM_SYSCOMMAND = 0x112
return

Button:
   DllCall("GetWindowInfo", Ptr, hGui1, Ptr, &WI)
   if i := !i
      Gui, 2:Show, % "x" NumGet(WI, 20, "UInt") " y" NumGet(WI, 16, "UInt")
                  . " w" NumGet(WI, 28, "UInt") - NumGet(WI, 20, "UInt") " h70 hide" 
   DllCall("AnimateWindow", Ptr, hGui2, UInt, 300, UInt, 0x40000|(i ? 4 : 0x10008))
   GuiControl,, Button, % Chr(0x2191|(i ? 0 : 2))
   return
   
GuiClose:
   ExitApp
   
WM_MOVE(wp, lp, msg, hwnd)
{
   global hGui1, WI, i
   static k
   if (msg = 0x112)
   {
      if (wp = 0xF020 && k := 1)   ; SC_MINIMIZE = 0xF020
         Gui, 2:Show, Hide
      
      if (wp = 0xF120 && !(k := 0) && i)   ; SC_RESTORE = 0xF120
         Gui, 2:Show
   }
   
   if (!i || hwnd != hGui1 || k = 1)
      return
   
   DllCall("GetWindowInfo", Ptr, hGui1, Ptr, &WI)
   Gui, 2:Show, % "x" NumGet(WI, 20, "UInt") " y" NumGet(WI, 16, "UInt")
               . " w" NumGet(WI, 28, "UInt") - NumGet(WI, 20, "UInt") " h70 NA"
}

С калькулятором корректно не выходит — невозможно заранее предсказать размер его окна.

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

9 (изменено: Dr.Jekyll, 2013-11-25 13:41:34)

Re: AHK: Открытие окна Gui,2: как слайдер от основного Gui. Возможно ли?

Очень жаль, конечно, что с калькулятором ничего не выходит.
Искал по-забугорным форумам и ничего не нашел, кроме этого:

Gui, add, text, x-10 y-10, ; need something in the Основное окно Gui to enable minimizing
Gui, +lastfound
Gui_1_ID := WinExist()

Gui, Show, h600 w500, Основное окно Gui

Set_Parent_by_id(Gui_1_ID, 2) ; Window_ID, Gui_Number
Gui, 2: Show, x5 y5 h300 w300, Окно 1

Set_Parent_by_id(Gui_1_ID, 3) ; Window_ID, Gui_Number
Gui, 3: Show, x5 y5 h200 w200, Окно 2

Return

Set_Parent_by_id(Window_ID, Gui_Number) ; title text is the start of the title of the window, gui number is e.g. 99
{
  Gui, %Gui_Number%: +LastFound
  Return DllCall("SetParent", "uint", WinExist(), "uint", Window_ID) ; success = handle to previous parent, failure =null
}

ExitApp

Но это не совсем то, что хотелось бы ....

Скомпилировал в .exe простенький Gui-скрипт без возможности изменять размер его окна, который, возможно подойдет в качестве примера какой-нибудь программы ....

teadrinker, если Вам не трудно, покажите пожалуйста, как вписать это окно  в окно скрипта с Gui? Для меня важно понять сам принцип, как это сделать ...

Очень надо ..... Пожа-а-а-а-луйста! ...

Лучше день потерять, потом за пять минут долететь!

10 (изменено: Dr.Jekyll, 2013-11-25 16:07:11)

Re: AHK: Открытие окна Gui,2: как слайдер от основного Gui. Возможно ли?

.... вот, нашел - буржуи сделали на примере "Командной строки":

; Styles we want to remove from the console window:
WS_POPUP := 0x80000000
WS_CAPTION := 0xC00000
WS_THICKFRAME := 0x40000
WS_EX_CLIENTEDGE := 0x200

; Styles we want to add to the console window:
WS_CHILD := 0x40000000

; Styles we want to add to the Gui:
WS_CLIPCHILDREN := 0x2000000

; Flags for SetWindowPos:
SWP_NOACTIVATE := 0x10
SWP_SHOWWINDOW := 0x40
SWP_NOSENDCHANGING := 0x400

; Create Gui and get window ID.
Gui, +LastFound +%WS_CLIPCHILDREN%
GuiWindow := WinExist()

; Launch hidden cmd.exe and store process ID in pid.
Run, %ComSpec%,, Hide, pid

; Wait for console window to be created, store its ID.
DetectHiddenWindows, On
WinWait, ahk_pid %pid%
ConsoleWindow := WinExist()

; Get size of console window, excluding caption and borders:
VarSetCapacity(ConsoleRect, 16)
DllCall("GetClientRect", "uint", ConsoleWindow, "uint", &ConsoleRect)
ConsoleWidth := NumGet(ConsoleRect, 8)
ConsoleHeight:= NumGet(ConsoleRect, 12)

; Apply necessary style changes.
WinSet, Style, % -(WS_POPUP|WS_CAPTION|WS_THICKFRAME)
WinSet, Style, +%WS_CHILD%
WinSet, ExStyle, -%WS_EX_CLIENTEDGE%

; Put the console into the Gui.
DllCall("SetParent", "uint", ConsoleWindow, "uint", GuiWindow)

; Move and resize console window. Note that if SWP_NOSENDCHANGING
; is omitted, it incorrectly readjusts the size of its client area.
DllCall("SetWindowPos", "uint", ConsoleWindow, "uint", 0
    , "int", 10, "int", 10, "int", ConsoleWidth, "int", ConsoleHeight
    , "uint", SWP_NOACTIVATE|SWP_SHOWWINDOW|SWP_NOSENDCHANGING)

; Add a button below the console.
Gui, Add, Button, % "y" ConsoleHeight+20, OK

; Show the Gui. Specify width since auto-sizing won't account for the console.
Gui, Show, % "W" ConsoleWidth+20

; Be sure to close cmd.exe later.
OnExit, Exiting

; If cmd.exe exits prematurely, fall through to ExitApp below.
Process, WaitClose, %pid%

GuiEsape:
GuiClose:
ButtonOK:
Exiting:
OnExit
Process, Close, %pid% ; May be a bit forceful? No effect if it already closed.
ExitApp

Теперь надо как-то запихнуть в окно-слайдер??? ........
Здесь они еще добаляют стили к Командной строке. Хотелось бы просто вписать в Gui окно без всяких "добавок".
Надо как-то попроще мой Example.exe в слайдер ....

Лучше день потерять, потом за пять минут долететь!

11

Re: AHK: Открытие окна Gui,2: как слайдер от основного Gui. Возможно ли?

teadrinker пишет:

Скорей уж так как-то:

Я считаю, это нужно поместить в Коллекцию!

12

Re: AHK: Открытие окна Gui,2: как слайдер от основного Gui. Возможно ли?

Да тут ребята ваще одни шедевры пишут! ... Это все в коллекцию нуна!

Лучше день потерять, потом за пять минут долететь!

13

Re: AHK: Открытие окна Gui,2: как слайдер от основного Gui. Возможно ли?

Dr.Jekyll пишет:

Надо как-то попроще мой Example.exe в слайдер ....

Во-первых, у меня архив не открывается, пишет, повреждён. Для аттача файлов лучше сайтом форума не пользоваться, иногда глючит, лучше использовать сторонние сервисы. Во-вторых, не понял, что конкретно нужно.

ypppu пишет:

Я считаю, это нужно поместить в Коллекцию!

Ок, помещу.

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

14 (изменено: Dr.Jekyll, 2013-11-26 15:44:47)

Re: AHK: Открытие окна Gui,2: как слайдер от основного Gui. Возможно ли?

... Уже сам разобрался и отпала необходимость в том, благодарю за помощь!

Единственное, что еще не понял, как сделать, чтобы кнопка в основном Gui открывала слайдер-окно и не закрывала его. Хочу добавить кнопку "OK, Submit" в слайдере на выполнение задачи, после чего слайдер-окно закрывается.
В общем так:
Кнопка в основном Gui "OK, Submit" - слайдер только открывается,
Кнопка в слайдер-окне "OK, Submit" - слайдер закрывается с выполнением какой-либо задачи (напр.: Run, calc.exe)

И еще, если можно, как сделать открытие слайдер-окна по PID?
Типа:

Process, Exist, %XXX_PID%

Слайдер открывается

Process, WaitClose, %XXX_PID%

Слайдер закрывается

Спасибо!

Лучше день потерять, потом за пять минут долететь!

15

Re: AHK: Открытие окна Gui,2: как слайдер от основного Gui. Возможно ли?

Dr.Jekyll пишет:

как сделать, чтобы кнопка в основном Gui открывала слайдер-окно и не закрывала его.

Gui, +hwndhGui1
Gui, Add, Button, x125 y40 w70 gButton vButton, % Chr(0x2193)
Gui, Show, w200 h70

Gui, 2:+hwndhGui2 +owner1 -Caption +Border
Gui, 2:Add, Text,, Здесь какая-то информация
VarSetCapacity(WI, 60)

OnMessage(0x3, "WM_MOVE")
OnMessage(0x112, "WM_MOVE")   ; WM_SYSCOMMAND = 0x112
return

Button:
   DllCall("GetWindowInfo", Ptr, hGui1, Ptr, &WI)
   Gui, 2:Show, % "x" NumGet(WI, 20, "UInt") " y" NumGet(WI, 16, "UInt")
                  . " w" NumGet(WI, 28, "UInt") - NumGet(WI, 20, "UInt") " h70 hide" 
   DllCall("AnimateWindow", Ptr, hGui2, UInt, 300, UInt, 0x40004)
   return
   
GuiClose:
   ExitApp
   
WM_MOVE(wp, lp, msg, hwnd)
{
   global hGui1, WI
   static k
   if (msg = 0x112)
   {
      if (wp = 0xF020 && k := 1)   ; SC_MINIMIZE = 0xF020
         Gui, 2:Show, Hide
      
      if (wp = 0xF120 && !(k := 0))   ; SC_RESTORE = 0xF120
         Gui, 2:Show
   }
   
   if (hwnd != hGui1 || k = 1)
      return
   
   DllCall("GetWindowInfo", Ptr, hGui1, Ptr, &WI)
   Gui, 2:Show, % "x" NumGet(WI, 20, "UInt") " y" NumGet(WI, 16, "UInt")
               . " w" NumGet(WI, 28, "UInt") - NumGet(WI, 20, "UInt") " h70 NA"
}

И еще, если можно, как сделать открытие слайдер-окна по PID?

Нельзя, процесс у всех окон скрипта один и тот же.

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

16 (изменено: Dr.Jekyll, 2013-11-26 16:09:02)

Re: AHK: Открытие окна Gui,2: как слайдер от основного Gui. Возможно ли?

Большое спасибо, teadrinker, за последний ванриант!


Нельзя, процесс у всех окон скрипта один и тот же.

... Вероятно, я не так выразился. Имелось ввиду PID сторонней программы, например после запуска calc.exe
Это реально?

Лучше день потерять, потом за пять минут долететь!

17

Re: AHK: Открытие окна Gui,2: как слайдер от основного Gui. Возможно ли?

Тогда я тоже не совсем понял, что точно нужно, опишите подробнее.

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

18 (изменено: Dr.Jekyll, 2013-11-26 16:20:05)

Re: AHK: Открытие окна Gui,2: как слайдер от основного Gui. Возможно ли?

Сейчас попробую сформулировать ...

В общем так:

Запущенный скрипт ждет какой-то PID, например - запуск calc.exe (запуск сторонней программы может быть и не постедством скрипта)

При обнаружении  процесса calc.exe - слайдер открыватеся
По завершении процесса calc.exe - слайдер закрывается

Лучше день потерять, потом за пять минут долететь!

19

Re: AHK: Открытие окна Gui,2: как слайдер от основного Gui. Возможно ли?

PID — это заранее не известный идентификатор процесса (т. е. просто число, напр. 4875), ждать его невозможно. Ждать можно процесса с определённым названием. Проще всего это сделать, вызывая по таймеру (SetTimer) команду Process, Exist, calc.exe. Попробуйте реализовать самостоятельно.

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

20

Re: AHK: Открытие окна Gui,2: как слайдер от основного Gui. Возможно ли?

teadrinker
Здравствуйте. Пытаюсь адаптировать ваш код слайдера под свои нужды. Возник вопрос. Как сделать, что бы при переключении вкладки, слайдер из другой вкладки закрывался?

Gui, 4:+hwndhGui4
Gui, 4:Add, Tab2, x5 y5 h500 w397 cBlue, 1 вкладка|2 вкладка
Gui, 4:Tab, 1
Gui, 4:Add, Button, x125 y40 w70 gButton vButton, % Chr(0x2192)   ; значок стрелки вправо
Gui, 4:Tab, 2
Gui, 4:Add, Button, x125 y40 w70 gButton1 vButton1, % Chr(0x2192)   ; значок стрелки вправо
Gui, 4:Show, w200 h70

Gui, 5:+hwndhGui2 +Owner4 -Caption +Border
Gui, 5:Add, Text,, Здесь какая-то информация
VarSetCapacity(WI, 60)

OnMessage(0x3, "Follow")     ; WM_MOVE = 0x3, отслеживаем передвижение главного окна
OnMessage(0x112, "Follow")   ; WM_SYSCOMMAND = 0x112, отслеживаем минимизацию/восстановление главного окна
return

Button:   ; определяем положение главного окна и его клиентской области
   DllCall("GetWindowInfo", Ptr, hGui4, Ptr, &WI)
   if i := !i
      Gui, 5:Show, % "x" NumGet(WI, 12, "UInt") " y" NumGet(WI, 24, "UInt") 
                  . " h" NumGet(WI, 32, "UInt") - NumGet(WI, 24, "UInt") " hide"

   DllCall("AnimateWindow", Ptr, hGui2, UInt, 400, UInt, 0x40000|(i ? 1 : 0x10002))   ; выдвигаем/задвигаем окно-слайдер
   GuiControl,, Button, % Chr(0x2190|(i ? 0 : 2))   ; меняем стрелку на кнопке
   return
   
   
Follow(wp, lp, msg, hwnd)
{
   global hGui1, WI, i
   static k
   if (msg = 0x112)
   {
      if (wp = 0xF020 && k := 1)   ; SC_MINIMIZE = 0xF020
         Gui, 5:Show, Hide   ; скрываем окно-слайдер, если оно выдвинуто, при минимизации основного окна
      
      if (wp = 0xF120 && !(k := 0) && i)   ; SC_RESTORE = 0xF120
         Gui, 5:Show   ; показываем окно-слайдер, если оно было выдвинуто, при восстановлении основного окна
   }
   
   if (!i || hwnd != hGui4 || k = 1)
      return
; привязываем окно-слайдер к правой границе основного окна   
   DllCall("GetWindowInfo", Ptr, hGui1, Ptr, &WI)
   Gui, 5:Show, % "x" NumGet(WI, 12, "UInt") " y" NumGet(WI, 24, "UInt")
               . " h" NumGet(WI, 32, "UInt") - NumGet(WI, 24, "UInt") " NA"
}

Gui, 6:+hwndhGui2 +Owner4 -Caption +Border
Gui, 6:Add, Text,, Здесь какая-то информация 1
VarSetCapacity(WI, 60)

OnMessage(0x3, "Follow1")     ; WM_MOVE = 0x3, отслеживаем передвижение главного окна
OnMessage(0x112, "Follow1")   ; WM_SYSCOMMAND = 0x112, отслеживаем минимизацию/восстановление главного окна
return

Button1:   ; определяем положение главного окна и его клиентской области
   DllCall("GetWindowInfo", Ptr, hGui4, Ptr, &WI)
   if i := !i
      Gui, 6:Show, % "x" NumGet(WI, 12, "UInt") " y" NumGet(WI, 24, "UInt") 
                  . " h" NumGet(WI, 32, "UInt") - NumGet(WI, 24, "UInt") " hide"

   DllCall("AnimateWindow", Ptr, hGui2, UInt, 400, UInt, 0x40000|(i ? 1 : 0x10002))   ; выдвигаем/задвигаем окно-слайдер
   GuiControl,, Button1, % Chr(0x2190|(i ? 0 : 2))   ; меняем стрелку на кнопке
   return
   
   
Follow1(wp, lp, msg, hwnd)
{
   global hGui1, WI, i
   static k
   if (msg = 0x112)
   {
      if (wp = 0xF020 && k := 1)   ; SC_MINIMIZE = 0xF020
         Gui, 6:Show, Hide   ; скрываем окно-слайдер, если оно выдвинуто, при минимизации основного окна
      
      if (wp = 0xF120 && !(k := 0) && i)   ; SC_RESTORE = 0xF120
         Gui, 6:Show   ; показываем окно-слайдер, если оно было выдвинуто, при восстановлении основного окна
   }
   
   if (!i || hwnd != hGui4 || k = 1)
      return
; привязываем окно-слайдер к правой границе основного окна   
   DllCall("GetWindowInfo", Ptr, hGui1, Ptr, &WI)
   Gui, 6:Show, % "x" NumGet(WI, 12, "UInt") " y" NumGet(WI, 24, "UInt")
               . " h" NumGet(WI, 32, "UInt") - NumGet(WI, 24, "UInt") " NA"
}

21

Re: AHK: Открытие окна Gui,2: как слайдер от основного Gui. Возможно ли?

Я свой поменял:

Gui, +hwndhGui1
Gui, Add, Tab2, gButton vTab, 1 вкладка|2 вкладка
Loop 2  {
   Gui, Tab, % A_Index
   Gui, Add, Button, x125 y40 w70 gButton vButton%A_Index%, % Chr(0x2192)
}
Gui, Show, w200 h70

Gui, 2:+hwndhGui2 +owner1 -Caption +Border
Gui, 2:Add, Text,, Здесь какая-то информация
VarSetCapacity(WI, 60)

OnMessage(0x3, "WM_MOVE")
OnMessage(0x112, "WM_MOVE")   ; WM_SYSCOMMAND = 0x112
return

Button:
   DllCall("GetWindowInfo", Ptr, hGui1, Ptr, &WI)
   ((InStr(A_GuiControl, "Button") || (A_GuiControl = "Tab" && i)) && i := !i)
   
   Loop 2
      GuiControl,, Button%A_Index%, % Chr(0x2190|(i ? 0 : 2))
   
   if i
      Gui, 2:Show, % "x" NumGet(WI, 12, "UInt") " y" NumGet(WI, 24, "UInt") 
                  . " h" NumGet(WI, 32, "UInt") - NumGet(WI, 24, "UInt") " hide"
   DllCall("AnimateWindow", Ptr, hGui2, UInt, 400, UInt, 0x40000|(i ? 1 : 0x10002))
   return
   
GuiClose:
   ExitApp
   
WM_MOVE(wp, lp, msg, hwnd)
{
   global hGui1, WI, i
   static k
   if (msg = 0x112)
   {
      if (wp = 0xF020 && k := 1)   ; SC_MINIMIZE = 0xF020
         Gui, 2:Show, Hide
      
      if (wp = 0xF120 && !(k := 0) && i)   ; SC_RESTORE = 0xF120
         Gui, 2:Show
   }
   
   if (!i || hwnd != hGui1 || k = 1)
      return
   
   DllCall("GetWindowInfo", Ptr, hGui1, Ptr, &WI)
   Gui, 2:Show, % "x" NumGet(WI, 12, "UInt") " y" NumGet(WI, 24, "UInt") 
               . " h" NumGet(WI, 32, "UInt") - NumGet(WI, 24, "UInt") " NA"
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

22

Re: AHK: Открытие окна Gui,2: как слайдер от основного Gui. Возможно ли?

teadrinker
А как для каждой вкладки отдельную информацию сделать? Создавать для всех вкладок новое GUI?

23

Re: AHK: Открытие окна Gui,2: как слайдер от основного Gui. Возможно ли?

Не обязательно, можно просто менять информацию в слайдере при переключении вкладок.

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

24

Re: AHK: Открытие окна Gui,2: как слайдер от основного Gui. Возможно ли?

Не могли бы вы примером показать, я не понимаю как это реализовать в вашем коде.

25

Re: AHK: Открытие окна Gui,2: как слайдер от основного Gui. Возможно ли?

Info1 := "Информация для первой вкладки"
Info2 := "Информация для второй вкладки"

Gui, +hwndhGui1
Gui, Add, Tab2, gButton vTab, 1 вкладка|2 вкладка
Loop 2  {
   Gui, Tab, % A_Index
   Gui, Add, Button, x125 y40 w70 gButton vButton%A_Index%, % Chr(0x2192)
}
Gui, Show, w200 h70

Gui, 2:+hwndhGui2 +owner1 -Caption +Border
Gui, 2:Add, Text, vInfo, % Info1
VarSetCapacity(WI, 60)

OnMessage(0x3, "WM_MOVE")
OnMessage(0x112, "WM_MOVE")   ; WM_SYSCOMMAND = 0x112
return

Button:
   DllCall("GetWindowInfo", Ptr, hGui1, Ptr, &WI)
   ((InStr(A_GuiControl, "Button") || (A_GuiControl = "Tab" && i)) && i := !i)
   
   Loop 2
      GuiControl,, Button%A_Index%, % Chr(0x2190|(i ? 0 : 2))
   
   if i
      Gui, 2:Show, % "x" NumGet(WI, 12, "UInt") " y" NumGet(WI, 24, "UInt") 
                  . " h" NumGet(WI, 32, "UInt") - NumGet(WI, 24, "UInt") " hide"
   DllCall("AnimateWindow", Ptr, hGui2, UInt, 400, UInt, 0x40000|(i ? 1 : 0x10002))
   
   if (A_GuiControl = "Tab")  ; если меняется вкладка, меняем информацию в окне
      GuiControl, 2:, Info, % Tab = "2 вкладка" ? Info1 : Info2
   return
   
GuiClose:
   ExitApp
   
WM_MOVE(wp, lp, msg, hwnd)
{
   global hGui1, WI, i
   static k
   if (msg = 0x112)
   {
      if (wp = 0xF020 && k := 1)   ; SC_MINIMIZE = 0xF020
         Gui, 2:Show, Hide
      
      if (wp = 0xF120 && !(k := 0) && i)   ; SC_RESTORE = 0xF120
         Gui, 2:Show
   }
   
   if (!i || hwnd != hGui1 || k = 1)
      return
   
   DllCall("GetWindowInfo", Ptr, hGui1, Ptr, &WI)
   Gui, 2:Show, % "x" NumGet(WI, 12, "UInt") " y" NumGet(WI, 24, "UInt") 
               . " h" NumGet(WI, 32, "UInt") - NumGet(WI, 24, "UInt") " NA"
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

26

Re: AHK: Открытие окна Gui,2: как слайдер от основного Gui. Возможно ли?

Спасибо, но я не понял как адаптировать эту строчку для более 2х вкладок:

GuiControl, 2:, Info, % Tab = "2 вкладка" ? Info1 : Info2

Пытался по разному, вот так получилось, но работает как-то криво, информация во вкладках отображается в разнобой.

Info1 := "Информация для 1 вкладки"
Info2 := "Информация для 2 вкладки"
Info3 := "Информация для 3 вкладки"
Info4 := "Информация для 4 вкладки"

Gui, +hwndhGui1
Gui, Add, Tab2, gButton vTab, 1 вкладка|2 вкладка|3 вкладка|4 вкладка
Loop 4  {
   Gui, Tab, % A_Index
   Gui, Add, Button, x125 y40 w70 gButton vButton%A_Index%, % Chr(0x2192)
}
Gui, Show, h70

Gui, 2:+hwndhGui2 +owner1 -Caption +Border
Gui, 2:Add, Text, vInfo w200, % Info
VarSetCapacity(WI, 60)

OnMessage(0x3, "WM_MOVE")
OnMessage(0x112, "WM_MOVE")   ; WM_SYSCOMMAND = 0x112
return

Button:
   DllCall("GetWindowInfo", Ptr, hGui1, Ptr, &WI)
   ((InStr(A_GuiControl, "Button") || (A_GuiControl = "Tab" && i)) && i := !i)
   
   Loop 4
      GuiControl,, Button%A_Index%, % Chr(0x2190|(i ? 0 : 2))
   
   if i
      Gui, 2:Show, % "x" NumGet(WI, 12, "UInt") " y" NumGet(WI, 24, "UInt") 
                  . " h" NumGet(WI, 32, "UInt") - NumGet(WI, 24, "UInt") " hide"
   DllCall("AnimateWindow", Ptr, hGui2, UInt, 400, UInt, 0x40000|(i ? 1 : 0x10002))
   
   if (A_GuiControl = "Tab")  ; если меняется вкладка, меняем информацию в окне
   if tab = 1 вкладка
      GuiControl, 2:, Info, % Info1
   if tab = 2 вкладка
      GuiControl, 2:, Info, % Info2
   if tab = 3 вкладка
      GuiControl, 2:, Info, % Info3
   if tab = 4 вкладка
      GuiControl, 2:, Info, % Info4
	msgbox % tab
   
WM_MOVE(wp, lp, msg, hwnd)
{
   global hGui1, WI, i
   static k
   if (msg = 0x112)
   {
      if (wp = 0xF020 && k := 1)   ; SC_MINIMIZE = 0xF020
         Gui, 2:Show, Hide
      
      if (wp = 0xF120 && !(k := 0) && i)   ; SC_RESTORE = 0xF120
         Gui, 2:Show
   }
   
   if (!i || hwnd != hGui1 || k = 1)
      return
   
   DllCall("GetWindowInfo", Ptr, hGui1, Ptr, &WI)
   Gui, 2:Show, % "x" NumGet(WI, 12, "UInt") " y" NumGet(WI, 24, "UInt") 
               . " h" NumGet(WI, 32, "UInt") - NumGet(WI, 24, "UInt") " NA"
}

27

Re: AHK: Открытие окна Gui,2: как слайдер от основного Gui. Возможно ли?

Tabs := [ "1 вкладка"
        , "2 вкладка"
        , "3 вкладка"
        , "4 вкладка" ]

Texts := [ "Информация для первой вкладки"
         , "Информация для второй вкладки"
         , "Информация для третьей вкладки"
         , "Информация для четвёртой вкладки" ]

Gui, +hwndhGui1
Gui, Add, Tab2, gButton vTab, % Tabs[1] "|" Tabs[2] "|" Tabs[3] "|" Tabs[4]
Loop 4  {
   Gui, Tab, % A_Index
   Gui, Add, Button, x175 y40 w70 gButton vButton%A_Index%, % Chr(0x2192)
}
Gui, Show, h70

Gui, 2:+hwndhGui2 +owner1 -Caption +Border
Gui, 2:Add, Text, vInfo Center, % "    " Texts[1] "    "
VarSetCapacity(WI, 60)

OnMessage(0x3, "WM_MOVE")
OnMessage(0x112, "WM_MOVE")   ; WM_SYSCOMMAND = 0x112
return

Button:
   DllCall("GetWindowInfo", Ptr, hGui1, Ptr, &WI)
   ((InStr(A_GuiControl, "Button") || (A_GuiControl = "Tab" && i)) && i := !i)
   
   Loop 4
      GuiControl,, Button%A_Index%, % Chr(0x2190|(i ? 0 : 2))
   
   if i
      Gui, 2:Show, % "x" NumGet(WI, 12, "UInt") " y" NumGet(WI, 24, "UInt") 
                  . " h" NumGet(WI, 32, "UInt") - NumGet(WI, 24, "UInt") " hide"
   DllCall("AnimateWindow", Ptr, hGui2, UInt, 400, UInt, 0x40000|(i ? 1 : 0x10002))
   
   if (A_GuiControl = "Tab")  {  ; если меняется вкладка, меняем информацию в окне
      GuiControlGet, Tab
      for k, v in Tabs
         if (Tab = v)
            break
      GuiControl, 2:, Info, % Texts[k]
   }
   return
   
GuiClose:
   ExitApp
   
WM_MOVE(wp, lp, msg, hwnd)
{
   global hGui1, WI, i
   static k
   if (msg = 0x112)
   {
      if (wp = 0xF020 && k := 1)   ; SC_MINIMIZE = 0xF020
         Gui, 2:Show, Hide
      
      if (wp = 0xF120 && !(k := 0) && i)   ; SC_RESTORE = 0xF120
         Gui, 2:Show
   }
   
   if (!i || hwnd != hGui1 || k = 1)
      return
   
   DllCall("GetWindowInfo", Ptr, hGui1, Ptr, &WI)
   Gui, 2:Show, % "x" NumGet(WI, 12, "UInt") " y" NumGet(WI, 24, "UInt") 
               . " h" NumGet(WI, 32, "UInt") - NumGet(WI, 24, "UInt") " NA"
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

28

Re: AHK: Открытие окна Gui,2: как слайдер от основного Gui. Возможно ли?

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

F1::
a1 := !a1
	if !a1
	{
		if (A_Index != 1)
		Gui, Destroy
		;Важно. Такой метод активации окна для меня важен, т.к. тут расположены несколько меток перехода.
		return
	}
Tabs := [ "1 вкладка"
        , "2 вкладка"
        , "3 вкладка"
        , "4 вкладка" ]

Texts := [ "Информация для первой вкладки"
         , "Информация для второй вкладки"
         , "Информация для третьей вкладки"
         , "Информация для четвёртой вкладки" ]

Gui, +hwndhGui1
Gui, Add, Tab2, gButton vTab, % Tabs[1] "|" Tabs[2] "|" Tabs[3] "|" Tabs[4]
Loop 4  {
   Gui, Tab, % A_Index
   Gui, Add, Button, x175 y40 w70 gButton vButton%A_Index%, % Chr(0x2192)
}
Gui, Show, h70

Gui, 2:+hwndhGui2 +owner1 -Caption +Border
Gui, 2:Add, Text, vInfo Center, % "    " Texts[1] "    "
VarSetCapacity(WI, 60)

OnMessage(0x3, "WM_MOVE")
OnMessage(0x112, "WM_MOVE")   ; WM_SYSCOMMAND = 0x112
return

Button:
   DllCall("GetWindowInfo", Ptr, hGui1, Ptr, &WI)
   ((InStr(A_GuiControl, "Button") || (A_GuiControl = "Tab" && i)) && i := !i)
   
   Loop 4
      GuiControl,, Button%A_Index%, % Chr(0x2190|(i ? 0 : 2))
   
   if i
      Gui, 2:Show, % "x" NumGet(WI, 12, "UInt") " y" NumGet(WI, 24, "UInt") 
                  . " h" NumGet(WI, 32, "UInt") - NumGet(WI, 24, "UInt") " hide"
   DllCall("AnimateWindow", Ptr, hGui2, UInt, 400, UInt, 0x40000|(i ? 1 : 0x10002))
   
   if (A_GuiControl = "Tab")  {  ; если меняется вкладка, меняем информацию в окне
      GuiControlGet, Tab
      for k, v in Tabs
         if (Tab = v)
            break
      GuiControl, 2:, Info, % Texts[k]
   }
   return

WM_MOVE(wp, lp, msg, hwnd)
{
   global hGui1, WI, i
   static k
   if (msg = 0x112)
   {
      if (wp = 0xF020 && k := 1)   ; SC_MINIMIZE = 0xF020
         Gui, 2:Show, Hide
      
      if (wp = 0xF120 && !(k := 0) && i)   ; SC_RESTORE = 0xF120
         Gui, 2:Show
   }
   
   if (!i || hwnd != hGui1 || k = 1)
      return

   DllCall("GetWindowInfo", Ptr, hGui1, Ptr, &WI)
   Gui, 2:Show, % "x" NumGet(WI, 12, "UInt") " y" NumGet(WI, 24, "UInt") 
               . " h" NumGet(WI, 32, "UInt") - NumGet(WI, 24, "UInt") " NA"
}
return

29

Re: AHK: Открытие окна Gui,2: как слайдер от основного Gui. Возможно ли?

Sgy-x2 пишет:

Важно. Такой метод активации окна для меня важен

Не понял, что за метод.

if (A_Index != 1)

A_Index только в цикле может быть, что он там делает?

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

30

Re: AHK: Открытие окна Gui,2: как слайдер от основного Gui. Возможно ли?

teadrinker пишет:

Не понял, что за метод.

Просто я знаю, что вы (в смысле разработчики) способны придумать на столько сложные способы активации окон, что мне потребуется очень много времени на то, что бы понять как это работает.

F1::
a1 := !a1
	if !a1
	{
		Gui, Destroy
		return
	}

Gui, Add, text,, text
Gui, Show, h70
return
teadrinker пишет:

A_Index

Это там не нужно, забыл удалить.

31

Re: AHK: Открытие окна Gui,2: как слайдер от основного Gui. Возможно ли?

А если слайдер открыт, при закрытии/открытии основного окна он должен оставаться открытым, или нет?

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

32

Re: AHK: Открытие окна Gui,2: как слайдер от основного Gui. Возможно ли?

Нет.

33

Re: AHK: Открытие окна Gui,2: как слайдер от основного Gui. Возможно ли?

Тогда так:

Tabs := [ "1 вкладка"
        , "2 вкладка"
        , "3 вкладка"
        , "4 вкладка" ]

Texts := [ "Информация для первой вкладки"
         , "Информация для второй вкладки"
         , "Информация для третьей вкладки"
         , "Информация для четвёртой вкладки" ]

Gui, +hwndhGui1
Gui, Add, Tab2, gButton vTab, % Tabs[1] "|" Tabs[2] "|" Tabs[3] "|" Tabs[4]
Loop 4  {
   Gui, Tab, % A_Index
   Gui, Add, Button, x175 y40 w70 gButton vButton%A_Index%, % Chr(0x2192)
}

Gui, 2:+hwndhGui2 +owner1 -Caption +Border
Gui, 2:Add, Text, vInfo Center, % "    " Texts[1] "    "
VarSetCapacity(WI, 60)

OnMessage(0x3, "WM_MOVE")
OnMessage(0x112, "WM_MOVE")   ; WM_SYSCOMMAND = 0x112
return

$F1::
   Gui, 1: Show, % (a := !a) ? "h70" : "Hide"
   if !i
      Return
   i := false

Button:
   DllCall("GetWindowInfo", Ptr, hGui1, Ptr, &WI)
   ((InStr(A_GuiControl, "Button") || (A_GuiControl = "Tab" && i)) && i := !i)
   Loop 4
      GuiControl,, Button%A_Index%, % Chr(0x2190|(i ? 0 : 2))
   
   if i
      Gui, 2:Show, % "x" NumGet(WI, 12, "UInt") " y" NumGet(WI, 24, "UInt") 
                  . " h" NumGet(WI, 32, "UInt") - NumGet(WI, 24, "UInt") " hide"
   DllCall("AnimateWindow", Ptr, hGui2, UInt, 400, UInt, 0x40000|(i ? 1 : 0x10002))
   
   if (A_GuiControl = "Tab")  {  ; если меняется вкладка, меняем информацию в окне
      GuiControlGet, Tab
      for k, v in Tabs
         if (Tab = v)
            break
      GuiControl, 2:, Info, % Texts[k]
   }
   return
   
GuiClose:
   ExitApp
   
WM_MOVE(wp, lp, msg, hwnd)
{
   global hGui1, WI, i
   static k
   if (msg = 0x112)
   {
      if (wp = 0xF020 && k := 1)   ; SC_MINIMIZE = 0xF020
         Gui, 2:Show, Hide
      
      if (wp = 0xF120 && !(k := 0) && i)   ; SC_RESTORE = 0xF120
         Gui, 2:Show
   }
   
   if (!i || hwnd != hGui1 || k = 1)
      return
   
   DllCall("GetWindowInfo", Ptr, hGui1, Ptr, &WI)
   Gui, 2:Show, % "x" NumGet(WI, 12, "UInt") " y" NumGet(WI, 24, "UInt") 
               . " h" NumGet(WI, 32, "UInt") - NumGet(WI, 24, "UInt") " NA"
}

По F1 показывается/скрывается.

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

34 (изменено: Vicoriyan, 2018-04-25 12:50:44)

Re: AHK: Открытие окна Gui,2: как слайдер от основного Gui. Возможно ли?

Как сделать, чтоб в одном окне было 2 и больше кнопок со своим содержанием информации? Пробовал ковырять пример с вкладками, но так ничего и не вышло.

35

Re: AHK: Открытие окна Gui,2: как слайдер от основного Gui. Возможно ли?

Ребят, подскажите, как сделать чтобы это окно с левой стороны выдвигалось\задвигалось? Что я только не пробовал, куда только X не ставил и отрицательные значения даже. Не могу найти справки по этому поводу.

Gui, +hwndhGui1
Gui, Add, Button, x125 y40 w70 gButton vButton, % Chr(0x2192)
Gui, Show, w200 h70

Gui, 2:+hwndhGui2 +owner1 -Caption +Border
Gui, 2:Add, Text,, Здесь какая-то информация
VarSetCapacity(WI, 60)

OnMessage(0x3, "WM_MOVE")
OnMessage(0x112, "WM_MOVE")   ; WM_SYSCOMMAND = 0x112
return

Button:
  DllCall("GetWindowInfo", Ptr, hGui1, Ptr, &WI)
   if i := !i
      Gui, 2:Show, % "x" NumGet(WI, 12, "UInt") " y" NumGet(WI, 24, "UInt") 
                  . " h" NumGet(WI, 32, "UInt") - NumGet(WI, 24, "UInt") " hide"
   DllCall("AnimateWindow", Ptr, hGui2, UInt, 400, UInt, 0x40000|(i ? 1 : 0x10002))
   GuiControl,, Button, % Chr(0x2190|(i ? 0 : 2))
   return
   
GuiClose:
   ExitApp
   
WM_MOVE(wp, lp, msg, hwnd)
{
   global hGui1, WI, i
   static k
   if (msg = 0x112)
   {
      if (wp = 0xF020 && k := 1)   ; SC_MINIMIZE = 0xF020
         Gui, 2:Show, Hide
      
      if (wp = 0xF120 && !(k := 0) && i)   ; SC_RESTORE = 0xF120
         Gui, 2:Show
   }
   
   if (!i || hwnd != hGui1 || k = 1)
      return
   
   DllCall("GetWindowInfo", Ptr, hGui1, Ptr, &WI)
   Gui, 2:Show, % "x" NumGet(WI, 12, "UInt") " y" NumGet(WI, 24, "UInt") 
               . " h" NumGet(WI, 32, "UInt") - NumGet(WI, 24, "UInt") " NA"
}

36 (изменено: teadrinker, 2018-08-30 00:13:33)

Re: AHK: Открытие окна Gui,2: как слайдер от основного Gui. Возможно ли?

Gui, +hwndhGui1
Gui, Add, Button, x10 y40 w70 gButton vButton, % Chr(0x2190)
Gui, Show, w200 h70

Gui, 2:+hwndhGui2 +owner1 -Caption +Border
Gui, 2:Add, Text,, Здесь какая-то информация
Gui, 2:Show, Hide
VarSetCapacity(WI, 60)
DllCall("GetWindowInfo", Ptr, hGui2, Ptr, &WI)
gui2width := NumGet(WI, 12, "UInt") - NumGet(WI, 4, "UInt")

OnMessage(0x3, "WM_MOVE")
OnMessage(0x112, "WM_MOVE")   ; WM_SYSCOMMAND = 0x112
return

Button:
   if i := !i  {
      DllCall("GetWindowInfo", Ptr, hGui1, Ptr, &WI)
      Gui, 2:Show, % "x" NumGet(WI, 4, "UInt") - gui2width " y" NumGet(WI, 24, "UInt") 
                  . " h" NumGet(WI, 32, "UInt") - NumGet(WI, 24, "UInt") " hide"
   }
   DllCall("AnimateWindow", Ptr, hGui2, UInt, 400, UInt, 0x40000|(i ? 2 : 0x10001))
   GuiControl,, Button, % Chr(0x2190|(i ? 2 : 0))
   return
   
GuiClose:
   ExitApp
   
WM_MOVE(wp, lp, msg, hwnd)
{
   global hGui1, WI, i, gui2width
   static k
   if (msg = 0x112)
   {
      if (wp = 0xF020 && k := 1)   ; SC_MINIMIZE = 0xF020
         Gui, 2:Show, Hide
      
      if (wp = 0xF120 && !(k := 0) && i)   ; SC_RESTORE = 0xF120
         Gui, 2:Show
   }
   
   if (!i || hwnd != hGui1 || k = 1)
      return
   
   DllCall("GetWindowInfo", Ptr, hGui1, Ptr, &WI)
   Gui, 2:Show, % "x" NumGet(WI, 4, "UInt") - gui2width " y" NumGet(WI, 24, "UInt") 
               . " h" NumGet(WI, 32, "UInt") - NumGet(WI, 24, "UInt") " NA"
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg