Что нового

[Окна, Диалоги] Как скрыть основное окно и открыть новое горячей клавишей?

ivsatel

Продвинутый
Сообщения
319
Репутация
84
Здравствуйте.
Использую AutoIt: v.3.3.8.1
Есть скрипт. Использующий GUI интерфейс. Не могу понять, как закрыть основное окно и открыть новое и что-бы этот новый GUI интерфейс работал так-же как и основное окно но со своими параметрами. И все это в одном скрипте без всякого рода вложений. Хочу реализовать закрытие основного окна по горячей клавише и так же восстановление основного окна из не основного.
Вот это как-бы каркас:
Код:
#include <GUIConstants.au3>
#include <WinAPIEx.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>

Opt("TrayAutoPause", 0)
Opt("TrayMenuMode", 1)

;Задание глобальных для чекбокса
Global $aCheckbox[2] = [1, '1']

$hGui = GUICreate("DAU", 175, 270, -1, -1, $WS_SYSMENU, BitOR($WS_EX_TOPMOST, $WS_EX_DLGMODALFRAME, $WS_EX_WINDOWEDGE, $SS_WHITEFRAME))
$nButton1 = GUICtrlCreateButton("Загрузить", 35, 210, 90)

;Горячая клавиша выхода
HotKeySet('{ESC}', '_Pro_Exit')

;Отрисовка лэйбла
GUICtrlCreateLabel("Версии утилит", 8, 10, -1, -1, $SS_SUNKEN, BitOR($SS_CENTER, $SS_ETCHEDFRAME, $SS_WHITEFRAME))

;Проверка соединения + Отрисовка чекбоксов
For $i = 1 To $aCheckbox[0]
   GUISetState(@SW_HIDE)
   $aCheckbox[$i] = GUICtrlCreateCheckbox($aCheckbox[$i], 8, 40 + ($i - 1) * 20)
Next

;Отображение главного окна программы
GUISetState(@SW_SHOW)

;Цикл выполнения основных функций
While 1
Switch GUIGetMsg()
	Case $GUI_EVENT_CLOSE
Exit
	Case $nButton1
	$iCount = 0
	For $i = 1 To $aCheckbox[0]
	If BitAND(GUICtrlRead($aCheckbox[$i]), $GUI_CHECKED) Then
		$iCount += 1
		Execute('_' & $i & '()')
		ConsoleWrite(@error & @LF)
	EndIf
	Next
	If Not $iCount Then
		MsgBox(16, 'Error', 'Ничего не выбрано!!!', 0, $hGui)
	EndIf
	Exit
EndSwitch
WEnd

;Функция выхода по горячей клавише
Func _Pro_Exit()
    Exit
EndFunc
 
Автор
I

ivsatel

Продвинутый
Сообщения
319
Репутация
84
Получилось :laugh:
Код:
#include <GUIConstantsEx.au3>

;Обязательно задавать элементам -1, чтобы небыло ложного срабатывания событий в случае если (ещё) не создан элемент присваеваемый данной переменной
Global $nChildGUI_Close_Bttn = -1

$hMain_GUI = GUICreate("Main GUI", 250, 250)
$nChild_Button = GUICtrlCreateButton("Child", 20, 220, 60, 20)

GUISetState(@SW_SHOW, $hMain_GUI)

$HK = HotKeySet('z', '_Hid')

;Создаём дочерний GUI, не отображая его на экране
$hChild_GUI = _ChildGUI_Create($hMain_GUI)

While 1
    ;Обработка событий в расширенном режиме
    $aMsg = GUIGetMsg(1)

    Switch $aMsg[0]
        Case $GUI_EVENT_CLOSE
            ;Проверяем если "событие закрытия" поступило с главного-родительского GUI
            If $aMsg[1] = $hMain_GUI Then Exit

            ;Если "событие закрытия" поступило с дочернего GUI, то просто прячем его
            If $aMsg[1] = $hChild_GUI Then
            GUISetState(@SW_HIDE, $hChild_GUI)
	    GUISetState(@SW_SHOW, $hMain_GUI)
            EndIf
        Case $nChild_Button
            ;Показываем дочерний GUI при нажатий на кнопку "Child"
            GUISetState(@SW_SHOW, $hChild_GUI)
            If Not WinActive($hChild_GUI) Then WinActivate($hChild_GUI)
        Case $nChildGUI_Close_Bttn
            MsgBox(64, 'Message', 'Child GUI "Close" button pressed, closing the child...', 10)
            GUISetState(@SW_HIDE, $hChild_GUI)
    EndSwitch
WEnd

Func _Hid()
	If Not WinActive($hChild_GUI) Then
		GUISetState(@SW_HIDE, $hMain_GUI)
		GUISetState(@SW_SHOW, $hChild_GUI)
	Else
		GUISetState(@SW_SHOW, $hMain_GUI)
		GUISetState(@SW_HIDE, $hChild_GUI)
	EndIf
EndFunc

Func _ChildGUI_Create($hParent)
    Local $hChild_GUI

    $hChild_GUI = GUICreate("Child GUI", 200, 200, -1, -1, -1, -1, $hParent)

    ;Создаём элементы тут
    $nChildGUI_Close_Bttn = GUICtrlCreateButton("Close", 20, 170, 60, 20)

    Return $hChild_GUI
EndFunc
 
Верх