Jump to content

_WinApi_SetParent and Event Close


Recommended Posts

When creating an mdi child using _WinApi_SetParent the close event for the parent is not run until the child window is closed. Is there any way to close the child windows when the parent's close button is pressed? It seems that when you close from the task bar the parent close function is run first.

#include <WinAPI.au3>
#include <GUIConstants.au3>

Opt("GUIOnEventMode", 1)

Global $hParent = GUICreate("Parent", 800, 600)
Global $hChild = GUICreate("Child", 300, 200, 0, 0)

_WinAPI_SetParent($hChild, $hParent)

GUISetState(@SW_SHOW, $hParent)
GUISetState(@SW_SHOW, $hChild)

GUISetOnEvent($GUI_EVENT_CLOSE, CloseWinParent, $hParent)
GUISetOnEvent($GUI_EVENT_CLOSE, CloseWinChild, $hChild)

While (True)
    Sleep(100)
WEnd

Func CloseWinParent()
    ConsoleWrite("CloseWinParent" & @LF)
    GUIDelete($hParent)
    Exit 0
EndFunc

Func CloseWinChild()
    ConsoleWrite("CloseWinChild" & @LF)
    GUIDelete($hChild)
EndFunc

Also, looking at the help file

Quote

An application can use the SetParent function to set the parent window of a pop-up, overlapped, or child
window. The new parent window and the child window must belong to the same application.

This is wrong. I've used _WinApi_SetParent in the past to set autoit created programs to the child of other programs. Perhaps it was like this in the past but Windows 7 and greater different applications can be child and parent.

Edited by InunoTaishou
Link to comment
Share on other sites

I guess I jumped the gun on posting for help. I noticed that the parent window always looked like it was losing focus when clicking the title and the minimize button. After a quick test it was losing focus so the event was never being sent to the parent. Using the styles BitOR($WS_CAPTION, $WS_CHILD, $WS_SYSMENU, $WS_MINIMIZEBOX) accomplishes the same thing but it greys out the child title bar (I'm guessing because it never actually gains focus).

#include <WinAPI.au3>
#include <GUIConstants.au3>

Opt("GUIOnEventMode", 1)

Global $hParent = GUICreate("Parent", 800, 600)
Global $hChild = GUICreate("Child", 300, 200, 0, 0, BitOR($WS_CAPTION, $WS_CHILD, $WS_SYSMENU, $WS_MINIMIZEBOX), -1, $hParent)

GUISetState(@SW_SHOW, $hParent)
GUISetState(@SW_SHOW, $hChild)

GUISetOnEvent($GUI_EVENT_CLOSE, CloseWinParent, $hParent)
GUISetOnEvent($GUI_EVENT_CLOSE, CloseWinChild, $hChild)

While (True)
    Sleep(100)
WEnd

Func CloseWinParent()
    ConsoleWrite("CloseWinParent" & @LF)
    GUIDelete($hParent)
    Exit 0
EndFunc

Func CloseWinChild()
    ConsoleWrite("CloseWinChild" & @LF)
    GUIDelete($hChild)
EndFunc

 

Link to comment
Share on other sites

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
 Share

×
×
  • Create New...