#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 http://autoit.de/index.php?page=Thread&threadID=24514&highlight=_GUICtrlPic_Create Dank dieser Funktion können auch PNG -Bilder prblemls angezeigt werden. #ce ------------------------------------------------------------------------------------------------------------------------- #include #include #include #include #include #include #include #include "GUICtrlPic.au3" #include Opt('MustDeclareVars', 1) Global $msg, $message, $var, $aFiles, $idfrmMain, $sSourcePath, $aItem, $dtCreated, $dtLast, $iSize Global $szDrive, $szDir, $szFName, $szExt, $hPic = -99 Global $aDropFiles[1] $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." $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