scrollbare GUI

  • Moin zusammen,

    Hab da mal wieder was, wo ich nicht selber hinter komme :cursing:

    folgendes Script :

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    #include <File.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <FileEx.au3>
    #include <GUIScrollBars.au3>
    #include <ScrollBarConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $aPics_Viewer
    #Region ### START Koda GUI section ### Form=
    $Viewer = GUICreate("Viewer", 1017, 769, 192, 124, BitOR($WS_SYSMENU, $WS_VSCROLL))
    $Pic1 = GUICtrlCreatePic("", 16, 16, 185, 193)
    $Pic2 = GUICtrlCreatePic("", 216, 16, 185, 193)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    [/autoit] [autoit][/autoit] [autoit]

    _GUIScrollBars_Init($Viewer)

    [/autoit] [autoit][/autoit] [autoit]

    $aPics_Viewer = liste($aPics_Viewer)
    GUIRegisterMsg($WM_VSCROLL, "WM_VSCROLL")
    While 1

    [/autoit] [autoit][/autoit] [autoit]

    $nMsg = GUIGetMsg()

    [/autoit] [autoit][/autoit] [autoit]

    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $GUI_EVENT_PRIMARYDOWN
    $Pos = GetPos()
    If $Pos >= 5 Then
    ShellExecute($aPics_Viewer[$Pos - 5])
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func GetPos()
    Local $a
    $a = GUIGetCursorInfo()
    Return $a[4]
    EndFunc ;==>GetPos

    [/autoit] [autoit][/autoit] [autoit]

    Func liste($aPics_Viewer)
    Local $aPics = _FileListTreeToArray(@ScriptDir & "\Pflanzen DB\pics\")
    Local $left = 16
    Local $top = 16
    Local $width = 185
    Local $height = 193
    Local $nr = 0
    Dim $aPics_Viewer[UBound($aPics) - 1]
    _deleteBlanks($aPics)
    ;~ _ArrayDisplay($aPics)
    For $i = 1 To UBound($aPics) - 1
    GUICtrlCreatePic($aPics[$i], $left, $top, $width, $height)
    $aPics_Viewer[$i] = $aPics[$i]
    $left = $left + 200
    $nr = $nr + 1
    If $nr = 5 Then
    $top = $top + 208
    $left = 16
    $nr = 0

    [/autoit] [autoit][/autoit] [autoit]

    EndIf
    Next
    _deleteBlanks($aPics_Viewer)
    MsgBox(0,"","Liste fertig. Es wurden " & UBound($aPics) - 1 & " Bilder erstellt")
    Return $aPics_Viewer
    EndFunc ;==>liste

    [/autoit] [autoit][/autoit] [autoit]

    Func _deleteBlanks(ByRef $array)
    If IsArray($array) < 1 Then Return 0

    [/autoit] [autoit][/autoit] [autoit]

    $bound = UBound($array) - 1
    Local $i = 0
    Local $isZeroIndex = 0

    [/autoit] [autoit][/autoit] [autoit]

    If $array[0] = $bound Then
    $isZeroIndex = 1
    $i = 1
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    While $i <= $bound
    If $array[$i] = "" Or StringIsSpace($array[$i]) > 0 Or Not StringInStr($array[$i], '.') Or StringInStr($array[$i], "blau.jpg") Or StringInStr($array[$i], "platzhalter.jpg") Or StringInStr($array[$i], "background.jpg") Then
    _ArrayDelete($array, $i)
    $bound = $bound - 1
    If $isZeroIndex > 0 Then $array[0] = $array[0] - 1
    Else
    $i = $i + 1
    EndIf
    WEnd
    EndFunc ;==>_deleteBlanks

    [/autoit] [autoit][/autoit] [autoit]

    Func WM_VSCROLL($hWnd, $Msg, $wParam, $lParam)
    #forceref $Msg, $wParam, $lParam
    Local $nScrollCode = BitAND($wParam, 0x0000FFFF)
    Local $index = -1, $yChar, $yPos
    Local $Min, $Max, $Page, $Pos, $TrackPos

    [/autoit] [autoit][/autoit] [autoit]

    For $x = 0 To UBound($aSB_WindowInfo) - 1
    If $aSB_WindowInfo[$x][0] = $hWnd Then
    $index = $x
    $yChar = $aSB_WindowInfo[$index][3]
    ExitLoop
    EndIf
    Next
    If $index = -1 Then Return 0

    [/autoit] [autoit][/autoit] [autoit]

    ; Ermittelt alle Informationen der vertikalen Scrollbar
    Local $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_VERT)
    $Min = DllStructGetData($tSCROLLINFO, "nMin")
    $Max = DllStructGetData($tSCROLLINFO, "nMax")
    $Page = DllStructGetData($tSCROLLINFO, "nPage")
    $yPos = DllStructGetData($tSCROLLINFO, "nPos")
    $TrackPos = DllStructGetData($tSCROLLINFO, "nTrackPos")
    ; Speichert die y-Position für einen späteren Vergleich
    $Pos = $yPos

    [/autoit] [autoit][/autoit] [autoit]

    ; Auswertung der vom System gemeldeten Scroll-Nachricht
    Switch $nScrollCode
    Case $SB_TOP ; Der Anwender klickte auf die "Pos1"-Taste
    DllStructSetData($tSCROLLINFO, "nPos", $Min)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_BOTTOM ; Der Anwender klickte auf die "Ende"-Taste
    DllStructSetData($tSCROLLINFO, "nPos", $Max)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_LINEUP ; Der Anwender klickte auf den oberen Pfeil
    DllStructSetData($tSCROLLINFO, "nPos", $Pos - 1)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_LINEDOWN ; Der Anwender klickte auf den unteren Pfeil
    DllStructSetData($tSCROLLINFO, "nPos", $Pos + 1)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_PAGEUP ; Der Anwender klickte oberhalb des Scrollbalkens
    DllStructSetData($tSCROLLINFO, "nPos", $Pos - $Page)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_PAGEDOWN ; Der Anwender klickte unterhalb des Scrollbalkens
    DllStructSetData($tSCROLLINFO, "nPos", $Pos + $Page)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_THUMBTRACK ; Der Anwender zog den Scrollbalken
    DllStructSetData($tSCROLLINFO, "nPos", $TrackPos)
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    ;~ // 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.

    [/autoit] [autoit][/autoit] [autoit]

    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
    $Pos = DllStructGetData($tSCROLLINFO, "nPos")
    If ($Pos <> $yPos) Then
    _GUIScrollBars_ScrollWindow($hWnd, 0, $yChar * ($yPos - $Pos))
    $yPos = $Pos
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Return $GUI_RUNDEFMSG

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>WM_VSCROLL

    [/autoit]

    Es werden ca. 45 Bilder erstellt. Das klappt auch, nur reicht mein Scrollbereich nicht, da er ungefähr nur doppelte GUI Höhe beträgt. wo kann man das einstellen. Forste im Moment die GUIScrollBars.au3 durch und versuch die zu verstehen.
    Ist mein erster Versuch in der Richtung. Wer also Tips hat immer her damit :)

    Einmal editiert, zuletzt von MrB (8. Mai 2010 um 21:05)