Что нового

Окна, Диалоги Задать максимальный размер для GUI окна

TpeTTep

Новичок
Сообщения
45
Репутация
1
Доброго времени суток. Нужна ваша помощь. Есть GUI окно, это окно постепенно наполняется элементами. Сами элементы достаточно большие, соответственно при достижении определённого количества таких элементов форма растягивается до такой степени, что перестаёт полностью помещаться на экран. Единственное что пришло в голову, так это при достижении определённого количества элементов просто добавить Scroll Bar на форму, вот только я не знаю как сделать так, что форма увеличивала свои размеры за счёт этого самого Scroll Bar'a. Т.е мне нужно увеличить размер GUI окна, что бы поместить туда новые элементы, но спрятать их за Scroll Bar. Надеюсь понятно объяснил) Ниже привожу пример подобного рода.
Код:
Opt("GUIResizeMode", 802)

#include <array.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

HotKeySet("{F8}", "_Exit")

Global $aArray[15], $iCoord = 8

$Form1 = GUICreate("Form1", 596, 8, -1, -1)
GUISetBkColor(0x191919)

For $i = 0 To UBound($aArray)-1
   $aPos = WinGetPos($Form1)
   WinMove($Form1, "", @DesktopWidth/2-$aPos[2]/2, @DesktopHeight/2-($aPos[3]+102)/2, $aPos[2], $aPos[3] + 102)
   $aArray[$i] = GUICtrlCreateLabel("Элемент "&$i+1, 8, $iCoord, 579, 94, BitOR($SS_CENTER,$SS_CENTERIMAGE,$WS_BORDER))
   GUICtrlSetFont(-1, 14, 400, 0, "MS Sans Serif")
   GUICtrlSetColor(-1, 0xFFFFFF)
   GUICtrlSetBkColor(-1, 0x120F0A)
   $iCoord+=102
Next
GUISetState(@SW_SHOW)

While 1
   $nMsg = GUIGetMsg()
   Switch $nMsg
      Case $GUI_EVENT_CLOSE
         Exit

   EndSwitch
WEnd

Func _Exit()
   Exit
EndFunc
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Код не мой, нашел на форуме и чуть адаптировал под Ваш пример:
Код:
Opt("GUIResizeMode", 802)

#include <array.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GUIScrollBars.au3>
#include <ScrollBarConstants.au3>

HotKeySet("{F8}", "_Exit")

Global $aArray[15], $iCoord = 8

$Form1 = GUICreate("Form1", 596, 8, -1, -1)
GUISetBkColor(0x191919)
$iDummyUP = GUICtrlCreateDummy()
$iDummyDOWN = GUICtrlCreateDummy()


For $i = 0 To UBound($aArray) - 1
    $aPos = WinGetPos($Form1)

    If $aPos[3] + 102 > @DesktopHeight - 50 Then
        $Hight = @DesktopHeight - 50
    Else
        $Hight = $aPos[3] + 102
    EndIf

    If @DesktopHeight / 2 - ($aPos[3] + 102) / 2 < 0 Then
        $PozY = 0
    Else
        $PozY = @DesktopHeight / 2 - ($aPos[3] + 102) / 2
    EndIf


    WinMove($Form1, "", @DesktopWidth / 2 - $aPos[2] / 2, $PozY, $aPos[2], $Hight)
    $aArray[$i] = GUICtrlCreateLabel("Элемент " & $i + 1, 8, $iCoord, 579, 94, BitOR($SS_CENTER, $SS_CENTERIMAGE, $WS_BORDER))
    GUICtrlSetFont(-1, 14, 400, 0, "MS Sans Serif")
    GUICtrlSetColor(-1, 0xFFFFFF)
    GUICtrlSetBkColor(-1, 0x120F0A)
    $iCoord += 102
Next

GUISwitch($Form1)
GUIRegisterMsg($WM_VSCROLL, "WM_VSCROLL")
GUIRegisterMsg($WM_MOUSEWHEEL, "WM_MOUSEWHEEL")

GUISetState()
_GUIScrollBars_Init($Form1, 0, 300)
_GUIScrollBars_SetScrollInfoPage($Form1, $SB_VERT, 17)

GUISetState(@SW_SHOW)


While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $iDummyUP
            WM_VSCROLL($Form1, $WM_VSCROLL, 0, 0)
        Case $iDummyDOWN
            WM_VSCROLL($Form1, $WM_VSCROLL, 1, 0)
    EndSwitch
WEnd

Func _Exit()
    Exit
EndFunc   ;==>_Exit

Func WM_MOUSEWHEEL($hWnd, $Msg, $wParam, $lParam)
    #forceref $Msg, $wParam, $lParam
    If $hWnd = $Form1 Then
        Switch BitShift($wParam, 16)
            Case 120
                GUICtrlSendToDummy($iDummyUP)
            Case -120
                GUICtrlSendToDummy($iDummyDOWN)
        EndSwitch
    EndIf
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_MOUSEWHEEL

Func WM_VSCROLL($hWnd, $Msg, $wParam, $lParam)
    #forceref $Msg, $wParam, $lParam
    Local $nPos, $yPos, $iTrackPos, $Page
    Local $nScrollCode = BitAND($wParam, 0x0000FFFF)
    Local $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_VERT)
    ; ---
    $yPos = DllStructGetData($tSCROLLINFO, "nPos")
    $iPage = DllStructGetData($tSCROLLINFO, "nPage")
    $iTrackPos = DllStructGetData($tSCROLLINFO, "nTrackPos")

    Switch $nScrollCode
        Case $SB_LINELEFT
            DllStructSetData($tSCROLLINFO, "nPos", $yPos - 1)

        Case $SB_LINERIGHT
            DllStructSetData($tSCROLLINFO, "nPos", $yPos + 1)

        Case $SB_PAGELEFT
            DllStructSetData($tSCROLLINFO, "nPos", $yPos - $iPage)

        Case $SB_PAGERIGHT
            DllStructSetData($tSCROLLINFO, "nPos", $yPos + $iPage)

        Case $SB_THUMBTRACK
            DllStructSetData($tSCROLLINFO, "nPos", $iTrackPos)
    EndSwitch
    DllStructSetData($tSCROLLINFO, "fMask", $SIF_POS)

    _GUIScrollBars_SetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)
    _GUIScrollBars_GetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)

    $nPos = DllStructGetData($tSCROLLINFO, "nPos")
    If ($nPos <> $yPos) Then _
            _GUIScrollBars_ScrollWindow($hWnd, 0, $iPage * ($yPos - $nPos))

    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_VSCROLL
 
Автор
T

TpeTTep

Новичок
Сообщения
45
Репутация
1
@ra4o, На самом деле даже странно, что в Autoit не предусмотрена такая обыденная функция. Будет сложно интегрировать ваш пример, но за неимением альтернатив придётся разбираться. В любом случае спасибо, сам я решение так и не нашел.
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Будет сложно интегрировать ваш пример
Просто добавьте
Код:
GUIRegisterMsg($WM_VSCROLL, "WM_VSCROLL")
GUIRegisterMsg($WM_MOUSEWHEEL, "WM_MOUSEWHEEL")

и соответствующие функции , плюс что-бы прокрутка работала от колёсика мышки , а не только стрелками в начале скрипта допишите
Код:
$iDummyUP =GUICtrlCreateDummy()
$iDummyDOWN = GUICtrlCreateDummy()

и в цикл допишите
Код:
Case $SB_PAGERIGHT
            DllStructSetData($tSCROLLINFO, "nPos", $yPos + $iPage)

        Case $SB_THUMBTRACK
            DllStructSetData($tSCROLLINFO, "nPos", $iTrackPos)

вот и вся интеграция.
 
Автор
T

TpeTTep

Новичок
Сообщения
45
Репутация
1
Повезло найти более простое решение. Помогла библиотека GUIScrollBars_Ex. Ниже привожу рабочий пример, может кому-нибудь поможет.
Код:
Opt("GUIResizeMode", 802)

#include <array.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

#include <GUIScrollBars_Ex.au3>

HotKeySet("{F8}", "_Exit")

Global $aArray[15], $iCoord = 8

$Form1 = GUICreate("Form1", 596, 8, -1, -1)
GUISetBkColor(0x191919)

For $i = 0 To UBound($aArray)-1
   If $i < 8 Then
      $aPos = WinGetPos($Form1)
      WinMove($Form1, "", @DesktopWidth/2-$aPos[2]/2, @DesktopHeight/2-($aPos[3]+102)/2, $aPos[2], $aPos[3] + 102)
   Endif
   $aArray[$i] = GUICtrlCreateLabel("Элемент "&$i+1, 8, $iCoord, 579, 94, BitOR($SS_CENTER,$SS_CENTERIMAGE,$WS_BORDER))
   GUICtrlSetFont(-1, 14, 400, 0, "MS Sans Serif")
   GUICtrlSetColor(-1, 0xFFFFFF)
   GUICtrlSetBkColor(-1, 0x120F0A)
   $iCoord+=102
Next

_GUIScrollBars_Generate($Form1, 0, UBound($aArray)*102)

GUISetState(@SW_SHOW)

While 1
   $nMsg = GUIGetMsg()
   Switch $nMsg
      Case $GUI_EVENT_CLOSE
         Exit

   EndSwitch
WEnd

Func _Exit()
   Exit
EndFunc
 
Верх