Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] По нажатию кнопки в GUI снизу появляется дополнительный сектор окна (http://forum.oszone.net/showthread.php?t=154521)

evg64 26-10-2009 17:54 1253020

По нажатию кнопки в GUI снизу появляется дополнительный сектор окна
 
Добрый день! Нужно, чтобы по нажатию кнопки снизу появлялась до этого не существовавшая часть окна (ширина равна ширине изначального GUI, высота произвольна).
Как реализовать такую возможность на примере нижеследующего скрипта?

Код:

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$Form1 = GUICreate("Form1", 550, 146, 192, 124)
$Button1 = GUICtrlCreateButton("Опции >>", 440, 112, 105, 25, $WS_GROUP)
GUISetState(@SW_SHOW)


While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $Button1
                                ChangeGUIView() ; тут должен быть код, изменяющий GUI

                                Case $GUI_EVENT_CLOSE
                        Exit
        EndSwitch
WEnd

Func ChangeGUIView()
EndFunc

По нажатию кнопки можно убить форму и создать новую с нужным наполнением, но не хочется, чтобы все лишний раз мигало (некрасиво). Хочу сделать так, чтобы к существующей неизменной форме добавился еще 1 кусок снизу (в дальнейшем понатыкаю туда controls) :)
P.S. Сори, если объяснение того, что нужно, очень пространное, но я не знаю, как это называется. В каких-то окнах я видел реализацию такой возможности, но напрочь не помню, где именно. Поэтому примеров готовых решений предоставить не могу.

beve 26-10-2009 21:51 1253232

Код:

#include <GUIConstantsEx.au3>
Global $Guiwidth=550
Global $Guiheight =300

$hGUI = GUICreate("Test", $Guiwidth, $Guiheight)
$ResizeGUI_Button =
GUICtrlCreateButton("Опции >>", 440, 250, 105, 25)
$ResizeGUI_Button2 =
GUICtrlCreateButton("Опции <<", 440, 95, 105, 25)
GUICtrlSetState($ResizeGUI_Button2,$GUI_HIDE)

;Create test controls
$TestControl= GUICtrlCreateButton("Кнопка", 10, 150, 105, 25)
GUICtrlSetState($TestControl,$GUI_HIDE)
$TestControl2=
GUICtrlCreateInput("Инпут", 10, 200, 120, 25)
GUICtrlSetState($TestControl2,$GUI_HIDE)
$TestControl3=
GUICtrlCreateCombo("Комбо", 10, 250, 135, 25)
GUICtrlSetState($TestControl3,$GUI_HIDE)

WinMove($hGUI, "",
Default, Default, $Guiwidth, $Guiheight-150)
GUISetState(@SW_SHOW)

While 1
   
$nMsg =
GUIGetMsg()
   
Switch $nMsg
       
Case $ResizeGUI_Button
           
WinMove($hGUI, "",
Default, Default,$Guiwidth, $Guiheight)
           
ControlHide($hGui ,"",$ResizeGUI_Button)
           
ControlShow($hGui ,"",$ResizeGUI_Button2)
           
GUICtrlSetState($TestControl,$GUI_Show)
           
GUICtrlSetState($TestControl2,$GUI_Show)
           
GUICtrlSetState($TestControl3,$GUI_Show)
       
Case $ResizeGUI_Button2
           
ControlHide($hGui ,"",$ResizeGUI_Button2)
           
GUICtrlSetState($TestControl,$GUI_HIDE)
           
GUICtrlSetState($TestControl2,$GUI_HIDE)
           
GUICtrlSetState($TestControl3,$GUI_HIDE)
           
ControlShow($hGui ,"",$ResizeGUI_Button)
           
WinMove($hGUI, "",
Default, Default,$Guiwidth, $Guiheight-150)
       
Case $GUI_EVENT_CLOSE
           
Exit
   
EndSwitch
WEnd


Единственное затруднение, которое может возникнуть, это угадать точное взаиморасположение кнопок опции, чтобы их местоположение визуально совпадало.

Creat0R 26-10-2009 21:52 1253235

Во-первых нужно не просто расширить окно, но ещё и поместить в него элементы, а для этого их сперва нужно создать (на этапе создания GUI).

Код:

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <GUIImageList.au3>
;

Global $hImageList, $sOld_Opt_GRM = Opt("GUIResizeMode", $GUI_DOCKALL)
Global $iGUI_Height = 150

$Form1 = GUICreate("Form1", 550, $iGUI_Height, 192, 124)

$Button1 = GUICtrlCreateButton("Опции >>", 440, 112, 105, 25, $WS_GROUP)
_GUICtrlButton_SetImageEx($hImageList, $Button1, @SystemDir & "\rasdlg.dll", 14)

#Region Expanded controls
GUICtrlCreateButton("Some Button", 20, 240, 80)
GUICtrlCreateButton("Other Button", 120, 240, 80)
GUICtrlCreateInput("Some Input", 20, 200, 200, 20)

Opt("GUIResizeMode", $sOld_Opt_GRM)
#EndRegion Expanded controls
;

GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()

    Switch $nMsg
        Case $Button1
            _Toggle_ExpandControls_Proc($Form1, $iGUI_Height, $iGUI_Height+150, $Button1, "Опции >>", "Опции <<")
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func _Toggle_ExpandControls_Proc($hWnd,$iInitWndHeight,$iExpndHeight,$iExpndCtrlID,$sExpndText="Expand",$sCntrctText="Contract")
    Local $iHeight, $sButtonText, $aSysCaptMetrics, $aSysBordMetrics

    Local Const $SM_CYCAPTION      = 4 ;Caption (Title) heigth
    Local Const $SM_CXFIXEDFRAME    = 7 ;Window border size

    $aSysCaptMetrics = DllCall('user32.dll', 'int', 'GetSystemMetrics', 'int', $SM_CYCAPTION)
    $aSysBordMetrics = DllCall('user32.dll', 'int', 'GetSystemMetrics', 'int', $SM_CXFIXEDFRAME)

    $aGuiPos = WinGetPos($hWnd)

    If $aGuiPos[3] > $iExpndHeight + $aSysCaptMetrics[0] Then
        _GUICtrlButton_SetImageEx($hImageList, $iExpndCtrlID, @SystemDir & "\rasdlg.dll", 14)

        $iHeight = $iInitWndHeight + $aSysCaptMetrics[0] + ($aSysBordMetrics[0] * 2)
        $sButtonText = $sExpndText
    Else
        _GUICtrlButton_SetImageEx($hImageList, $iExpndCtrlID, @SystemDir & "\rasdlg.dll", 16)

        $iHeight = $iExpndHeight + $aSysCaptMetrics[0] + ($aSysBordMetrics[0] * 2)
        $sButtonText = $sCntrctText
    EndIf

    GUICtrlSetData($iExpndCtrlID, $sButtonText)
    WinMove($hWnd, "", $aGuiPos[0], $aGuiPos[1], $aGuiPos[2], $iHeight)
EndFunc

Func _GUICtrlButton_SetImageEx(ByRef $hImageList, $nCtrl, $sIconFile, $nIconID=0, $nAlign=-1)
    If $hImageList Then _GUIImageList_Destroy($hImageList)

    $hImageList = _GUIImageList_Create(16, 16, 5, 1)
    _GUIImageList_AddIcon($hImageList, $sIconFile, $nIconID)

    Local $stBIL = DllStructCreate("dword;int[4];uint")

    DllStructSetData($stBIL, 1, $hImageList)
    DllStructSetData($stBIL, 2, 1, 1)
    DllStructSetData($stBIL, 2, 1, 2)
    DllStructSetData($stBIL, 2, 1, 3)
    DllStructSetData($stBIL, 2, 1, 4)
    DllStructSetData($stBIL, 3, $nAlign)

    Return GUICtrlSendMsg($nCtrl, $BCM_SETIMAGELIST, 0, DllStructGetPtr($stBIL))
EndFunc


FlatX007 26-10-2009 22:34 1253262

Цитата:

Цитата Creat0R
Во-первых нужно не просто расширить окно, но ещё и поместить в него элементы »

... клёво спасибо давно искал но боялся спросить =)

evg64 31-10-2009 10:15 1257250

Да, действительно круто, спасибо!

FlatX007 10-03-2010 09:54 1365044

Цитата:

Цитата Creat0R
Во-первых нужно не просто расширить окно, но ещё и поместить в него элементы, а для этого их сперва нужно создать (на этапе создания GUI). »

А как с помощью этой функции поменять ширину окна ? :search:

beve 15-03-2010 21:19 1369444

Цитата:

Цитата FlatX007
А как с помощью этой функции поменять ширину окна ? »

Код:

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <GUIImageList.au3>
;

Global $hImageList, $sOld_Opt_GRM = Opt("GUIResizeMode", $GUI_DOCKALL)
Global $iGUI_Width = 385
Global $iGUI_Height = 162


$Form1 = GUICreate("Form", $iGUI_Width, $iGUI_Height, 192, 186)
$Button1 = GUICtrlCreateButton(">", 370, 0, 15, 160, $WS_GROUP)

#Region Expanded controls
$ExitButton = GUICtrlCreateButton("Exit", 470, 130, 75, 25, $WS_GROUP)
GUICtrlCreateInput("Some Input", 405, 20, 121, 21)

Opt("GUIResizeMode", $sOld_Opt_GRM)
#EndRegion Expanded controls
;
GUISetState(@SW_SHOW)

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $Button1
                        _Toggle_ExpandControls_Proc($Form1, $iGUI_Width, $iGUI_Width+165, $Button1, ">", "<")
                Case $GUI_EVENT_CLOSE, $ExitButton
                        Exit
        EndSwitch
WEnd

Func _Toggle_ExpandControls_Proc($hWnd,$iInitWndWidth,$iExpndWidth,$iExpndCtrlID,$sExpndText="<",$sCntrctText=">")
    Local $iWidth, $sButtonText, $aSysCaptMetrics, $aSysBordMetrics

    Local Const $SM_CXFIXEDFRAME    = 7 ;Window border size

    $aSysBordMetrics = DllCall('user32.dll', 'int', 'GetSystemMetrics', 'int', $SM_CXFIXEDFRAME)

    $aGuiPos = WinGetPos($hWnd)

    If $aGuiPos[2] > $iExpndWidth Then

        $iWidth = $iInitWndWidth + ($aSysBordMetrics[0] * 2)
        $sButtonText = $sExpndText
    Else
        $iWidth= $iExpndWidth + ($aSysBordMetrics[0] * 2)
        $sButtonText = $sCntrctText
    EndIf

    GUICtrlSetData($iExpndCtrlID, $sButtonText)
    WinMove($hWnd, "", $aGuiPos[0], $aGuiPos[1], $iWidth, $aGuiPos[3])
EndFunc



Время: 02:17.

Время: 02:17.
© OSzone.net 2001-