Hi,
ich habe 2 Fragen zu Scrollbalken.
Ich würde es gerne so einstellen, dass alle Controls im scrollbaren Bereich liegen.
Bei der folgenden Beispiel muss ich "
angeben. Jedoch musste ich die Zahl 63 ausprobieren. Gibt es hier eine logische Erklärung für diesen Wert?
Ist es möglich innerhalb der GUI zu scrollen?
Spoiler anzeigen
AutoIt
#Region ;************ Includes ************
#include <GUIConstantsEx.au3>
#include <GuiScrollBars.au3>
#include <WindowsConstants.au3>
#EndRegion ;************ Includes ************
Local $hGuiMsg, $hGui
$hGui = GUICreate("ScrollBar: Beispiel", 400, 400, -1, -1) ;, BitOR($WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_SYSMENU, $WS_SIZEBOX))
For $i = 1 To 20
GUICtrlCreateButton("Test" & $i, 10, 10 + 50 * $i)
ConsoleWrite(10 + 50 * $i & @CRLF)
Next
GUISetState(@SW_SHOW)
GUIRegisterMsg($WM_SIZE, "WM_SIZE") ; Fenstergröße ändern
GUIRegisterMsg($WM_VSCROLL, "WM_VSCROLL") ; Vertikales Scrollen
_GUIScrollBars_Init($hGui, 1, 63) ;<<< warum gerade 63???
_GUIScrollBars_EnableScrollBar($hGui, $SB_VERT)
While 1
$hGuiMsg = GUIGetMsg()
Switch $hGuiMsg
Case $GUI_EVENT_CLOSE ;, $nExititem
ExitLoop
EndSwitch
WEnd
; Fenstergröße wurde geändert
Func WM_SIZE($hWnd, $iMsg, $wParam, $lParam)
#forceref $iMsg, $wParam
Local $iIndex = -1, $iCharY, $iCharX, $iClientXMax, $iClientX, $iClientY, $ivMax
For $x = 0 To UBound($__g_aSB_WindowInfo) - 1
If $__g_aSB_WindowInfo[$x][0] = $hWnd Then
$iIndex = $x
$iClientXMax = $__g_aSB_WindowInfo[$iIndex][1]
$iCharX = $__g_aSB_WindowInfo[$iIndex][2]
$iCharY = $__g_aSB_WindowInfo[$iIndex][3]
$ivMax = $__g_aSB_WindowInfo[$iIndex][7]
ExitLoop
EndIf
Next
If $iIndex = -1 Then Return 0
Local $tSCROLLINFO = DllStructCreate($tagSCROLLINFO)
; Ermittelt die Abmessungen der Arbeitsfläche.
$iClientX = BitAND($lParam, 0x0000FFFF)
$iClientY = BitShift($lParam, 16)
$__g_aSB_WindowInfo[$iIndex][4] = $iClientX
$__g_aSB_WindowInfo[$iIndex][5] = $iClientY
; Setzt den vertikalen Scrollbereich und die Seitengröße
DllStructSetData($tSCROLLINFO, "fMask", BitOR($SIF_RANGE, $SIF_PAGE))
DllStructSetData($tSCROLLINFO, "nMin", 0)
DllStructSetData($tSCROLLINFO, "nMax", $ivMax)
DllStructSetData($tSCROLLINFO, "nPage", $iClientY / $iCharY)
_GUIScrollBars_SetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)
; Setzt den horizontalen Scrollbereich und die Seitengröße
DllStructSetData($tSCROLLINFO, "fMask", BitOR($SIF_RANGE, $SIF_PAGE))
DllStructSetData($tSCROLLINFO, "nMin", 0)
DllStructSetData($tSCROLLINFO, "nMax", 2 + $iClientXMax / $iCharX)
DllStructSetData($tSCROLLINFO, "nPage", $iClientX / $iCharX)
_GUIScrollBars_SetScrollInfo($hWnd, $SB_HORZ, $tSCROLLINFO)
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_SIZE
; Horizontales Scrollen
Func WM_HSCROLL($hWnd, $iMsg, $wParam, $lParam)
#forceref $iMsg, $lParam
Local $iScrollCode = BitAND($wParam, 0x0000FFFF)
Local $iIndex = -1, $iCharX, $iPosX
Local $iMin, $iMax, $iPage, $iPos, $iTrackPos
For $x = 0 To UBound($__g_aSB_WindowInfo) - 1
If $__g_aSB_WindowInfo[$x][0] = $hWnd Then
$iIndex = $x
$iCharX = $__g_aSB_WindowInfo[$iIndex][2]
ExitLoop
EndIf
Next
If $iIndex = -1 Then Return 0
; Ermittelt alle Informationen der horizontalen Scrollbar
Local $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_HORZ)
$iMin = DllStructGetData($tSCROLLINFO, "nMin")
$iMax = DllStructGetData($tSCROLLINFO, "nMax")
$iPage = DllStructGetData($tSCROLLINFO, "nPage")
$iPosX = DllStructGetData($tSCROLLINFO, "nPos")
$iTrackPos = DllStructGetData($tSCROLLINFO, "nTrackPos")
; Speichert die x-Position für einen späteren Vergleich
$iPos = $iPosX
#forceref $iMin, $iMax
; Auswertung der vom System gemeldeten Scroll-Nachricht
Switch $iScrollCode
Case $SB_LINELEFT ; Der Anwender klickte auf den linken Pfeil
DllStructSetData($tSCROLLINFO, "nPos", $iPos - 1)
Case $SB_LINERIGHT ; Der Anwender klickte auf den rechten Pfeil
DllStructSetData($tSCROLLINFO, "nPos", $iPos + 1)
Case $SB_PAGELEFT ; Der Anwender klickte links neben dem Scrollbalken
DllStructSetData($tSCROLLINFO, "nPos", $iPos - $iPage)
Case $SB_PAGERIGHT ; Der Anwender klickte rechts neben dem Scrollbalken
DllStructSetData($tSCROLLINFO, "nPos", $iPos + $iPage)
Case $SB_THUMBTRACK ; Der Anwender zog den Scrollbalken
DllStructSetData($tSCROLLINFO, "nPos", $iTrackPos)
EndSwitch
;~ // Setzt die neue Position und ermittelt sie danach erneut.
;~ // Abhängig von den Windows-Einstellungen kann es sein, dass die gelesenen Werte nicht die gleichen sind, wie die vorher gesetzten.
DllStructSetData($tSCROLLINFO, "fMask", $SIF_POS)
_GUIScrollBars_SetScrollInfo($hWnd, $SB_HORZ, $tSCROLLINFO)
_GUIScrollBars_GetScrollInfo($hWnd, $SB_HORZ, $tSCROLLINFO)
; // Falls sich die x-Position der Scrollbar geändert hat, den Fensterbereich verschieben und aktualisieren
$iPos = DllStructGetData($tSCROLLINFO, "nPos")
If ($iPos <> $iPosX) Then _GUIScrollBars_ScrollWindow($hWnd, $iCharX * ($iPosX - $iPos), 0)
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_HSCROLL
; Vertikales Scrollen
Func WM_VSCROLL($hWnd, $iMsg, $wParam, $lParam)
#forceref $iMsg, $wParam, $lParam
Local $iScrollCode = BitAND($wParam, 0x0000FFFF)
Local $iIndex = -1, $iCharY, $iPosY
Local $iMin, $iMax, $iPage, $iPos, $iTrackPos
For $x = 0 To UBound($__g_aSB_WindowInfo) - 1
If $__g_aSB_WindowInfo[$x][0] = $hWnd Then
$iIndex = $x
$iCharY = $__g_aSB_WindowInfo[$iIndex][3]
ExitLoop
EndIf
Next
If $iIndex = -1 Then Return 0
; Ermittelt alle Informationen der vertikalen Scrollbar
Local $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_VERT)
$iMin = DllStructGetData($tSCROLLINFO, "nMin")
$iMax = DllStructGetData($tSCROLLINFO, "nMax")
$iPage = DllStructGetData($tSCROLLINFO, "nPage")
$iPosY = DllStructGetData($tSCROLLINFO, "nPos")
$iTrackPos = DllStructGetData($tSCROLLINFO, "nTrackPos")
; Speichert die y-Position für einen späteren Vergleich
$iPos = $iPosY
; Auswertung der vom System gemeldeten Scroll-Nachricht
Switch $iScrollCode
Case $SB_TOP ; Der Anwender klickte auf die "Pos1"-Taste
DllStructSetData($tSCROLLINFO, "nPos", $iMin)
Case $SB_BOTTOM ; Der Anwender klickte auf die "Ende"-Taste
DllStructSetData($tSCROLLINFO, "nPos", $iMax)
Case $SB_LINEUP ; Der Anwender klickte auf den oberen Pfeil
DllStructSetData($tSCROLLINFO, "nPos", $iPos - 1)
Case $SB_LINEDOWN ; Der Anwender klickte auf den unteren Pfeil
DllStructSetData($tSCROLLINFO, "nPos", $iPos + 1)
Case $SB_PAGEUP ; Der Anwender klickte oberhalb des Scrollbalkens
DllStructSetData($tSCROLLINFO, "nPos", $iPos - $iPage)
Case $SB_PAGEDOWN ; Der Anwender klickte unterhalb des Scrollbalkens
DllStructSetData($tSCROLLINFO, "nPos", $iPos + $iPage)
Case $SB_THUMBTRACK ; Der Anwender zog den Scrollbalken
DllStructSetData($tSCROLLINFO, "nPos", $iTrackPos)
EndSwitch
;~ // Setzt die neue Position und ermittelt sie danach erneut.
;~ // Abhängig von den Windows-Einstellungen kann es sein, dass die gelesenen Werte nicht die gleichen sind, wie die vorher gesetzten.
DllStructSetData($tSCROLLINFO, "fMask", $SIF_POS)
_GUIScrollBars_SetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)
_GUIScrollBars_GetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)
; // Falls sich die y-Position der Scrollbar geändert hat, den Fensterbereich verschieben und aktualisieren
$iPos = DllStructGetData($tSCROLLINFO, "nPos")
If ($iPos <> $iPosY) Then
_GUIScrollBars_ScrollWindow($hWnd, 0, $iCharY * ($iPosY - $iPos))
$iPosY = $iPos
EndIf
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_VSCROLL
Alles anzeigen