Bilder-Galerie

  • 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
    [autoit]

    #include <Array.au3>
    #include <FileEx.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiScrollBars.au3>
    #include <ScrollBarConstants.au3>
    #include <WindowsConstants.au3>

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

    $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 ###

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

    _GUIScrollBars_Init($MainForm)
    _GUIScrollBars_ShowScrollBar($MainForm, $SB_VERT, $ESB_DISABLE_BOTH)

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

    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

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

    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]

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

    _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

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

    If $nr = 5 Then
    $top = $top + 223
    $top_label = $top_label + 223
    $left = 16
    $scrollbar_height = $scrollbar_height + 240

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

    $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

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

    $nr = 0
    $left = 16
    $top_label = 223

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

    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)

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

    $left = $left + 200
    $nr = $nr + 1

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

    If $nr = 5 Then
    $top_label = $top_label + 223
    $left = 16
    $nr = 0
    EndIf
    Next

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

    EndFunc ;==>galerie

    [/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)
    ;~ 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

    [/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]

    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?

    2 Mal editiert, zuletzt von MrB (24. Mai 2010 um 21:27)

  • Wär nett, wenn du den Code soweit reistellst, das man das ausführen kann...
    Mach(t) die Sache einfacher ^^

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

    Einmal editiert, zuletzt von Cartan12 (24. Mai 2010 um 21:16)

  • Bitte schön. Funtionierendes Beispiel (ohne Vergrößern) und im Spoiler oben editiert. Die Herren sonst noch einen Wunsch ;)

    P.S.: Bilder habt ihr ja selber genug oder ? .-)

  • Ja, ne Currywurst mit Pommes, Rot-Weiß und bitte einmal die FileEx.au3 ;)

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • [autoit]

    Dim $aPics_Viewer[UBound($aPics) - 1]

    [/autoit]

    Musst du erstmal durch

    [autoit]

    Dim $aPics_Viewer[UBound($aPics)]

    [/autoit]

    ersetzen, sonst bricht das Script beim letzten Bild mit einer Fehlermeldung ab.
    Am Rest arbeite ich noch...

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • Echt ?? Bei mir läuft´s einwandfrei durch. Komisch, auch wenn ich´s auf

    [autoit]


    Dim $aPics_Viewer[UBound($aPics)]

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

    läuft´s ohne Prob. Muss ich mir mal genauer anschauen

    Pommes ist nix. Krieg ich die Krätze, wenn ich die Dinger sehe. Ist halt ein Nachteil, wenn man selbstgemachte gewöhnt ist :thumbup:

  • Hallo MrB,

    Skript startet, danach werden einige Bilder angezeigt und plötzlich Absturz Ausgabe von Scite-Console:

    mfg (Auto)Bert

  • Änder das wie ich, dann klappts ^^

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • Ah, OK. Weis jetzt warum es bei mir funktioniert. Habe in dem Bilder Ordner noch andere Dateien die nicht erstellt werden. Deswegen kommt es dazu das

    [autoit]

    $aPics_Viewer[$i]

    [/autoit]


    immer größer ist wie

    [autoit]

    $aPics[$i]

    [/autoit]
  • Musst du erstmal durch

    [autoit]

    Dim $aPics_Viewer[UBound($aPics)]

    [/autoit]

    ersetzen, sonst bricht das Script beim letzten Bild mit einer Fehlermeldung ab.
    Am Rest arbeite ich noch...

    Und das ist der Grund/die Lösung :rolleyes:

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • 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

    Hä, warum mit GetPos()? du kannst das doch auch eifach per Switch...Case losen, a la

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <GUIConstants.au3>
    #include <Color.au3>

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

    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 633, 447, 192, 124)
    $Pic1 = GUICtrlCreatePic("C:\Dokumente und Einstellungen\Besitzer\Eigene Dateien\Eigene Bilder\...", 168, 160, 100, 100, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS))
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Pic1
    MsgBox(0,"","")
    EndSwitch
    WEnd

    [/autoit]
    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • autoBert
    Ich zitier mich mal selber:

    Zitat

    Lange Rede kurzer Sinn, hat einer eine Idee wie man das besser lösen könnte?

    Bezieht sich auf die Optik und den Ressourcenverbrauch. Mein Laptop geht dabei schon ziemlich in die Knie.
    Zur Optik: Wie ihr wahrscheinlich bemerkt habt, werden die Bilder verzerrt dargestellt, da ich ja immer feset Maße nehme. Das stört mich. Außerdem benutze ich das in einem Tab und da hab ich noch nicht raus bekommen wie ich da ein Hintergrundbild rein bekomme.

    Cartan12

    Vielleicht hab ich ja da einen Denkfehler. Die Bilder werden ja in einer For Schleife erstellt und klar könnte ich dann sagen

    [autoit]

    $Pic1 = GUICtrlCreatePic(

    [/autoit]


    Nur woher soll ich wissen bzw. wie sage ich dem Script, dass wenn ich auf ein Bild klicke, sich auch das richtige öffnet. $Pic1 wird ja immer wieder überschrieben. Da ich aus meiner Unwissendheit heraus nur die Möglichkeit gefunden habe über GetPos() zu gehen bzw. alles in einen Array zu schreiben (den Weg habe ich nicht weiter verfolgt, da Array und ich uns nicht so mögen). Naja, also GetPos(). Ich lasse mich gerne belehren. Ist ja schließlich der Sinn der Sache.

    Im Allgemeinen ging es nie darum, dass das Script nicht läuft. Lief einwandfrei, OK bis auf den Fehler mit

    [autoit]

    Dim $aPics_Viewer[UBound($aPics) - 1] -> Dim $aPics_Viewer[UBound($aPics)]

    [/autoit]

    . hatte aber bei mir ja keine Auswirkung :)
    Ich wollte einfach Anregungen, wie man das ganze besser, schöner, schneller usw. lösen kann

    MfG
    MrB

  • Dann machst du es i-wie so in der Art ($datei musst du noch anpassen...)

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <GUIConstants.au3>
    #include <Color.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

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

    Dim $Pic[10], $datei[10] = ["1.jpg","2.jpg","3.jpg","4.jpg","5.jpg","6.jpg","7.jpg","8.jpg","9.jpg","10.jpg"]

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 633, 447, 192, 124)
    For $i = 0 To 9
    $Pic[$i]= GUICtrlCreatePic("C:\Dokumente und Einstellungen\Besitzer\Eigene Dateien\" & $datei[$i], 168+$i*100, 160, 100, 100, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS))
    Next
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    If $nMsg == $GUI_EVENT_CLOSE Then Exit
    For $i = 0 To 9
    If $nMsg == $Pic[$i] Then MsgBox(0,"",$i)
    Next
    WEnd

    [/autoit]
    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • @Cartan: Da kommt aber der C(#/++) Programmierer durch.

    To Topic:
    Mit GdiPlus liesse sich das ganze sicher auch Ressoucensparend lösen.
    Die frage ist nur ob du dich damit beschäftigen willst.


    mfg Ubuntu

  • @Ubuntu

    Prinzipiell hab ich nix dagegen. Bist du dir sicher, dass das Ganze dann Ressourcen sparender ist? Will nicht unbedingt Zeit investieren und es bringt nix oder nur wenig. Zeit ist Mangelware :)