Что нового

Показ/скрытие дочернего окна одной кнопкой без использования счетчика

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Доброго времени суток. Пробую повесить на одну кнопку два действия: показ/скрытие дочернего окна. Пока что получается сделать только в том случае, если использую счетчик кликов по кнопке. Но хотелось бы обойтись без него. Пробую сделать так:
Код:
#include <GUIConstantsEx.au3>

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

$hMain_GUI = GUICreate("Главное окно", 250, 250)
$nChild_Button = GUICtrlCreateButton("Показать/Скрыть", 20, 220, 100, 20)
    ;Создаём элементы  в главном окне
$nChildGUI_Close_Bttn = GUICtrlCreateButton("2 вариант", 20, 170, 100, 20)

GUISetState(@SW_SHOW, $hMain_GUI)

;Создаём дочерний 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

            If Mod($k,2) = 0 Then
               $k += 1
               ConsoleWrite("по идее показать, потому к = " & $k & @CR)
            ;Показываем дочерний GUI при нажатий на кнопку "Показать/Скрыть"
            GUISetState(@SW_SHOW, $hChild_GUI)
            If Not WinActive($hChild_GUI) Then WinActivate($hChild_GUI)

            Else
               GUISetState(@SW_HIDE, $hChild_GUI)
               $k += 1
               ConsoleWrite("по идее скрыть, потому к = " & $k & @CR)
            EndIf
        Case $nChildGUI_Close_Bttn
            ;GUISetState(@SW_HIDE, $hChild_GUI)
            ;_Hid1()
            _Hid2()
    EndSwitch
WEnd

Func _Hid1()
    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 _Hid2()
    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)

    Return $hChild_GUI
EndFunc

Тут несколько вариантов привязано на вторую кнопку, часть закоментирована, чтоб не путались. Но они работают не коректно. Где ошибка не могу понять.
 

All2khoff

Продвинутый
Сообщения
352
Репутация
65
Можно использовать статус.
хороший пример в справке
Код:
HotKeySet
взять как основу
Код:
Global $Paused
HotKeySet("{PAUSE}", "TogglePause")

Func TogglePause()
$Paused = Not $Paused
While $Paused
Sleep(100)
ToolTip('Скрипт приостановлен')
WEnd
ToolTip("")
EndFunc

и чутка доработать.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
мой вариант с некоторым заделом на будущее
так или иначе метку клика придется использовать. но не буквальный счетчик


Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Global $FD, $flag
Global $Form1 = GUICreate('Form1', 490, 201, 682, 386)
Global $Button1 = GUICtrlCreateButton('Button1', 176, 80, 139, 25)
GUISetState(@SW_SHOW)
GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')
GUIRegisterMsg($WM_SYSCOMMAND, 'WM_SYSCOMMAND')
While Sleep(10)
    If $flag Then
        $flag = 0
        _CreateWin()
    EndIf
WEnd

Func _CreateWin()
    $FD = GUICreate('Дочернее', 274, 182, 100, 100, -1, -1, $Form1)
    GUICtrlCreateLabel('Окно 2', 32, 40, 39, 17)
    GUISetState(@SW_SHOW)
EndFunc   ;==>_CreateWin

Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
    #forceref $hWnd, $Msg, $lParam
    Local $nID = BitAND($wParam, 0x0000FFFF)
    Switch $nID
        Case $Button1
            If $FD Then
                GUIDelete($FD)
                $FD = 0
            Else
                $flag = 1
            EndIf
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND

Func WM_SYSCOMMAND($hWnd, $Msg, $wParam, $lParam)
    Local $iID = BitAND($wParam, 0x0000FFFF)
    If $iID = 61536 Then
        Switch $hWnd
            Case $Form1
                Exit
            Case $FD
                GUIDelete($FD)
                $FD = 0
        EndSwitch
    EndIf
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_SYSCOMMAND
 
Автор
D

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
и чутка доработать.
Крутился вокруг да около. Сделал так:
Код:
Global $ShowChild
;.......................
  Func _Hide()
      $ShowChild = Not $ShowChild
    If $ShowChild Then
        GUISetState(@SW_SHOW, $hChild_GUI)
    Else
        GUISetState(@SW_SHOW, $hMain_GUI)  ; только в реальном скрипте эту строку пришлось убрать
        GUISetState(@SW_HIDE, $hChild_GUI)
    EndIf
 EndFunc

Сообщение автоматически объединено:

мой вариант с некоторым заделом на будущее
Спасибо. Никак не могу толком разобраться с этими WM_COMMAND, WM_SYSCOMMAND и WM_NOTIFY. Когда и какую правильнее применять и как. Иногда получается то, что хотел. Иногда отлаживаю в сторону. Вот и сейчас, понимаю, что с их помощью можно настроить скрытие дочернего окна по любому элементу родительского, но не понимаю как.
 
Последнее редактирование:

All2khoff

Продвинутый
Сообщения
352
Репутация
65
в продвинутой автоматизации по ботам eveonline целый клондайк на тему статусов и датчиков состояния. бот сверяющий десятки параметров построенный отличной от if else логики от belfigor для меня практически колдовство, я несколько дней провел просто сверяя откуда берется статус и на что он влияет.
Очень рекомендую, там в разделе порой довольно сложные задачи решают очень красиво и элегантно.
 
Автор
D

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
в продвинутой автоматизации по ботам eveonline целый клондайк на тему статусов и датчиков состояния
Это вот тут?
 
Верх