InunoTaishou Posted November 5, 2015 Posted November 5, 2015 I'm essentially trying to create a pop-out window from the Parent GUI by using a child gui (So the child always stays aligned with the parent and I don't have to track the position of the parent and update the child myself). I've got it tracking and got the pop-out window working (pretty smoothly) but I need the child to always be below the parent.I tried using GUISetOnTop and using a variant of different styles and exStyles but none seemed to work as needed. Is this possible?And here's some code. (Hovering over the right side of the Parent window will slide the child to the right, when the cursor goes out of bounds the child goes back to the start.)expandcollapse popup#include <GuiConstantsEx.au3> #include <WindowsConstants.au3> #include <WinAPI.au3> #include <WinAPIGdi.au3> AutoItSetOption("GuiOnEventMode", 1) $frmMain = GUICreate("Parent", 400, 400, -1, -1, -1, $WS_EX_TOPMOST) GUISetBkColor(0x000000, $frmMain) GUISetOnEvent($GUI_EVENT_MOUSEMOVE, "MyFunc") GUISetOnEvent($GUI_EVENT_CLOSE, "Close") $frmChild = GuiCreate("Child", 200, 395, 195, -1, $WS_POPUP, BITOR($WS_EX_MDICHILD, $WS_EX_DLGMODALFRAME), $frmMain) GUISetOnEvent($GUI_EVENT_MOUSEMOVE, "MyFunc") GUISetOnEvent($GUI_EVENT_CLOSE, "Close") $btnButton = GUICtrlCreateButton("Test", 50, 10, 140, 20) GUICtrlSetFont(-1, 10, 300, "", "Segoe UI") GUICtrlSetOnEvent(-1, "DoStuff") $lblLabel = GUICtrlCreateLabel("Press the button to do stuff", 50, 35, 140, 40) GUICtrlSetFont(-1, 10, 300, "", "Segoe UI") GUISetState(@SW_SHOW, $frmMain) GUISetState(@SW_SHOW, $frmChild) While 1 Sleep(250) WEnd Func Close() Exit EndFunc Func DoStuff() GUICtrlSetData($lblLabel, "Stuff happened! :D") Sleep(1000) GUICtrlSetData($lblLabel, "Press the button to do stuff") EndFunc Func MyFunc() Local $gui_coords = WinGetPos("Parent") Local $mouse_coords = MouseGetPos() Local static $displayed = False Local Static $x_offset = 0 If ((Not _WinAPI_PtInRectEx($mouse_coords[0], $mouse_coords[1], $gui_coords[0] + 325, $gui_coords[1] + 10, $gui_coords[0] + 585, $gui_coords[1] + 450)) and $displayed) Then While ((Not _WinAPI_PtInRectEx($mouse_coords[0], $mouse_coords[1], $gui_coords[0] + 350, $gui_coords[1] + 10, $gui_coords[0] + 350 + $x_offset, $gui_coords[1] + 450)) and $x_offset <> 0) $gui_coords = WinGetPos("Parent") $mouse_coords = MouseGetPos() WinMove("Child", "", $gui_coords[0] + 194 + $x_offset, $gui_coords[1] + 24) $x_offset -= 6 Sleep(1) Wend If ($x_offset <> 0) Then For $i = $x_offset to 0 Step -3 WinMove("Child", "", $gui_coords[0] + 194 + $i, $gui_coords[1] + 24) Next $x_offset = 0 Else $displayed = False EndIf ElseIf (_WinAPI_PtInRectEx($mouse_coords[0], $mouse_coords[1], $gui_coords[0] + 325, $gui_coords[1] + 24, $gui_coords[0] + 400, $gui_coords[1] + 450) and Not $displayed) Then While (_WinAPI_PtInRectEx($mouse_coords[0], $mouse_coords[1], $gui_coords[0] + 325, $gui_coords[1] + 24, $gui_coords[0] + 400 + $x_offset, $gui_coords[1] + 450) and $x_offset <> 180) $gui_coords = WinGetPos("Parent") $mouse_coords = MouseGetPos() WinMove("Child", "", $gui_coords[0] + 194 + $x_offset, $gui_coords[1] + 24) $x_offset += 10 Sleep(1) Wend If ($x_offset <> 180) Then For $i = $x_offset to 180 Step 3 WinMove("Child", "", $gui_coords[0] + 194 + $i, $gui_coords[1] + 24) Next $x_offset = 180 Else $displayed = True EndIf EndIf EndFunc
InunoTaishou Posted November 6, 2015 Author Posted November 6, 2015 Realized I didn't need to use child because the child window would have been hidden anyway so the user would never know if it was behind the main GUI or not. Ended up just moving it off the screen. Created a $frmDummy GUI and made the $frmChild a child of that one just so there was no toolbar icon. Once the mouse goes out of bounds the $frmChild starts to go back to hiding behind the $frmMain GUI. Once the $x_offset is at 0 the $frmChild is moved out of the screen. (Also have an extra if statement after each while loop that moves the $frmChild to see if the user maybe moved the mouse back into, or out of, the bounding area, depending on the state of $displayed.) (Hopefully all of that made sense) Came out pretty smooth.expandcollapse popup#include <GuiConstantsEx.au3> #include <WindowsConstants.au3> #include <WinAPI.au3> #include <WinAPIGdi.au3> AutoItSetOption("GuiOnEventMode", 1) $frmMain = GUICreate("Parent", 400, 400, -1, -1, -1, $WS_EX_TOPMOST) GUISetOnEvent($GUI_EVENT_MOUSEMOVE, "MyFunc") GUISetOnEvent($GUI_EVENT_CLOSE, "Close") $lblScrollMenu = GUICtrlCreateLabel("", 375, 0, 25, 400) GUICtrlSetBkColor(-1, 0x000000) $frmDummy = GUICreate("Dummy", 0, 0) $frmChild = GuiCreate("Child", 250, 395, @DesktopWidth * 2, -1, $WS_POPUP, -1, $frmDummy) GUISetOnEvent($GUI_EVENT_MOUSEMOVE, "MyFunc") $btnButton = GUICtrlCreateButton("Stuff", 20, 10, 220, 20) GUICtrlSetFont(-1, 10, 300, "", "Segoe UI") GUICtrlSetOnEvent(-1, "DoStuff") $lblLabel = GUICtrlCreateLabel("Press the button to do stuff", 20, 35, 220, 25) GUICtrlSetFont(-1, 10, 300, "", "Segoe UI") GUICtrlCreateGroup("Colors", 20, 65, 220, 100) GUICtrlCreateRadio("Red", 30, 80, 50, 20) GUICtrlSetOnEvent(-1, "SetColor") GUICtrlCreateRadio("Green", 90, 80, 50, 20) GUICtrlSetOnEvent(-1, "SetColor") GUICtrlCreateRadio("Blue", 160, 80, 50, 20) GUICtrlSetOnEvent(-1, "SetColor") GUICtrlCreateRadio("Cyan", 30, 105, 50, 20) GUICtrlSetOnEvent(-1, "SetColor") GUICtrlCreateRadio("Magenta", 90, 105, 60, 20) GUICtrlSetOnEvent(-1, "SetColor") GUICtrlCreateRadio("Yellow", 160, 105, 50, 20) GUICtrlSetOnEvent(-1, "SetColor") GUICtrlCreateRadio("Black", 30, 130, 50, 20) GUICtrlSetOnEvent(-1, "SetColor") GUICtrlSetState(-1, $GUI_CHECKED) GUISetState(@SW_SHOW, $frmMain) GUISetState(@SW_SHOW, $frmChild) While 1 Sleep(250) WEnd Func DoStuff() GUICtrlSetData($lblLabel, "Stuff happened! :D") Sleep(500) GUICtrlSetData($lblLabel, "Press the button to do stuff") EndFunc Func SetColor() Local const $color = GUICtrlRead(@GUI_CtrlId, 1) If ($color = "Red") Then GUICtrlSetBkColor($lblScrollMenu, 0xFF0000) ElseIf ($color = "Green") Then GUICtrlSetBkColor($lblScrollMenu, 0x00FF00) ElseIf ($color = "Blue") Then GUICtrlSetBkColor($lblScrollMenu, 0x0000FF) ElseIf ($color = "Cyan") Then GUICtrlSetBkColor($lblScrollMenu, 0x00FFFF) ElseIf ($color = "Yellow") Then GUICtrlSetBkColor($lblScrollMenu, 0xFFFF00) ElseIf ($color = "Magenta") Then GUICtrlSetBkColor($lblScrollMenu, 0xFF00FF) Else GUICtrlSetBkColor($lblScrollMenu, 0x000000) EndIf EndFunc Func MyFunc() Local $gui_coords = WinGetPos("Parent") Local $mouse_coords = MouseGetPos() Local static $displayed = False Local Static $x_offset = 0 If ($displayed) Then If (Not _WinAPI_PtInRectEx($mouse_coords[0], $mouse_coords[1], $gui_coords[0] + 375, $gui_coords[1] + 10, $gui_coords[0] + 675, $gui_coords[1] + 425)) Then While ((Not _WinAPI_PtInRectEx($mouse_coords[0], $mouse_coords[1], $gui_coords[0] + 375, $gui_coords[1] + 10, $gui_coords[0] + 350 + $x_offset, $gui_coords[1] + 425)) and $x_offset <> 0) $gui_coords = WinGetPos("Parent") $mouse_coords = MouseGetPos() $x_offset -= 10 WinMove("Child", "", $gui_coords[0] + 140 + $x_offset, $gui_coords[1] + 28) Sleep(1) Wend If ($x_offset <> 0) Then For $i = $x_offset to 260 Step 5 WinMove("Child", "", $gui_coords[0] + 140 + $i, $gui_coords[1] + 28) Next $displayed = True Else WinMove("Child", "", @DesktopWidth * 2, 0) $displayed = False EndIf EndIf Else If (_WinAPI_PtInRectEx($mouse_coords[0], $mouse_coords[1], $gui_coords[0] + 375, $gui_coords[1] + 24, $gui_coords[0] + 400, $gui_coords[1] + 425)) Then While (_WinAPI_PtInRectEx($mouse_coords[0], $mouse_coords[1], $gui_coords[0] + 375, $gui_coords[1] + 24, $gui_coords[0] + 425 + $x_offset, $gui_coords[1] + 425) and $x_offset <> 260) $gui_coords = WinGetPos("Parent") $mouse_coords = MouseGetPos() $x_offset += 10 WinMove("Child", "", $gui_coords[0] + 140 + $x_offset, $gui_coords[1] + 28) Sleep(1) Wend If ($x_offset <> 260) Then For $i = $x_offset to 0 Step -5 WinMove("Child", "", $gui_coords[0] + 140 + $i, $gui_coords[1] + 28) Next WinMove("Child", "", @DesktopWidth * 2, 0) $displayed = False Else $displayed = True EndIf EndIf EndIf EndFunc Func Close() Exit EndFunc
JohnOne Posted November 6, 2015 Posted November 6, 2015 I used something similar to that onceThis UDF from M23 worked a treat.Might be worth taking a look at. AutoIt Absolute Beginners Require a serial Pause Script Video Tutorials by Morthawt ipify Monkey's are, like, natures humans.
InunoTaishou Posted November 6, 2015 Author Posted November 6, 2015 (edited) Not quite, that just resizes the GUI, I was trying to create kind of a sliding GUI that pops out behind the main GUI.This is what mine loos like. http://i.imgur.com/zoIgTRH.gifv Edited November 6, 2015 by InunoTaishou
Moderators Melba23 Posted November 6, 2015 Moderators Posted November 6, 2015 InunoTaishou,that just resizes the GUII would like to point out that the UDF does a bit more than that - but it certainly does not slide as you require.Have you looked into animating the GUI? Take a look at my Toast or Notify UDFs to see how you can do it. If I find time later (I am about to go out) I will see if I can produce an example based on your code above.M23 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area
Moderators Melba23 Posted November 6, 2015 Moderators Posted November 6, 2015 InunoTaishou,How about this?expandcollapse popup#include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <AutoItConstants.au3> #include <WinAPISys.au3> AutoItSetOption("GuiOnEventMode", 1) Global $iBorder = 50, $bOpen = False $hGUI = GUICreate("Test", 500, 500, 200, 200) GUISetOnEvent($GUI_EVENT_MOUSEMOVE, "_MouseMove") GUISetOnEvent($GUI_EVENT_CLOSE, "_Close") $cScrollLabel = GUICtrlCreateLabel("", 500 - $iBorder, 0, $iBorder, 500) GUICtrlSetBkColor($cScrollLabel, 0x000000) GUISetState() $aWinPos = WinGetPos($hGUI) $hChild = GUICreate("Child", 250, $aWinPos[3] - 20, $aWinPos[0] + 506, $aWinPos[1] + 10, $WS_POPUP) GUISetOnEvent($GUI_EVENT_MOUSEMOVE, "_MouseMove") $cButton = GUICtrlCreateButton("Stuff", 20, 10, 220, 20) GUICtrlSetFont($cButton, 10, 300, "", "Segoe UI") GUICtrlSetOnEvent($cButton, "_DoStuff") $cLabel = GUICtrlCreateLabel("Press the button to do stuff", 20, 35, 220, 25) GUICtrlSetFont($cLabel, 10, 300, "", "Segoe UI") GUICtrlCreateGroup("Colors", 20, 65, 220, 100) GUICtrlCreateRadio("Red", 30, 80, 50, 20) GUICtrlSetOnEvent(-1, "_SetColor") GUICtrlCreateRadio("Green", 90, 80, 50, 20) GUICtrlSetOnEvent(-1, "_SetColor") GUICtrlCreateRadio("Blue", 160, 80, 50, 20) GUICtrlSetOnEvent(-1, "_SetColor") GUICtrlCreateRadio("Cyan", 30, 105, 50, 20) GUICtrlSetOnEvent(-1, "_SetColor") GUICtrlCreateRadio("Magenta", 90, 105, 60, 20) GUICtrlSetOnEvent(-1, "_SetColor") GUICtrlCreateRadio("Yellow", 160, 105, 50, 20) GUICtrlSetOnEvent(-1, "_SetColor") GUICtrlCreateRadio("Black", 30, 130, 50, 20) GUICtrlSetOnEvent(-1, "_SetColor") GUICtrlSetState(-1, $GUI_CHECKED) WinSetTrans($hChild, "", 0) GUISetState() _WinAPI_SetWindowPos($hChild, $hGUI, 706, 230, 250, 490, $SWP_HIDEWINDOW) WinSetTrans($hChild, "", 255) GUIRegisterMsg($WM_MOVE, "_WM_MOVE") While 1 Sleep(10) WEnd Func _MouseMove() If Not $bOpen Then $aWinPos = WinGetPos($hGUI) $aCInfo = GUIGetCursorInfo($hGUI) Switch $aCInfo[1] Case 20 To $aWinPos[3] ; Allow space at the top so that moving to the buttons does not opene the child Switch $aCInfo[0] Case $aWinPos[2] - $iBorder To $aWinPos[2] If Not $bOpen Then _WinAPI_AnimateWindow($hChild, BitOR($AW_ACTIVATE, $AW_HOR_POSITIVE)) $bOpen = True WinActivate($hChild) EndIf EndSwitch EndSwitch Else $aWinPos = WinGetPos($hChild) $aCInfo = GUIGetCursorInfo($hChild) Switch $aCInfo[1] Case 0 To $aWinPos[3] If $aCInfo[0] < -$iBorder Then If $bOpen Then _WinAPI_AnimateWindow($hChild, BitOR($AW_HIDE, $AW_HOR_NEGATIVE)) $bOpen = False WinActivate($hGUI) EndIf EndIf EndSwitch EndIf EndFunc ;==>_MouseMove Func _DoStuff() GUICtrlSetData($cLabel, "Stuff happened! :D") Sleep(500) GUICtrlSetData($cLabel, "Press the button to do stuff") EndFunc ;==>_DoStuff Func _SetColor() Switch GUICtrlRead(@GUI_CtrlId, 1) Case "Red" GUICtrlSetBkColor($cScrollLabel, 0xFF0000) Case "Green" GUICtrlSetBkColor($cScrollLabel, 0x00FF00) Case "Blue" GUICtrlSetBkColor($cScrollLabel, 0x0000FF) Case "Cyan" GUICtrlSetBkColor($cScrollLabel, 0x00FFFF) Case "Yellow" GUICtrlSetBkColor($cScrollLabel, 0xFFFF00) Case "Magenta" GUICtrlSetBkColor($cScrollLabel, 0xFF00FF) Case Else GUICtrlSetBkColor($cScrollLabel, 0x000000) EndSwitch EndFunc ;==>_SetColor Func _Close() Exit EndFunc ;==>_Close Func _WM_MOVE($hWnd, $iMsg, $wParam, $lParam) #forceref $iMsg, $wParam, $lParam If $hWnd = $hGUI Then Local $aWinPos = WinGetPos($hGUI) WinMove($hChild, "", $aWinPos[0] + 506, $aWinPos[1] + 30) EndIf EndFunc ;==>_WM_MOVEPlease ask if you have any questions.M23 vicmc 1 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area
InunoTaishou Posted November 6, 2015 Author Posted November 6, 2015 My god, I didn't realize there was a WinAPI function that could do what I needed!Yours is pretty nice, looks like a rolling window, I was looking for a sliding window and $AW_SLIDE does exactly that. Thank you very much!It looks like the GUI becomes disabled while the API function is moving the child though. It does what I need in less code but it doesn't work as well as what I was wanting it for, still really nice function to make some pretty GUIs. And by what I was wanting I mean that if the use moves away from the area that causes the window to move out, it starts to go back into retracted. If the user goes back into the area that causes the window to move out again it starts to move the window out again. The _WinAPI_AnimateWindow looks extremely useful though.
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now