1

Тема: AHK: Размещение метки "GuiClose" в теле функции.

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


nmbrArr := ["число1","число2","число3","число4","число5","чииислооо6"]
abcArr := ["one", "two", "three", "four", "fivewwwww"]

CreateButton_list(nmbrArr, 1)
CreateButton_list(abcArr, 2)
CreateButton_list(nmbrArr, 3)

!1::Gui, 1: Show,, Числа 1
!2::Gui, 2: Show,, Слова 1
!3::Gui, 3: Show,, Числа 2

!q::MsgBox,, Title, % "Имя -> " clickReturn "`nВ GUI № -> " guiReturn "`nКнопка номер -> " GetBttnNmbr(clickReturn, guiReturn)

CheckNmbrGUI(nmbr_GUI) {
	Static checkGUI
	if (checkGUI == "")
		checkGUI := [-1]
	while (A_Index <= checkGUI.Length()) {
		if (checkGUI[A_Index] == nmbr_GUI)
			return false
	}
	checkGUI.Push(nmbr_GUI)
	return true
}

CreateButton_list(workArr, nmbr_GUI) {
	if (CheckNmbrGUI(nmbr_GUI)) {
		
		Global allBttnNames
		if (allBttnNames == "")
			allBttnNames := {}
		ObjRawSet(allBttnNames, nmbr_GUI, workArr)
			
		arrSize := workArr.Length()
		xBttn := 10
		yBttn := 10
		hBttn := 20
		
		bttnLen := 0
		while (A_Index <= arrSize) {
			if (StrLen(workArr[A_Index]) > bttnLen)
				bttnLen := StrLen(workArr[A_Index])
		}
		wBttn := bttnLen * 9
		Gui, %nmbr_GUI%: +AlwaysOnTop +Toolwindow
		colBttn := 1
		while (A_Index <= arrSize) {
			if (colBttn == 20)
				colBttn := 1, xBttn := wBttn + 20, yBttn := 10
			Gui, %nmbr_GUI%: Add, Button, x%xBttn% y%yBttn% w%wBttn% h%hBttn%, % A_Index " " workArr[A_Index]
			yBttn += 22
			colBttn++
		}
		OnMessage(0x202, "bttnClick")
		Return
		GuiClose:
			Gui, %A_Gui%: Show, Hide
			MsgBox,, Title, % "GUI № " A_Gui
		return
	} else {
		MsgBox,, Title, % "GUI номер '" nmbr_GUI "' зарезервирован`nОсуществите вызов с другим параметром!`nПосле закрытия этого окна, приложение завершит работу."
		ExitApp
	}
}

bttnClick() {  
    Global clickReturn, guiReturn
	Static newCntrl
	if (newCntrl != A_GuiControl) {
		newCntrl := A_GuiControl
		ctrlNameArr := StrSplit(A_GuiControl, A_Space)
		clickReturn := ctrlNameArr[2]
		guiReturn := A_Gui
		Gui, %guiReturn%: Show, Hide
	} 
}

GetBttnNmbr(bttnName, GUInmbr) {
	Global allBttnNames
	arrSize := allBttnNames[GUInmbr].Length()
	while (A_Index <= arrSize) {
		if (allBttnNames[GUInmbr][A_Index] == bttnName)
			return A_Index
	}
}

Результат кликов по кнопкам в сгенерированных GUI хранится в глобальных переменных, отследить который можно при изменении их содержимого, но если окно было закрыто крестиком, результат остаётся без изменений. Метка "GuiClose" работает только для первого созданного GUI. Есть ли альтернатива? Пробовал OnMessage(0x10, "bttnClose"), но реакции на закрытие крестиком нет. Подскажите пожалуйста.

2

Re: AHK: Размещение метки "GuiClose" в теле функции.

!1::Gui, 1: Show, w100 h100
!2::Gui, 2: Show, w200 h200
!3::Gui, 3: Show, w300 h300
return
GuiClose:
2GuiClose:
3GuiClose:
Gui, %A_Gui%: Show, Hide
MsgBox, % "GUI № " A_Gui
return

3

Re: AHK: Размещение метки "GuiClose" в теле функции.

А как-то универсальней можно сделать запись? Например, если вдруг окажется, что сгенерированных таким способом окон с кнопками будет 20, или даже 30.

4 (изменено: serzh82saratov, 2016-08-16 00:08:38)

Re: AHK: Размещение метки "GuiClose" в теле функции.


Loop 12
{
	Gui, %A_Index%: +LabelMyGui -DPIScale +AlwaysOnTop
	Gui, %A_Index%: Add, Button, w80 gButton, % A_Index 
	Gui, %A_Index%: Show, % "x" 133 * (A_Index - 1), Gui %A_Index%
}
Return

MyGuiClose:
	Gui, %A_Gui%: Show, Hide
	MsgBox, , , % A_Gui, 0.3
	Return
	
Button:
	MsgBox % A_Gui
	Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

5

Re: AHK: Размещение метки "GuiClose" в теле функции.

Да, каждое созданное окно GUI придётся перенаправлять на другую метку потока.

Gui 1:+LabelMy_Gui_Label
Gui 2:+LabelMy_Gui_Label
Gui 3:+LabelMy_Gui_Label

!1::Gui, 1:	Show, w100 h100
!2::Gui, 2:	Show, w200 h200
!3::Gui, 3:	Show, w300 h300

My_Gui_LabelClose:
Gui +HwndMy_Gui_Hwnd
Gui, %A_Gui%: Show, Hide
MsgBox,  GUI № %A_Gui% `r`n %My_Gui_Hwnd%
Return

6

Re: AHK: Размещение метки "GuiClose" в теле функции.

Мой низкий поклон, господа!