- Сообщения
- 5,379
- Репутация
- 2,724
Данный способ прокрутки заключается в том, что прокручивается целое окно со всеми его элементами, а не каждый элемент отдельно. Представленный пример я специально усложнил, чтобы показать, что окно прокрутки не привязано к основному окну. Таким образом его можно разместить, например, на вкладке. $Graphic здесь нужен только для отрисовки рамки вокруг окна прокрутки.
Код:
#Include <GUIConstants.au3>
#Include <WindowsConstants.au3>
#Include <GUIScrollBars.au3>
#Include <WinAPI.au3>
Global $hSB[2], $Graphic[4], $tSI
$hForm = GUICreate('MyGUI', 400, 400)
$Graphic[0] = GUICtrlCreateGraphic(19, 19, 362, 1)
$Graphic[1] = GUICtrlCreateGraphic(19, 380, 362, 1)
$Graphic[2] = GUICtrlCreateGraphic(19, 20, 1, 360)
$Graphic[3] = GUICtrlCreateGraphic(380, 20, 1, 360)
For $i = 0 To 3
GUICtrlSetState($Graphic[$i], $GUI_DISABLE)
GUICtrlSetBkColor($Graphic[$i], 0xA0A0A0)
Next
$hSB[0] = GUICreate('', 360, 360, 20, 20, BitOR($WS_CHILD, $WS_VSCROLL), 0, $hForm)
$hSB[1] = GUICreate('', 360, 2795, 0, 0, $WS_CHILD, 0, $hSB[0])
GUISetBkColor(0xFFFFFF)
For $i = 1 To 99
GUICtrlCreateButton(StringFormat('%02s', $i), 14, 14 + 28 * ($i - 1), 80, 23)
GUICtrlCreateInput('', 100, 15 + 28 * ($i - 1), 208, 21)
GUICtrlCreateCheckbox('', 315, 19 + 28 * ($i - 1), 13, 13)
Next
$tSI = DllStructCreate($tagSCROLLINFO)
;~$tSI.fMask = BitOR($SIF_DISABLENOSCROLL, $SIF_PAGE, $SIF_RANGE)
$tSI.fMask = BitOR(0x0008, $SIF_PAGE, $SIF_RANGE)
$tSI.nPage =_WinAPI_GetClientHeight($hSB[0]) + 1
$tSI.nMin = 0
$tSI.nMax =_WinAPI_GetClientHeight($hSB[1])
_GUIScrollBars_SetScrollInfo($hSB[0], $SB_VERT, $tSI, 0)
For $i = 0 To 1
GUISetState(@SW_SHOWNOACTIVATE, $hSB[$i])
Next
GUISwitch($hForm)
GUIRegisterMsg($WM_VSCROLL, 'WM_VSCROLL')
GUISetState()
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
Func WM_VSCROLL($hWnd, $iMsg, $wParam, $lParam)
Switch $hWnd
Case $hSB[0]
Local $nSB = BitAND($wParam, 0x0000FFFF)
Local $tSI =_GUIScrollBars_GetScrollInfoEx($hSB[0], $SB_VERT)
Local $iPH = $tSI.nPos
Switch $nSB
Case $SB_LINEUP
$tSI.nPos -= 10
Case $SB_LINEDOWN
$tSI.nPos += 10
Case $SB_PAGEUP
$tSI.nPos -= $tSI.nPage
Case $SB_PAGEDOWN
$tSI.nPos += $tSI.nPage
Case $SB_THUMBTRACK
$tSI.nPos = $tSI.nTrackPos
EndSwitch
If $tSI.nPos < 0 Then
$tSI.nPos = 0
EndIf
If $tSI.nPos > $tSI.nMax - $tSI.nPage + 1 Then
$tSI.nPos = $tSI.nMax - $tSI.nPage + 1
EndIf
_GUIScrollBars_ScrollWindow($hSB[1], 0, $iPH - $tSI.nPos)
$tSI.fMask = $SIF_POS
_GUIScrollBars_SetScrollInfo($hSB[0], $SB_VERT, $tSI)
Case Else
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_VSCROLL