[Beispiel] BMP-, GIF-, PNG- & JPG-Viewer (Stand: 10.02.2012)

  • Hallo com,

    anbei ein kleines Skript, mit dem ich mir meine eigenen Bilder betrachte. Bilder können

    • über das Menü (FileOpendialog)
    • bzw. Drag und Drop eingefügt werden

    Das Seitenverhältnis der Bilder wird berücksichtigt. Die Bilder werden

    • über Button
    • bzw. Doppelklick angezeigt


    Getestet habe ich das Programm mit

    • BMP
    • GIF
    • JPG
    • PNG
    Spoiler anzeigen

    unter Windows XP SP3

    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Outfile=BMP-Viewer.exe
    #AutoIt3Wrapper_UseUpx=n
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #cs -----------------------------------------------------------------------------------------------------------------------

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

    AutoIt Version: 3.3.6.1
    Author: AutoBert: http://www.autoit.de/index.php?page=Thread&threadID=21667

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

    Skriptbeispiel für den Umgang mit FileOpenDialog, GUICtrlCreateListView, GUICtrlCreateListViewItem,
    _GUICtrlListView_RegisterSortCallBack, _GUICtrlListView_SortItems
    _PathSplit, FileGetTime, FileGetSize, GUIRegisterMsg speziell für das Event $GUI_EVENT_DROPPED

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

    _GUICtrlPic_Create aus GuiCtrlPic von Großvater https://autoit.de/index.php?page…ICtrlPic_Create
    Dank dieser Funktion können auch PNG -Bilder prblemls angezeigt werden.
    #ce -------------------------------------------------------------------------------------------------------------------------
    #include <ListViewConstants.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <GuiListView.au3>
    #include <File.au3>
    #include <array.au3>
    #include "GUICtrlPic.au3"
    #include <GDIPlus.au3>

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

    Opt('MustDeclareVars', 1)

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

    Global $msg, $message, $var, $aFiles, $idfrmMain, $sSourcePath, $aItem, $dtCreated, $dtLast, $iSize
    Global $szDrive, $szDir, $szFName, $szExt, $hPic = -99
    Global $aDropFiles[1], $WM_DROPFILES = 0x233

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

    $idfrmMain = GUICreate("BMP-, GIF- PNG, & JPG-Viewer", 924, 550, -1, -1, -1, $WS_EX_ACCEPTFILES)
    Local $idfilemenu = GUICtrlCreateMenu("&Datei")
    Local $idfileitem = GUICtrlCreateMenuItem("Öffnen", $idfilemenu)
    GUICtrlSetState(-1, $GUI_DEFBUTTON)
    Local $idexititem = GUICtrlCreateMenuItem("Beenden", $idfilemenu)
    Local $idLV_Files = GUICtrlCreateListView("Name: |Pfad |erstellt am |letzte Änderung |Grösse KB", 519, 5, 400, 490, BitOR($LVS_SHOWSELALWAYS, $LVS_REPORT))
    GUICtrlSetState(-1, $GUI_DROPACCEPTED)
    Local $idLblXY =GUICtrlCreateLabel("",5,515,500,20)
    Local $idbtnShow = GUICtrlCreateButton("&Zeige Bild", 519, 500, 140, 25)
    Local $idClearLV = GUICtrlCreateButton("&Listview &leeren", 669, 500, 140, 25)
    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
    GUIRegisterMsg($WM_DROPFILES, "WM_DROPFILES_FUNC")
    _GUICtrlListView_RegisterSortCallBack($idLV_Files)

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

    GUISetState()
    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_DROPPED
    _FilesDropped()
    Case $idfileitem

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

    $message = "Um mehrere Dateien auszuwählen, ist die Strg-Taste oder die Shift-Taste zu drücken."

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

    $var = FileOpenDialog($message, @MyDocumentsDir & "", "Bilder (*.jpg;*.bmp;*.gif;*.png)", 1 + 4)
    If @error Then
    MsgBox(4096, "", "Keine Datei(en) ausgewählt")
    Else
    _GUICtrlListView_BeginUpdate($idLV_Files)
    $aFiles = StringSplit($var, "|")
    If $aFiles[0] > 1 Then ;trifft nur bei Mehrfachauwal zu
    ;$aFiles[0] enthält Anzahl der Strings
    ;$aFiles[1] enthält den Pfad für alle ausgewählten Bilder
    ;$aFiles[2] enthält 1. Bild
    ;$aFiles[n+1] enthält n. Bild

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

    ;Rückgabe des Fileopenialogs in einzzenlne Strings für Array splitten
    ;_ArrayDisplay($aFiles) ;Array anzeigen nur zu Verständnisuwecken evtl. aktivieren

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

    For $i = 2 To $aFiles[0]
    ;ConsoleWrite($aFiles[$i] & @CRLF)
    $dtCreated = FileGetTime($aFiles[1] & "\" & $aFiles[$i], 1, 1)
    $dtLast = FileGetTime($aFiles[1] & "\" & $aFiles[$i], 2, 1)
    $iSize = Round(FileGetSize($aFiles[1] & "\" & $aFiles[$i]) / 1024, 0)
    GUICtrlCreateListViewItem($aFiles[$i] & "|" & $aFiles[1] & "|" & _FormatDate($dtCreated) & "|" & _FormatDate($dtLast) & "|" & $iSize, $idLV_Files)
    Next
    Else ;nur eine Datei ausgewählt
    ;ConsoleWrite($aFiles[1] & @CRLF)
    _PathSplit($aFiles[1], $szDrive, $szDir, $szFName, $szExt)
    $dtCreated = FileGetTime($aFiles[1], 1, 1)
    $dtLast = FileGetTime($aFiles[1], 2, 1)
    $iSize = Round(FileGetSize($aFiles[1] / 1024), 0)
    GUICtrlCreateListViewItem($szFName & $szExt & "|" & $szDrive & $szDir & "|" & _FormatDate($dtCreated) & "|" & _FormatDate($dtLast) & "|" & $iSize, $idLV_Files)
    EndIf
    _GUICtrlListView_SetColumnWidth($idLV_Files, 0, $LVSCW_AUTOSIZE)
    ;setzt die 1 Spalte auf die benötigte Breite des längsten Eintrags
    _GUICtrlListView_SetColumnWidth($idLV_Files, 1, 0) ;zweite Spalte versteckt
    _GUICtrlListView_EndUpdate($idLV_Files)
    EndIf
    Case $idClearLV
    _GUICtrlListView_DeleteAllItems($idLV_Files)
    Case $idbtnShow
    $aItem = _GUICtrlListView_GetItemTextArray($idLV_Files)
    _ShowPic($aItem)
    Case $GUI_EVENT_CLOSE, $idexititem
    _GUICtrlListView_UnRegisterSortCallBack($idLV_Files)
    Exit
    EndSwitch
    WEnd

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

    Func _FormatDate($sDT)
    ;ConsoleWrite($sDT & @CRLF)
    Return StringMid($sDT, 7, 2) & "." & StringMid($sDT, 5, 2) & "." & StringLeft($sDT, 4) & " " & StringMid($sDT, 9, 2) & ":" & StringMid($sDT, 11, 2)
    EndFunc ;==>_FormatDate

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

    Func _ShowPic($aItem)
    Local $sImageName = $aItem[2] & "\" & $aItem[1]
    ;$aItem[0] enthält Anzahl der Spalten [$aIem[1] die 1. Spalte usw.
    ;_ArrayDisplay($aItem) nur zu Verständnisuwecken evtl. aktivieren
    ;ConsoleWrite("Pfad zur Datei:" & $aItem[2] & "\" & $aItem[1] & @CRLF) ;nur zu Verständnisuwecken evtl. deaktivieren
    _GDIPlus_Startup()
    Local $hImage = _GDIPlus_ImageLoadFromFile($sImageName)
    Local $iX = _GDIPlus_ImageGetWidth($hImage)
    Local $iY = _GDIPlus_ImageGetHeight($hImage)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_Shutdown()
    Local $iRatio = $iX / $iY
    GUICtrlSetData($idLblXY,StringFormat("Original-Grösse Breite: %6s Höhe: %6s ", $iX, $iY))
    ;ConsoleWrite("Orig.: " & $iX & " " & $iY & " " & $iRatio & @CRLF)
    If $iRatio >= 1 Then
    $iX = 500
    $iY = $iX / $iRatio
    Else
    $iY = 300
    $iX = $iY * $iRatio
    EndIf
    ;ConsoleWrite("Neu: " & $iX & " " & $iY & " " & $iRatio & @CRLF)
    If $hPic <> -99 Then GUICtrlDelete($hPic)
    $hPic = _GUICtrlPic_Create($sImageName, 5, 5, $iX, $iY, $SS_CENTERIMAGE, Default)
    EndFunc ;==>_ShowPic

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

    #Region ;Drag and Drop und Doppelklick
    Func WM_DROPFILES_FUNC($hWnd, $msgID, $wParam, $lParam)
    ;ConsoleWrite("WM_DropFiles_Func " & @CRLF)
    Local $nSize, $pFileName
    Local $nAmt = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", 0xFFFFFFFF, "ptr", 0, "int", 255)
    For $i = 0 To $nAmt[0] - 1
    $nSize = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", 0, "int", 0)
    $nSize = $nSize[0] + 1
    $pFileName = DllStructCreate("char[" & $nSize & "]")
    DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", DllStructGetPtr($pFileName), "int", $nSize)
    ReDim $aDropFiles[$i + 1]
    $aDropFiles[$i] = DllStructGetData($pFileName, 1)
    $pFileName = 0
    Next
    EndFunc ;==>WM_DROPFILES_FUNC

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

    Func _FilesDropped()
    Local $szDrive, $szDir, $szFName, $szExt, $split, $sImageName, $sPath
    _GUICtrlListView_BeginUpdate($idLV_Files)
    ;_ArrayDisplay($aDropFiles)
    For $i = 0 To UBound($aDropFiles) - 1
    $split = _PathSplit($aDropFiles[$i], $szDrive, $szDir, $szFName, $szExt)
    $szExt = StringUpper($szExt)
    ;;;Consolewrite($aDropFiles[$i] & ", " & $szExt & @CRLF)
    Switch $szExt
    Case ".JPG", ".BMP", ".GIF", ".PNG"
    $sImageName = $szFName & $szExt
    $sPath = $szDrive & $szDir
    ;;ConsoleWrite($sPath & $sImageName & @CRLF)
    $dtCreated = FileGetTime($sPath & $sImageName, 1, 1)
    $dtLast = FileGetTime($sPath & $sImageName, 2, 1)
    $iSize = Round(FileGetSize($sPath & $sImageName) / 1024, 0)
    GUICtrlCreateListViewItem($sImageName & "|" & $sPath & "|" & _FormatDate($dtCreated) & " |" & _FormatDate($dtLast) & " |" & $iSize, $idLV_Files)
    EndSwitch
    Next
    _GUICtrlListView_SetColumnWidth($idLV_Files, 0, $LVSCW_AUTOSIZE)
    ;setzt die 1 Spalte auf die benötigte Breite des längsten Eintrags
    _GUICtrlListView_SetColumnWidth($idLV_Files, 1, 0) ;zweite Spalte versteckt
    _GUICtrlListView_EndUpdate($idLV_Files)
    EndFunc ;==>_FilesDropped

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

    Func WM_NOTIFY($hWnd, $msgID, $wParam, $lParam)
    Local $tagNMHDR, $event, $hwndFrom, $code, $aItem
    $tagNMHDR = DllStructCreate("int;int;int", $lParam)
    If @error Then Return 0
    $code = DllStructGetData($tagNMHDR, 3)
    ConsoleWrite($code & @TAB & $LVN_COLUMNCLICK & @CRLF)
    If $wParam = $idLV_Files Then
    Switch $code
    Case - 3
    If _GUICtrlListView_GetSelectedCount($idLV_Files) > 0 Then
    $aItem = _GUICtrlListView_GetItemTextArray($idLV_Files)
    ;Consolewrite($aItem[1] & ", " & $aItem[3] & @CRLF)
    _ShowPic($aItem)
    EndIf
    Case $LVN_COLUMNCLICK
    _GUICtrlListView_SortItems($idLV_Files, GUICtrlGetState($idLV_Files))
    EndSwitch
    EndIf
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY
    #EndRegion ;Drag and Drop und Doppelklick

    [/autoit]

    da es aus Beispielen der Hilfe zusammenkopiert ist, könnt ihr es selbstverständlich komplett oder in Teile benutzen,

    Hir noch ein ScreenShot:
    autoit.de/wcf/attachment/10652/

    Edit: Erweitert mit Datei-Infos zu Erstellung,Änderung und Grösse
    Edit2: PNG werden jetzt auch mit angezeigt, ausserdem sind die Listvieweinträge jetzt sortierbar durch Spaltenklick

    mfg (Auto)Bert

    3 Mal editiert, zuletzt von autoBert (10. Februar 2012 um 21:34) aus folgendem Grund: PNG Bilder in Anzeige aufgenommen, danke Großvater

  • Und noch ein gutes Beispiel in deiner Sammlung.

    P.S. Hast vergessen es in deine Signatur zu schreiben ;)

  • Hallo Autobert,

    Wenn ich versuche einen Ordner per Drag & Drop einzufügen, tut sich nichts. Auch die ColumnWidth's der ListView scheinen sich, zumindest bei "Pfad", immer wieder auf 0 zu setzen.

    Habe den Code ehrlich gesagt nicht weiter betrachtet, habs bisher nur gestartet und "rumgespielt". Diese 2 Kleinigkeiten sind mir da spontan aufgefallen.

    LG, SEuBo