Moin zusammen,
Will mal eure Meinung hören. Und zwar möchte ich eine kleine Bilder-Galerie erstellen. Sind so zwischen 150-200 Bilder. Im Moment hab ich´s auf die Schnelle so gelöst:
Spoiler anzeigen
#include <Array.au3>
#include <FileEx.au3>
#include <GUIConstantsEx.au3>
#include <GuiScrollBars.au3>
#include <ScrollBarConstants.au3>
#include <WindowsConstants.au3>
$msg = MsgBox(4, "", "Möchtest du die Galerie jetzt erstellen ?")
[/autoit] [autoit][/autoit] [autoit]If $msg = 6 Then
#region ### START Koda GUI section ### Form=
$MainForm = GUICreate("Status", 1024, 768, Default, Default)
GUISetState(@SW_SHOW)
#endregion ### END Koda GUI section ###
_GUIScrollBars_Init($MainForm)
_GUIScrollBars_ShowScrollBar($MainForm, $SB_VERT, $ESB_DISABLE_BOTH)
galerie()
[/autoit] [autoit][/autoit] [autoit]GUIRegisterMsg($WM_VSCROLL, "WM_VSCROLL")
[/autoit] [autoit][/autoit] [autoit]While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
EndIf
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Func galerie()
[/autoit] [autoit][/autoit] [autoit]Local $aPics = _FileListTreeToArray(@ScriptDir & "\pics\")
Local $left = 16
Local $top = 38
Local $Width = 185
Local $Height = 185
Local $nr = 0
Local $count = 0
Local $top_label = 223
Local $height_label = 17
Local $scrollbar_height = 0
Dim $aPics_Viewer[UBound($aPics) - 1]
_deleteBlanks($aPics)
[/autoit] [autoit][/autoit] [autoit]For $i = 1 To UBound($aPics) - 1
GUICtrlCreatePic($aPics[$i], $left, $top, $Width, $Height)
$pfad = StringSplit($aPics[$i], "\")
$aPics_Viewer[$i] = $aPics[$i]
$left = $left + 193
$nr = $nr + 1
$count = $count + 1
If $nr = 5 Then
$top = $top + 223
$top_label = $top_label + 223
$left = 16
$scrollbar_height = $scrollbar_height + 240
$nr = 0
[/autoit] [autoit][/autoit] [autoit]If $scrollbar_height > 769 Then
$vert = _GUIScrollBars_GetScrollRange($MainForm, $SB_VERT)
_GUIScrollBars_SetScrollRange($MainForm, $SB_VERT, 0, ($vert[1] + 9.83))
EndIf
EndIf
Next
$nr = 0
$left = 16
$top_label = 223
For $i = 1 To UBound($aPics) - 1
$pfad = StringSplit($aPics[$i], "\")
GUICtrlCreateLabel("" & $pfad[UBound($pfad) - 3] & "\" & $pfad[UBound($pfad) - 2] & "\" & $pfad[UBound($pfad) - 1], $left, $top_label, $Width, $height_label)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetColor(-1, 0x0066CC)
$left = $left + 200
$nr = $nr + 1
If $nr = 5 Then
$top_label = $top_label + 223
$left = 16
$nr = 0
EndIf
Next
EndFunc ;==>galerie
[/autoit] [autoit][/autoit] [autoit]Func _deleteBlanks(ByRef $array)
If IsArray($array) < 1 Then Return 0
$bound = UBound($array) - 1
Local $i = 0
Local $isZeroIndex = 0
If $array[0] = $bound Then
$isZeroIndex = 1
$i = 1
EndIf
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
Func WM_VSCROLL($hWnd, $msg, $wParam, $lParam)
;~ ToolTip("Handle : " & $hWnd & " Msg : " & $Msg & "wParam : " & $wParam & "lParam : " & $lParam)
#forceref $Msg, $wParam, $lParam
Local $nScrollCode = BitAND($wParam, 0x0000FFFF)
Local $index = -1, $yChar, $yPos
Local $Min, $Max, $Page, $pos, $TrackPos
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
; 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
; Auswertung der vom System gemeldeten Scroll-Nachricht
Switch $nScrollCode
Case $SB_TOP ; Der Anwender klickte auf die "Pos1"-Taste
DllStructSetData($tSCROLLINFO, "nPos", $Min)
Case $SB_BOTTOM ; Der Anwender klickte auf die "Ende"-Taste
DllStructSetData($tSCROLLINFO, "nPos", $Max)
Case $SB_LINEUP ; Der Anwender klickte auf den oberen Pfeil
DllStructSetData($tSCROLLINFO, "nPos", $pos - 1)
Case $SB_LINEDOWN ; Der Anwender klickte auf den unteren Pfeil
DllStructSetData($tSCROLLINFO, "nPos", $pos + 1)
Case $SB_PAGEUP ; Der Anwender klickte oberhalb des Scrollbalkens
DllStructSetData($tSCROLLINFO, "nPos", $pos - $Page)
Case $SB_PAGEDOWN ; Der Anwender klickte unterhalb des Scrollbalkens
DllStructSetData($tSCROLLINFO, "nPos", $pos + $Page)
Case $SB_THUMBTRACK ; Der Anwender zog den Scrollbalken
DllStructSetData($tSCROLLINFO, "nPos", $TrackPos)
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
$pos = DllStructGetData($tSCROLLINFO, "nPos")
If ($pos <> $yPos) Then
_GUIScrollBars_ScrollWindow($hWnd, 0, $yChar * ($yPos - $pos))
$yPos = $pos
EndIf
Return $GUI_RUNDEFMSG
[/autoit] [autoit][/autoit] [autoit]EndFunc ;==>WM_VSCROLL
[/autoit]Schaut nicht so genau auf den Code. Muss ich nochmal drüber schauen.
Die Sache ist die, dass das Ganze doch recht viel Ressourcen braucht und ist, naja, nicht wirklich schön. Die Bilder sollen hinterher, wenn man mit LMT drauf klickt, vergrößert dargestellt werden. Im Moment mach ich´s mit GetPos() und grenze die Ids ein. Auch nur suboptimal.
Lange Rede kurzer Sinn, hat einer eine Idee wie man das besser lösen könnte?