Jump to content

Recommended Posts

Posted (edited)

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)
GUICtrlSetResizing (-1, $GUI_DOCKWIDTH+$GUI_DOCKHCENTER)
$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)

GUIRegisterMsg($WM_ENTERSIZEMOVE,"WM_ENTERSIZEMOVE")
GUIRegisterMsg($WM_EXITSIZEMOVE, "WM_EXITSIZEMOVE")

Func WM_ENTERSIZEMOVE($hWndGUI, $MsgID, $WParam, $LParam)
    WinSetTrans($ChildGui,"",254)
EndFunc

Func WM_EXITSIZEMOVE($hWndGUI, $MsgID, $WParam, $LParam)
    WinSetTrans($ChildGui,"",255)
EndFunc

While 1
    $msg = GUIGetMsg()
    Switch $msg
        Case $GUI_EVENT_CLOSE
            Exit
        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)
    EndSwitch
WEnd

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

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)
    _WinAPI_RedrawWindow($hwGui)
    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)
            Sleep(1)
        Next
    EndIf
EndFunc

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

edit: Made smoother "shadow" window appear/disappear

edit2: Fixed "flash" of the child window bug

Edited by sandin
Posted
Posted

WOW!

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.

  • 3 months later...
  • 6 months later...
Posted

Fantabulous!

But I have a question. Can we make the GUI of a different size slide out of the button?

for eg. my button has width 100 and the gui that i want to slide out has dimensions 400*500.

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