Jump to content

Recommended Posts

Posted (edited)

Hello there fellas!

I've stumbled upon a simple problem: I have a parent GUI, and 3 children, but when I hit a "Hide" button on a child GUI, the whole application shuts down...how can I prevent this from happening? (I only want the particular child to close)

Thanks in advance ;)

Edited by Punnichio
Posted

Hello there fellas!

I've stumbled upon a simple problem: I have a parent GUI, and 3 children, but when I hit a "Hide" button on a child GUI, the whole application shuts down...how can I prevent this from happening? (I only want the particular child to close)

Thanks in advance ;)

With-out short script which can duplicate the problem I would need to get my crystal ball, but it's broken at this time.

SciTE for AutoItDirections for Submitting Standard UDFs

 

Don't argue with an idiot; people watching may not be able to tell the difference.

 

Posted

I'm sorry to hear that, I hope you get it fixed soon, in the meantime here's the code...

If $msg = $Button_1 Then GuiSetState( @SW_SHOW, $child_[1])
    If $msg = $Button_2 Then GuiSetState( @SW_SHOW, $child_[2])
        If $msg = $Button_3 Then GuiSetState( @SW_SHOW, $child_[3])
            If $msg = $othermenuitem Then GUISetState( @SW_SHOW, $child_[4])
            If $msg = $Button_13 Then Winclose("Section1") 
            If $msg = $Button_14 Then Winclose("Section2")
            If $msg = $Button_15 Then Winclose("Shutdown")

Example: when I hit "button_15" it closes the whole GUI instead of only the GUI with the title "Shutdown" ;)

Posted

I'm sorry to hear that, I hope you get it fixed soon, in the meantime here's the code...

If $msg = $Button_1 Then GuiSetState( @SW_SHOW, $child_[1])
    If $msg = $Button_2 Then GuiSetState( @SW_SHOW, $child_[2])
        If $msg = $Button_3 Then GuiSetState( @SW_SHOW, $child_[3])
            If $msg = $othermenuitem Then GUISetState( @SW_SHOW, $child_[4])
            If $msg = $Button_13 Then Winclose("Section1") 
            If $msg = $Button_14 Then Winclose("Section2")
            If $msg = $Button_15 Then Winclose("Shutdown")

Example: when I hit "button_15" it closes the whole GUI instead of only the GUI with the title "Shutdown" ;)

Still guessing here, so why not use GuiDelete($WinHandle)

Assuming you created the gui window and captured the handle

I.E.

$WinHandle = GuiCreate("ShutDown")

SciTE for AutoItDirections for Submitting Standard UDFs

 

Don't argue with an idiot; people watching may not be able to tell the difference.

 

Posted

My guess as to why this happens is that WinClose probably sends $GUI_EVENT_CLOSE to the window. And because you probably have one whole loop and GUIGetMsg returns messages for all windows, your While 1 ... WEnd loop picks this p and assumes it is for the parent GUI, therefore closes it and closes the children.

[size="4"]YOU SHALL NOT PARSE!![/size]
  • 2 months later...
Posted

maybe...

;====================================================
;============= Example of a child window ============
;====================================================
; AutoIt version: 3.0.103
; Language:       English
; Author:         "SlimShady"
;
; ----------------------------------------------------------------------------
; Script Start
; ----------------------------------------------------------------------------

;Include constants
#include <GUIConstants.au3>

;Initialize variables
Global $IniFile
Global $GUIWidth
Global $GUIHeight

$GUIWidth = 250
$GUIHeight = 250

;Create main/parent window
$ParentWin = GUICreate("Parent GUI", $GUIWidth, $GUIHeight)
;Save the position of the parent window
$ParentWin_Pos = WinGetPos($ParentWin, "")
;Show the parent window/Make the parent window visible
GUISetState(@SW_SHOW)

;Create child window and add the parameter to make it the child of the parent window
$ChildWin = GUICreate("Child GUI", $GUIWidth, $GUIHeight, $ParentWin_Pos[0] + 100, $ParentWin_Pos[1] + 100, -1, -1, $ParentWin)
;Show the child window/Make the child window visible
GUISetState(@SW_SHOW)

;Switch to the parent window
GUISwitch($ParentWin)

;Loop until:
;- user presses Esc when focused to the parent window
;- user presses Alt+F4 when focused to the parent window
;- user clicks the close button of the parent window
While 1
  ;After every loop check if the user clicked something in the GUI windows
   $msg = GUIGetMsg(1)
   Select
     ;Check if user clicked on a close button of any of the 2 windows
      Case $msg[0] = $GUI_EVENT_CLOSE
        ;Check if user clicked on the close button of the child window
         If $msg[1] = $ChildWin Then
            MsgBox(64, "Test", "Child GUI will now close.")
           ;Switch to the child window
            GUISwitch($ChildWin)
           ;Destroy the child GUI including the controls
            GUIDelete()
        ;Check if user clicked on the close button of the parent window
         ElseIf $msg[1] = $ParentWin Then
            MsgBox(64, "Test", "Parent GUI will now close.")
           ;Switch to the parent window
            GUISwitch($ParentWin)
           ;Destroy the parent GUI including the controls
            GUIDelete()
           ;Exit the script
            Exit
         EndIf

   EndSelect

WEnd

8)

NEWHeader1.png

Posted (edited)

Thank you!! That was driving me nuts. I just reread up on the GUIGetMsg(1). Before I couldn't understand it's usage. Now I see more how it's setting the array.

With this method there is no way to create the child window "after the fact." I'm just thinking for future usage. Just curious and trying to understand all the ins-and-outs.

Addition:

Thank you furthermore, this has made me understand and use GUIState's optional parameter. I'm really understanding the GUIGetMsg more now. It's pretty sweet.

Edited by JohnBailey
A decision is a powerful thing
Posted

after the fact

#include <GUIConstants.au3>

;Initialize variables
Global $IniFile, $ChildWin
Global $GUIWidth = 250
Global $GUIHeight = 250


$ParentWin = GUICreate("Parent GUI", $GUIWidth, $GUIHeight)

$ParentWin_Pos = WinGetPos($ParentWin, "")

$btn = GUICtrlCreateButton("Child", 50, 50, 80, 25)
GUISetState(@SW_SHOW)


While 1

    $msg = GUIGetMsg()
    If $msg = -3 And WinActive($ParentWin) Then Exit
    If $msg = $btn Then MakeChild()

WEnd


Func MakeChild()

    $ChildWin = GUICreate("Child GUI", $GUIWidth, $GUIHeight, $ParentWin_Pos[0] + 100, $ParentWin_Pos[1] + 100, -1, -1, $ParentWin)
    GUISetState(@SW_SHOW)
    
    While 2
        $msg2 = GUIGetMsg()
        If $msg2 = -3 And WinActive($ChildWin) Then
            GUIDelete($ChildWin)
            ExitLoop
        EndIf
    WEnd
EndFunc   ;==>MakeChild

I just butchurd the prev code.... there are many ways to do this

8)

NEWHeader1.png

Posted

While 1

    $msg = GUIGetMsg()
    If $msg = -3 And WinActive($ParentWin) Then Exit
    If $msg = $btn Then MakeChild()

WEnd
I looked through GUIConstantsEx.au3. So the -3 means $GUI_EVENT_CLOSE? This is so much shorter than typing that out, but I just wanted to verify that it means that. I really want to understand the meaning of everything you wrote out. You and xCal provided GREAT examples! These should be in the help file, in my opinion.
A decision is a powerful thing
Posted

OK ..

when you download the inventor game the source is included .. but here's the solution

Lets say you create a menu with special thanks to other people who helped you and we call it credit

include <GUIConstants.au3>

Opt("TrayMenuMode", 1) 
Opt("GUIResizeMode", 1)
AutoItSetOption("TrayIconHide", 1)


$Parent = GuiCreate("Parent" , 250, 150)
$Filemenu = GUICtrlCreateMenu ("&File")
$Helpmenu = GUICtrlCreateMenu ("&?")
$FilemenuExit  = GUICtrlCreateMenuitem ("&Exit", $filemenu)
$HelpmenuCredits = GUICtrlCreateMenuitem ("&Credit", $helpmenu)
GUICtrlCreateLabel ("Nothing here", 20,40,150,20)
GUICtrlCreateLabel ("Select menu ? and click credits", 20,60,150,20)
GUISetState()

Func Credits ()
    GuiSetState (@SW_DISABLE, $Parent)
    $Child = GuiCreate("Say Thnx",200,80,-1,-1)
    $ChildFilemenu = GUICtrlCreateMenu ("&File")
    $ChildFilemenuExit  = GUICtrlCreateMenuitem ("&Exit", $ChildFilemenu)
    GUICtrlCreateLabel ("i would like to say thanks to Emiel", 20,40)
    GUISetState(@SW_SHOW, $Child)
    
    While 2 
        $msgchild = GUIGetMsg ()
        If $msgchild = $GUI_EVENT_CLOSE then
            ExitLoop
        EndIf
        Select
            case $msgchild = $ChildFilemenuExit
                Exitloop 
        EndSelect
    Wend
    
    GuiDelete ($Child)
    GuiSetState (@SW_ENABLE, $Parent)
    GuiSetState (@SW_RESTORE, $Parent)
    GuiSwitch ($Parent)
EndFunc

While 1 
    $msg = GUIGetMsg ()
        If $msg = $GUI_EVENT_CLOSE then
            Exit
        EndIf
        Select
            case $msg = $FilemenuExit
                exit
            case $msg = $HelpmenuCredits
                Credits ()
        Endselect
WEnd

Best regards,Emiel Wieldraaijer

Posted

:whistle: Yes definite props to those who give me such awesome direction! Learning the syntax of and using autoit is/has been wonderful. Xcal, Valuater, and yourself so far have been so helpful in me understanding how to do child window close (and more as a result).

Why would you suggest this method over Valuater's or SlimShady's?

A decision is a powerful thing

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...