Что нового

[Элементы GUI] Вертикальная прокрутка формы

vitaliy4us

Новичок
Сообщения
158
Репутация
4
Как осуществить вертикальную прокрутку формы, если на ней имеется несколько элементов управления Edit, часть из которых выходит за пределы экрана? Добавление полосы вертикальной прокрутки $WS_VSCROLL не позволяет сделать это.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
См. пример к функции
Код:
_GUIScrollBars_Init
 
Автор
V

vitaliy4us

Новичок
Сообщения
158
Репутация
4
Не получается. Более того, после добавления _GUIScrollBars_Init($Form1) исчезает вертикальная полоса прокрутки
 
Автор
V

vitaliy4us

Новичок
Сообщения
158
Репутация
4
Форма предназначена для вывода информации из базы данных в ее поля Edit. Количество этих полей в одной строке составляет 4, а количество строк (и, соответственно общее количество полей Edit) может быть разным. Иногда все они не помещаются на экране. Тут и возникает необходимость прокрутки. Вот скрипт для создания GUI:
Код:
;=================== GUI start ===============================================
$Form1 = GUICreate("Form1", 850, 820, 192, 4, BitOR($WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_SYSMENU, $WS_VSCROLL))
$Label1 = GUICtrlCreateLabel("Test case Id", 8, 10, 75, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
$Input1 = GUICtrlCreateInput("", 90, 6, 50, 21)
$Label2 = GUICtrlCreateLabel("Date of creation", 156, 10, 96, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
$Input2 = GUICtrlCreateInput("", 260, 6, 70, 21)
$Label3 = GUICtrlCreateLabel("Priority", 345, 10, 43, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
$Input3 = GUICtrlCreateInput("", 399, 6, 20, 21)
$Label4 = GUICtrlCreateLabel("Test name", 9, 34, 63, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
$Input4 = GUICtrlCreateInput("", 90, 30, 720, 21)
$Label5 = GUICtrlCreateLabel("Test function", 8, 58, 79, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
$Input5 = GUICtrlCreateInput("", 90, 54, 720, 21)

$Label6 = GUICtrlCreateLabel("Num", 8, 90, 79, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
$Label7 = GUICtrlCreateLabel("Action", 190, 90, 80, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
$Label8 = GUICtrlCreateLabel("Expected result", 500, 90, 120, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
$Label8 = GUICtrlCreateLabel("Actual result", 740, 90, 120, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")


;Preconditions
$Label10 = GUICtrlCreateLabel("Preconditions", 350, 105, 79, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
Dim $preconditions [$PreconditionRows+1][5]
$x = 8
$y = 125
$width = 0
$height = 50
$margin = 3
For $i = 1 to $PreconditionRows
	For $j=1 to 4
			Switch $j
		Case 1
			$width = 20
		Case 2
			$width = 360
		Case 3
			$width = 360
		Case 4
			$width = 50
	EndSwitch
		$preconditions[$i][$j] = GUICtrlCreateEdit("", $x, $y, $width, $height, $WS_VSCROLL)
		GUICtrlSetData(-1, "")
		$x = $x + $width + $margin
	Next
	$x=8
	$y=$y+$height + $margin
Next

;Test steps
$Label11 = GUICtrlCreateLabel("Test steps", 350, 125 + $width*$PreconditionRows + $margin*$PreconditionRows, 79, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
Dim $TestSteps [$TestStepsRows+1][5]
$x = 8
$y = 125 + 17 + $width*$PreconditionRows + $margin*$PreconditionRows
$width = 0
$height = 50
$margin = 3
For $i = 1 to $TestStepsRows
	For $j=1 to 4
			Switch $j
		Case 1
			$width = 20
		Case 2
			$width = 360
		Case 3
			$width = 360
		Case 4
			$width = 50
	EndSwitch
		$TestSteps[$i][$j] = GUICtrlCreateEdit("", $x, $y, $width, $height, $WS_VSCROLL)
		GUICtrlSetData(-1, "")
		$x = $x + $width + $margin
	Next
	$x=8
	$y=$y+$height + $margin
Next

;Postconditions
$Label12 = GUICtrlCreateLabel("Postconditions", 350, 125 + 17 + $width*$PreconditionRows + $margin*$TestStepsRows + $width*$TestStepsRows + 7 , 85, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
Dim $postconditions[5]
$x = 8
$y = 125 + 17 + $width*$PreconditionRows + $margin*$PreconditionRows + $width*$TestStepsRows + $margin*$TestStepsRows + 17
$width = 0
$height = 50
$margin = 3
For $j=1 to 4
			Switch $j
		Case 1
			$width = 20
		Case 2
			$width = 360
		Case 3
			$width = 360
		Case 4
			$width = 50
	EndSwitch
		$postconditions[$j] = GUICtrlCreateEdit("", $x, $y, $width, $height, $WS_VSCROLL)
		GUICtrlSetData(-1, "")
		$x = $x + $width + $margin
	Next

GUICtrlSetData(-1, "")

GUISetState(@SW_SHOW)

_GUIScrollBars_Init($Form1)

;=================== GUI finish ================================================
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
vitaliy4us
http://www.autoitscript.com/forum/topic/79684-scroll-udf-much-easier-than-the-guiscrollbars-udf
 

Mystick

Новичок
Сообщения
1
Репутация
0
Вот рабочий пример ! Искал по всему интернету... Делал под себя, максимально сократил, постарался удалить всё не нужное...

Код:
#include <GUIConstantsEx.au3>
 #include <WindowsConstants.au3>
 #include <GuiScrollBars.au3>
 #include <ScrollBarConstants.au3>
 #include <StructureConstants.au3>

Local $hGUI = GUICreate("ScrollTest", 800, 420, -1, -1, $GUI_SS_DEFAULT_GUI)

;--- Создаём некоторый текст, чтоб заполнить GUI -----
 For $i = 0 to 2480 Step 20
    GUICtrlCreateLabel("Some Text " & $i, 20, $i, 200, 20)
 Next

;----------- Параметры прокрутки -------------------------
    Local $tSCROLLINFO = DllStructCreate($tagSCROLLINFO)    ; создаёт структуру для работы, дополнительную инфу найдёте в справке по слову $tagSCROLLINFO

    Local $vStep = 20                                        ; Шаг прокрутки
   _GUIScrollBars_Init($hGUI, 0, 124 -1)                    ; 3-е значение - Высота скрола MAX (всего строк / шаг прокрутки )
   _GUIScrollBars_SetScrollInfoPage($hGUI, $SB_VERT, 20)    ; 3-е значение - размер страницы, шагов (строк на одной странице / шаг прокрутки)

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

; для вставки в свой скрипт обязательно копируем целиком этот кусок и функции WM_VSCROLL и WM_MOUSEWHEEL
; ---------------------------------------------------

GUISetState(@SW_SHOW)

While 1
    $nMsgX = GUIGetMsg()

    Switch $nMsgX
            Case $GUI_EVENT_CLOSE
                ExitLoop

    EndSwitch

WEnd

Func WM_VSCROLL($hWnd, $Msg, $wParam, $lParam)
    ToolTip(_GUIScrollBars_GetScrollInfoPos($hGUI, $SB_VERT))

    #forceref $Msg, $wParam, $lParam
    Local $nScrollCode = BitAND($wParam, 0x0000FFFF), $aSB_WindowInfo

    Local $Idx = -1, $yChar, $yPos, $nPos, $TrackPos, $Page

    Local $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_VERT)
    $yPos = DllStructGetData($tSCROLLINFO, "nPos")
    $Page = DllStructGetData($tSCROLLINFO, "nPage")
    $TrackPos = 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 - $Page)

        Case $SB_PAGERIGHT ; при нажатии на прокрутку под ползунком
            DllStructSetData($tSCROLLINFO, "nPos", $yPos + $Page)

        Case $SB_THUMBTRACK ; перетаскивание ползунка прокрутки
            DllStructSetData($tSCROLLINFO, "nPos", $TrackPos)
    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, $vStep* ($yPos - $nPos))
    EndIf

    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_VSCROLL

Func WM_MOUSEWHEEL($hWnd, $Msg, $wParam, $lParam)
    #forceref $Msg, $wParam, $lParam
    Local $nCode, $tSCROLLINFO, $yPos, $nScroll, $iStep = 1

    If $hWnd = $hGUI Then
        $nCode = BitShift($wParam, 16)
        $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hGUI, $SB_VERT)
            $yPos = DllStructGetData($tSCROLLINFO, "nPos")
        Switch $nCode
            Case 120
                $nScroll = $iStep
                WM_VSCROLL( $hGUI, $WM_VSCROLL, 0, 1 )
            Case -120
                $nScroll = -$iStep
                WM_VSCROLL( $hGUI, $WM_VSCROLL, 1, 1 )
        EndSwitch

        DllStructSetData($tSCROLLINFO, "nPos", $yPos - $nScroll)
        _GUIScrollBars_SetScrollInfo($hGUI, $SB_VERT, $tSCROLLINFO)
    EndIf
    Return $GUI_RUNDEFMSG
EndFunc


PS: И ваабще, почему такая простая функция не встроена в autoit !? приходится изобретать такие костыли ...
 
Верх