Что нового

Создание ScrollBar в виде отдельного дочернего окна

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
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
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
если навести указатель AutoIt Window Info на окно из примера, то он вешается. или только у меня так? с остальными окнами AutoIt Window Info работает нормально
 

gloss

Ленивое кодило
Сообщения
155
Репутация
5
joiner [?]
если навести указатель AutoIt Window Info на окно из примера, то он вешается. или только у меня так? с остальными окнами AutoIt Window Info работает нормально
Подтверждаю :smile:
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
А Control Viewer работает как часы.
 
Верх