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 Version: 3.3.6.1
Author: AutoBert: http://www.autoit.de/index.php?page=Thread&threadID=21667
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
_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>
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
$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)
GUISetState()
While 1
$msg = GUIGetMsg()
Switch $msg
Case $GUI_EVENT_DROPPED
_FilesDropped()
Case $idfileitem
$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
;Rückgabe des Fileopenialogs in einzzenlne Strings für Array splitten
;_ArrayDisplay($aFiles) ;Array anzeigen nur zu Verständnisuwecken evtl. aktivieren
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
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
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
#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
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
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
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