1

Тема: AHK: Выполнение действий в gui,2 в зависимости от control`ов gui,1.

Здравствуйте, на вашем форуме нашел очень хороший шаблон для GUI. В зависимости  от того, какая вкладка сейчас активна, меняется название кнопки в gui 2. Но как сделать, чтобы для каждой вкладки кнопка в gui 2 выполняла свое действие?

global hGui1, moved

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

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

Gui, +hwndhGui1 -Caption +ToolWindow
Gui, Color, 33CC33F
Gui, Add, Tab2, gButton vTab, % Tabs[1] "|" Tabs[2] "|" Tabs[3] "|" Tabs[4]
Gui, Add, CheckBox
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, Button, vInfo gButtonTab Center, % "    " Texts[1] "    "
VarSetCapacity(WI, 60)

OnMessage(0x3, "WM_MOVE")
OnMessage(0x112, "WM_MOVE")   ; WM_SYSCOMMAND = 0x112
Gui, show, w300 h300 Hide
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]
   }
   ;msgbox %A_GuiControl%
   return

ButtonTab:
msgbox test
return

WinMove()
{
    CoordMode, Mouse
    SetWinDelay, -1
    SetBatchLines, -1
    MouseGetPos, Start_X, Start_Y
    WinGetPos, X_Win, Y_Win,,, ahk_id %hGui1%
    While GetKeyState("RButton", "P")
    {
        MouseGetPos, Current_X, Current_Y
        moved := (Current_X != Start_X || Current_Y != Start_Y) ? 1 : ""
        WinMove, ahk_id %hGui1%,, X_Win + Current_X - Start_X, Y_Win + Current_Y - Start_Y
        ;Sleep, 10
    }
}

~RButton::
    MouseGetPos,,, WinID
    if (WinID = hGui1)
        WinMove()
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"
}

2

Re: AHK: Выполнение действий в gui,2 в зависимости от control`ов gui,1.

Есть куча вариантов, но у вас самого ответ уже есть:

Gui, Add, Button, x175 y40 w70 gButton vButton%A_Index%

почему бы не сделать так:

Gui, Add, Button, x175 y40 w70 gButton%A_Index% vButton%A_Index%

и в метках Button1, Button2... выполнять что надо.

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

3 (изменено: powercat, 2017-07-19 22:56:59)

Re: AHK: Выполнение действий в gui,2 в зависимости от control`ов gui,1.

serzh82saratov
Кнопка в Gui выдвигает слайдером Gui, 2  вот в этом Gui,2 мне и нужно чтобы кнопка(из Gui,2) выполняла определенные действия в зависимости от того какая вкладка в первом Gui.

Gui, 2:Add, Button, vInfo gButtonTab Center, % "    " Texts[1] "    "

4

Re: AHK: Выполнение действий в gui,2 в зависимости от control`ов gui,1.

Up

5

Re: AHK: Выполнение действий в gui,2 в зависимости от control`ов gui,1.

Номер вкладки в данном примере пишется в переменную, используйте if/else в обработчике.
А вот поднимать тему запрещено правилами.

6 (изменено: powercat, 2017-07-23 19:06:52)

Re: AHK: Выполнение действий в gui,2 в зависимости от control`ов gui,1.

Извините, не знал. Кажется разобрался, надо было сменить вкладку чтобы значение записывалось в переменную.. А я этого не делал и переменная оставалась пустая, поэтому не получалось. Вот что вышло:

global hGui1, moved

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

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

Gui, +hwndhGui1 -Caption +ToolWindow
Gui, Color, 33CC33F
Gui, Add, Tab2, gButton vTab, % Tabs[1] "|" Tabs[2] "|" Tabs[3] "|" Tabs[4]
Gui, Add, CheckBox
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, Button, vInfo gButtonTab Center, % "    " Texts[1] "    "
VarSetCapacity(WI, 60)

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

$F1::
   Gui, 1: Show, % (a := !a) ? "h95 w300" : "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

ButtonTab:
{
if (v = 1v)
    {
	msgbox 1
	return
    }
	    {   if (v = 2v)
	        {
		    msgbox 2
		    return
		    }   
			    {   if (v = 3v)
				    {
					msgbox 3
					return
					}
					    {   if (v = 4v)
						    {
							msgbox 4
							return
							}		     
                        }
                }
        }
}
return

WinMove()
{
    CoordMode, Mouse
    SetWinDelay, -1
    SetBatchLines, -1
    MouseGetPos, Start_X, Start_Y
    WinGetPos, X_Win, Y_Win,,, ahk_id %hGui1%
    While GetKeyState("RButton", "P")
    {
        MouseGetPos, Current_X, Current_Y
        moved := (Current_X != Start_X || Current_Y != Start_Y) ? 1 : ""
        WinMove, ahk_id %hGui1%,, X_Win + Current_X - Start_X, Y_Win + Current_Y - Start_Y
        ;Sleep, 10
    }
}

~RButton::
    MouseGetPos,,, WinID
    if (WinID = hGui1)
        WinMove()
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"
}

7

Re: AHK: Выполнение действий в gui,2 в зависимости от control`ов gui,1.

stealzy пишет:

А вот поднимать тему запрещено правилами.

Пруфлинк?

8 (изменено: stealzy, 2017-07-24 00:37:18)

Re: AHK: Выполнение действий в gui,2 в зависимости от control`ов gui,1.

Четко прописан запрет поднятия старых тем. Но

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

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

9

Re: AHK: Выполнение действий в gui,2 в зависимости от control`ов gui,1.

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

Когда идёт речь о визуальном поднятии заголовка темы в списке форума - такого запрета действительно нет. Но нельзя писать бессмысленные сообщения.