Jump to content

pop-up window from a button

Recommended Posts

If you want your GUI to be small and pretty, and you don't want to make it too "crowded" with controls, simply make one button that will enable a pop-up window with the controls.

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Include <WinAPI.au3>

Global Const $WM_ENTERSIZEMOVE = 0x0231
Global Const $WM_EXITSIZEMOVE = 0x0232

$main_height = 300 ;height of the pop-up window

$slide_speed = 500 ;window pop-up/down speed, bigger number = slower, smaller number = faster

$Gui = GUICreate("Test", 370, 200) ;main GUI
$checkbox = GUICtrlCreateCheckbox("Disable main window when child is open", 5, 5, 250)
GUICtrlSetState(-1, $GUI_CHECKED)
$button1 = GUICtrlCreateButton("Child_1", 5, 160, 100, 30)
$button2 = GUICtrlCreateButton("Child_2", 110, 30, 250, 20)
$bb = GUICtrlCreateTab(130, 80, 200, 100)
$lol = GUICtrlCreateTabItem("Random control")
WinSetTrans($Gui, "", 255) ;if it's not set to 255, then sliding out has visual bugs
GUISetState(@SW_SHOW, $Gui)
$ParentPosArr = WinGetPos($Gui)
$ChildGui = GuiCreate("Child test", 100, $main_height, $ParentPosArr[0]+$ParentPosArr[2], $ParentPosArr[1]+5,$WS_POPUP, $WS_EX_MDICHILD, $Gui)
$childpos = WinGetPos($ChildGui)
$label1 = GUICtrlCreateButton("Test button 1", $childpos[2]/2-45, 5, 90)
GUICtrlSetResizing (-1, $GUI_DOCKWIDTH+$GUI_DOCKHCENTER) ;button will be in center, and will not change width in case of window increasement (like when u press button2)
$label2 = GUICtrlCreateButton("Close", $childpos[2]/2-45, 270, 90)
$label3 = GUICtrlCreateInput("Test", $childpos[2]/2-45, 80, 90)
GUICtrlCreateGraphic(0, 0, $childpos[2], $childpos[3], 0x07) ;gray line on the edge of the pop up window
GUISetState(@SW_HIDE, $ChildGui)

$child2 = GuiCreate("Child test", 100, $main_height, $ParentPosArr[0]+$ParentPosArr[2], $ParentPosArr[1]+5,$WS_POPUP, $WS_EX_MDICHILD, $Gui) ;transparent window to lock main window when child is opened
GUISetBkColor(0, $child2)
WinSetTrans($child2, "", 100)
GUISetState(@SW_HIDE, $child2)


Func WM_ENTERSIZEMOVE($hWndGUI, $MsgID, $WParam, $LParam)

Func WM_EXITSIZEMOVE($hWndGUI, $MsgID, $WParam, $LParam)

While 1
    $msg = GUIGetMsg()
    Switch $msg
        Case $GUI_EVENT_CLOSE
        Case $button1
            _show_child_window($button1, $slide_speed) ;slide in pop-up window ($button1 = button's handle)
        Case $button2
            _show_child_window($button2, $slide_speed)
        case $label2
            _slide_out($ChildGui, $slide_speed)

Func _show_child_window($button_handle, $Speed)
    if WinExists($ChildGui) then
        _slide_out($ChildGui, $Speed/2) ;2x faster if switching between button pop-ups
        _slide_in($ChildGui, $Speed, $button_handle)

func _slide_in($hwGui, $Speed, $hwCtrl)
    Local $position = ControlGetPos($Gui, "", $hwCtrl)
    Local $position2 = WinGetPos($Gui)
    Local $position2b = WinGetClientSize($Gui)
    Local $position3 = WinGetPos($hwGui)
    Local $light_border = ($position2[2]-$position2b[0])/2
    Local $thick_border = ($position2[3]-$position2b[1])-$light_border
    WinMove($hwGui, "", $position2[0]+$position[0]+$light_border, $position2[1]+$position[1]+$position[3]+$thick_border, $position[2]);set the window exacly below button
    DllCall("user32.dll", "int", "AnimateWindow", "hwnd", $hwGui, "int", $Speed, "long", 0x00040004)
    GUISetState(@SW_SHOW, $hwGui)
    if GUICtrlRead($checkbox) = $GUI_CHECKED Then
        WinMove($child2, "", $position2[0]+$light_border, $position2[1]+$thick_border, $position2b[0], $position2b[1])
        WinSetTrans($child2, "", 0)
        GUISetState(@SW_DISABLE, $child2)
        GUISetState(@SW_SHOWNOACTIVATE, $child2)
        for $i = 1 to 100 Step 10 ;showing "lock window" in smooth transparency
            WinSetTrans($child2, "", $i)

func _slide_out($hwGui, $Speed)
    if WinExists($child2) Then
        for $i = 100 to 1 Step -10
            WinSetTrans($child2, "", $i)
        GUISetState(@SW_HIDE, $child2)
    DllCall("user32.dll", "int", "AnimateWindow", "hwnd", $hwGui, "int", $Speed, "long", 0x00050008)
    GUISetState(@SW_HIDE, $hwGui)

edit: Made smoother "shadow" window appear/disappear

edit2: Fixed "flash" of the child window bug

Edited by sandin
Link to post
Share on other sites


This is great, I made a gui with a similar effect a while ago but it wasn't as smooth or beatiful as this one. Thanks for sharing it.

Interpreters have great power!Although they live in the shadow of compiled programming languages an interpreter can do anything that a compiled language can do, you just have to code it right.

Link to post
Share on other sites
  • 3 months later...
  • 6 months later...

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...