From c4e8d2440ea201cc661877d5bb64244005b4d6ca Mon Sep 17 00:00:00 2001 From: Bernhard Date: Sat, 9 Sep 2017 21:15:08 +0200 Subject: [PATCH] First --- FotoSort2017.au3 | 3476 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 3476 insertions(+) create mode 100644 FotoSort2017.au3 diff --git a/FotoSort2017.au3 b/FotoSort2017.au3 new file mode 100644 index 0000000..6f065a5 --- /dev/null +++ b/FotoSort2017.au3 @@ -0,0 +1,3476 @@ +#NoTrayIcon +#Region ;**** Directives created by AutoIt3Wrapper_GUI **** +#AutoIt3Wrapper_Icon=FotoSortNeu.ico +#AutoIt3Wrapper_Res_Comment=2017 BLinz +#AutoIt3Wrapper_Res_Description=FotoSort2017.exe +#AutoIt3Wrapper_Res_Fileversion=1.1 +#AutoIt3Wrapper_Res_Fileversion_AutoIncrement=n +#AutoIt3Wrapper_Res_LegalCopyright=Public Domain +#AutoIt3Wrapper_Res_Language=1031 +#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +; lokale UDF +#include "GIFAnimation.au3" +#include "xResources.au3" + +AutoItSetOption("MustDeclareVars", 1) +AutoItSetOption("GUIOnEventMode", 1) + + +; Dieses Programm ist eine alternative Version von Oscars FotoSort.au3 +; https://autoit.de/index.php/Thread/39572-FotoSort/ +; So ein Programm fehlte mir. Die neue Version habe ich geschrieben um es an meine HD-Monitore anzupassen (und ein paar andere Dinge die mir fehlten + + + +#Region Variablen +; ##################################################################################### +; ## ## ### ######## #### ### ######## ## ######## ## ## +; ## ## ## ## ## ## ## ## ## ## ## ## ## ### ## +; ## ## ## ## ## ## ## ## ## ## ## ## ## #### ## +; ## ## ## ## ######## ## ## ## ######## ## ###### ## ## ## +; ## ## ######### ## ## ## ######### ## ## ## ## ## #### +; ## ## ## ## ## ## ## ## ## ## ## ## ## ## ### +; ### ## ## ## ## #### ## ## ######## ######## ######## ## ## +;~ #################################################################################### +; Variablen für globale Voreinstellungen +Global Const $s_ProgramTitle = "FotoSort2017" +Global Const $s_ProgramVersion = "v1.1" +;~ Global Const $s_ProgramVersion = "v" & FileGetVersion(@ScriptFullPath) +Global Const $s_FontNameForm = "Calibri" +Global Const $s_FontSizeForm = 12 +Global Const $s_FontNameInputs = "Consolas" +Global Const $s_FontSizeInputs = 12 + +; Variablen für die GUI +Global $h_FormFotoSort2017 +Global $id_GroupTargetDirectories +Global $id_GroupFileFormats +Global $id_GroupFileExists, $id_RadioOverwrite, $id_RadioAddSuffix, $id_InputSuffix, $id_RadioAskOverwrite, $id_CheckboxDoubleFiles, $id_LabelCountingNumber +Global $id_GroupTools +Global $id_GroupQuellverzeichnis, $id_InputSourceDirectory, $id_ButtonSelectSourceDirectory, $id_CheckboxScanFolderRecursive +Global $id_Picture, $id_ButtonPicBack100, $id_ButtonPicBack10, $id_ButtonPicBack1, $id_ButtonPicForward1, $id_ButtonPicForward10, $id_ButtonPicForward100, $id_ButtonPicGoToFirst, $id_ButtonPicGoToLast, $id_InputPicNumber, $id_CheckboxPictureFitSize +Global $id_StatusBar +Global $id_ButtonSelected1, $id_ButtonSelected2, $hex_SignalColor = 0xE10096 +Global $id_ToolSelected1, $id_ToolSelected2, $id_ProfilesDummy +Global $id_ButtonAddTargetDirectory, $id_ButtonRemoveTargetDirectory +Global $id_LabelBehindPicture1, $id_LabelBehindPicture2, $id_LabelBehindPicture3, $id_Background = 0 +; Die Zielverzeichnisse - die Anzahl ist variabel, also als Array +Global $a_id_TargetDirectories[2][5] ; [0][0] = Anzahl + ; [x][1] = Button kopieren + ; [x][2] = Butten verschieben + ; [x][3] = Input + ; [x][4] = Pfadauswahl + +Global $i_Distance = 44 ; Abstand zwischen den Zeilen der Verzeichnisse +Global $i_ButtonPicYfromTop = 650 ; Beginn der Zeile mit den Bild vor/zurück Buttons +Global $id_LabelPictureName ; Label unter dem Bild in dem der Bildname steht + +; Control das Markierung nach einer Aktion zeigt (Farbiger Rahmen um den Button) +Global $id_ThisOne1, $id_ThisOne2, $i_Timeout = 1000, $i_TimerThisOne = 0, $i_TimerSelectCurrentPicture = 0 +Global $_a_ButtonCopy ; Hier wird regelmäßig die Position des untersten "Kopieren" Buttons der Zeilverzeichnisse abgelegt (=Button ganz links) +Global $_a_ButtonSelectFolder ; ; dito nur der Button für die Verzechnisauswahl (= ganz rechts). Beides wird benötigt für den Rahmen der bei einer Aktion aufblitzt + +; Tasten zu Buttonzuweisungen - fast alles lässt sich per Tastendruck steuern +Global $a_AcceleratorKeys[1][2] + +; Werkzeugeleite. Auch als Array. Wenn hier die Namen vrtauscht werden, vertauscht sich auch die Reihenfolge +Global $a_id_Tools[8][2] = [ [ "DEL", 0 ], [ "Rename", 0 ], [ "RELOAD", 0 ], [ "Filenames", 0 ], [ "Profiles", 0 ], [ "BKG", 0 ], [ "RESET", 0 ], [ "Hilfe", 0 ] ] +; DEL : Bild löschen +; Rename : Bild umbennnen +; RELOAD : Bild neu laden +; Filenames : Erstellt eine Textdatei mit allen Bildnamen +; BKG : Hintergrundfarbe ändern +; Hilfe : Blendet eine zusätzliches Fenster mit Informationen ein +; RESET : Alle Ordner leeren + +; Icons die auf den Werkzeug-Buttons angezeigt werden +Global $_Resources_FotoSort2017ico, $_Resources_Burnpng, $_Resources_Colorpng, $_Resources_CopyDocpng, $_Resources_Editpng, $_Resources_Refreshpng +Global $_Resources_TrashFullpng, $_Resources_Helppng, $_Resources_Cancelico, $_Resources_Overwriteico, $_Resources_CheckOffico2, $_Resources_Profilespng + +; Fenstergröße sichern / Variablen für erlaubte Größen. Wir geben später eine minimale und Maximale Fenstergröße vor +Global $a_FormFotoSortNew_Size +Global $i_FormFotoSortNew_SizeMinWidth, $i_FormFotoSortNew_SizeMinHeight, $i_FormFotoSortNew_SizeMaxWidth, $i_FormFotoSortNew_SizeMaxHeight +Global $b_FormIsMaximized = False +Global Const $WIN_STATE_MAXIMIZED = 32 +Global $b_GIF = False + +; Für DPI-Anpassungen gemäß https://autoit.de/index.php/Thread/85260-Kleines-Desktop-Spiel-ChipHunter/?postID=682546#post682546 +Global $i_AppliedDPI = Int(RegRead("HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics", "AppliedDPI")) / 96 +; Auf Eis geleget, Windows 10 zoomte die GUI einfach so groß +$i_AppliedDPI = 1 + +; Für die aktuell angezeigte Vorschau +Global $d_CurrentPicture, $h_Resources_PicTestBildpngGlobal, $d_Resources_PicTestBildpngGlobal +Global $a_CurrentPictureFilename[2] = [ "", "" ] ; aktueller Bildname (ohne Pfad), getrennt nach Name und Erweiterung +Global $b_Upscale = True ; Ob kleine Bilder vergrößert werden sollen +Global $b_Use_GuiCtrlSetImageEx = False ; Wenn True sorgt die :GUICtrlSetImageEx Funktion für die Vorschaudarstellung +Global $d_BackgroundColor_ARGB = 0xFF000000 +Global $b_FirstPicture = True ; Wenn dieser Wert True ist wird das Pic-Control vor der Darstellung einmal gelöscht und neu erstellt +Global $i_CurrentPictureSavedFromregistry ; Hier speichern wir das letzte Bild das dargestellt wurde zwischen. Wird nur für Startup benötigt +; Array für Bildmaße, wird jeweils von _GUICtrlSetImageEx_Modified() zurück gegeben +Global $a_CurrentPictureMetrics[5] ; 0 = X / 1 = Y / 2 = Farbtiefe / 3 = Darstellungsgröße in % / 4 = Dateigröße + +; Array mit den Dateinamen der Bilder, wird von ReadFileList() gefüllt +Global $a_s_PictureFilenames[1] = [ 0 ] +Global $i_CurrentFilename = 0 + +; Array für doppelte Dateien (wird auf den Zielordner ausgeführt +Global $a_s_FilesInTarget[1] = [ 0 ] +Global $a_i_FileSizesInTarget[1] = [ 0 ] + +; Für Doppelklick-Erkennung +Global $i_DoubleClickTimer = 0 + +; Speicherung der Einstellungen in der Registry unter diesem Pfad +Global $s_RegistryKeyname = "HKEY_CURRENT_USER\Software\znil.net\FotoSort2017" + +; Array für die Profile: +Global $a_Profiles[1] ; [0] = Anzahl + ; [x] = Name +Global $i_ProfileActive = 1 +Global $s_ProfileActive = "Standart" + + +; Die Icons in der Statusbar +Global $_Resources_Warningico, $h_IconWarning, $_Resources_Pictureico, $h_IconPicture, $_Resources_CheckOffico, $h_IconCheckOff, $_Resources_Infoico, $h_IconInfo, $h_IconOverwrite, $h_IconCancel, $_Resources_Profilesico, $h_IconProfiles +; GDIPlus +Global $aGDIPlusDecoders, $a_id_CheckboxFileformat[1] ; Die möglichen Dateifromate sind in GDIPlus eingebaut. Wir fragen was geht und das bieten wir dann an. Deshalb Array da ja dynamisch +Global $s_SearchPattern ; Hier steht der Suchstring drin für die Dateisuche +#EndRegion Variablen + +#Region Funktionen +; ############################################################################################################################################################################################### +; ######## ## ## ## ## ## ## ######## #### ####### ## ## ######## ## ## +; ## ## ## ### ## ## ## ## ## ## ## ### ## ## ### ## +; ## ## ## #### ## ## ## ## ## ## ## #### ## ## #### ## +; ###### ## ## ## ## ## ##### ## ## ## ## ## ## ## ###### ## ## ## +; ## ## ## ## #### ## ## ## ## ## ## ## #### ## ## #### +; ## ## ## ## ### ## ## ## ## ## ## ## ### ## ## ### +; ## ####### ## ## ## ## ## #### ####### ## ## ######## ## ## +; ############################################################################################################################################################################################### +;~ _ _ _ _ __ _ _ _ +;~ / \ ___ ___ ___| | ___ _ __ __ _| |_ ___ _ __| |/ /___ _ _ / \ __| | __| | +;~ / _ \ / __/ __/ _ \ |/ _ \ '__/ _` | __/ _ \| '__| ' // _ \ | | | / _ \ / _` |/ _` | +;~ / ___ \ (_| (_| __/ | __/ | | (_| | || (_) | | | . \ __/ |_| |/ ___ \ (_| | (_| | +;~ ____/_/ \_\___\___\___|_|\___|_| \__,_|\__\___/|_| |_|\_\___|\__, /_/ \_\__,_|\__,_| +;~ |_____| |___/ +; Um beim Programmieren flexibler zu sein kann man jederzeit eine Tastenkombination hinzufügen +; $_s_Key = Taste im Send() Format +; $_id_OfControl = ID des Controls deren Funktion aufgerufen werden soll +Func _AcceleratorKeyAdd($_s_Key, $_id_OfControl) + _ArrayAdd($a_AcceleratorKeys, $_s_Key) ; Array erweitern (und gleichzeitig Taste in den neuen Wert schreiben) + $a_AcceleratorKeys[ UBound($a_AcceleratorKeys) - 1 ][1] = $_id_OfControl ; und noch die Control-Id hinzufügen + GUISetAccelerators($a_AcceleratorKeys, $h_FormFotoSort2017) ; Änderungen übermitteln +EndFunc +; ############################################################################################################################################################################################### +;~ _ _ _ _ __ ____ _ _ +;~ / \ ___ ___ ___| | ___ _ __ __ _| |_ ___ _ __| |/ /___ _ _| _ \ ___| | ___| |_ ___ +;~ / _ \ / __/ __/ _ \ |/ _ \ '__/ _` | __/ _ \| '__| ' // _ \ | | | | | |/ _ \ |/ _ \ __/ _ \ +;~ / ___ \ (_| (_| __/ | __/ | | (_| | || (_) | | | . \ __/ |_| | |_| | __/ | __/ || __/ +;~ ____/_/ \_\___\___\___|_|\___|_| \__,_|\__\___/|_| |_|\_\___|\__, |____/ \___|_|\___|\__\___| +;~ |_____| |___/ +; Gegenstück zur Add Funktion, sucht anhand der Control-Id alle Einträge und löscht diese aus dem Array +; Funktion ruft sich so lange selbst auf bis alle Id's gefunden sind. Da wir ständig Einträge mittendrin löschen kommt $a nämlich aus dem Tritt +Func _AcceleratorKeyDelete($_id_OfControl) + For $a = 0 To (UBound($a_AcceleratorKeys) - 1) Step 1 + If $_id_OfControl = $a_AcceleratorKeys[$a][1] Then + _ArrayDelete($a_AcceleratorKeys, $a) ; Eintrag löschen + _AcceleratorKeyDelete($_id_OfControl) ; und selbst noch einmal aufrufen (Einmal!!) + ExitLoop ; Und damit sind wir nach dem ersten Treffer raus + EndIf + Next + GUISetAccelerators($a_AcceleratorKeys, $h_FormFotoSort2017) +EndFunc +; ############################################################################################################################################################################################### +;~ _ ____ ____ ____ ____ ____ ____ ____ +;~ / \ | _ \ / ___| __ ) |___ \ | _ \ / ___| __ ) +;~ / _ \ | |_) | | _| _ \ __) | | |_) | | _| _ \ +;~ / ___ \| _ <| |_| | |_) | / __/ | _ <| |_| | |_) | +;~ ____/_/ \_\_| \_\\____|____/___|_____|___|_| \_\\____|____/ +;~ |_____| |_____| |_____| +; Wandelt einen ARGB Farbwert wieder in einen RGB Wert um +; https://autoit.de/index.php/Thread/85339-AutoIt-Heise-Newsticker/?postID=683482#post683482 +Func _ARGB_2_RGB($_hex_color) + Return BitAnd($_hex_color,0xFFFFFF) +EndFunc +; ############################################################################################################################################################################################### +;~ ____ _ _ ____ _ +;~ | __ ) _ _| |_| |_ ___ _ __ | _ \(_) ___ ___ +;~ | _ \| | | | __| __/ _ \| '_ \| |_) | |/ __/ __| +;~ | |_) | |_| | |_| || (_) | | | | __/| | (__\__ \ +;~ ____|____/ \__,_|\__|\__\___/|_| |_|_| |_|\___|___/ +;~ |_____| +; Wird aufgerufen wenn auf einer der Buttons unterhalb der Vorschau geklickt wird (oder das Input genutzt wird) +Func _ButtonPics() + Local $_a_ButtonPos + ; na wenn wir gar keine Bilder haben gleich wieder raus + If $a_s_PictureFilenames[0] = 0 Then + Return 1 + EndIf + ; Den farbigen Rahmen positionieren der anzeigt was wir ausgelöst haben + If @GUI_CtrlId <> $id_InputPicNumber And @GUI_CtrlId <> $id_CheckboxPictureFitSize Then + $_a_ButtonPos = ControlGetPos($h_FormFotoSort2017, "", @GUI_CtrlId) + GUICtrlSetPos($id_ButtonSelected1, $_a_ButtonPos[0] - 1, $_a_ButtonPos[1] - 1) + GUICtrlSetPos($id_ButtonSelected2, $_a_ButtonPos[0] - 2, $_a_ButtonPos[1] - 2) + GUICtrlSetColor($id_ButtonSelected1, $hex_SignalColor) + GUICtrlSetColor($id_ButtonSelected2, $hex_SignalColor) + $i_Timeout = 250 + _ThisOne() ; wird den Rahmen nach 250ms wieder auf die Hintergrundfarbe setzen = unsichtbar + EndIf + ; Na, welcher Button war es denn? + Switch @GUI_CtrlId + Case $id_ButtonPicGoToFirst + _SelectCurrentPicture(1) + Case $id_ButtonPicBack100 + _SelectCurrentPicture(GUICtrlRead($id_InputPicNumber) - 100) + Case $id_ButtonPicBack10 + _SelectCurrentPicture(GUICtrlRead($id_InputPicNumber) - 10) + Case $id_ButtonPicBack1 + _SelectCurrentPicture(GUICtrlRead($id_InputPicNumber) - 1) + Case $id_ButtonPicForward1 + _SelectCurrentPicture(GUICtrlRead($id_InputPicNumber) + 1) + Case $id_ButtonPicForward10 + _SelectCurrentPicture(GUICtrlRead($id_InputPicNumber) + 10) + Case $id_ButtonPicForward100 + _SelectCurrentPicture(GUICtrlRead($id_InputPicNumber) + 100) + Case $id_ButtonPicGoToLast + _SelectCurrentPicture($a_s_PictureFilenames[0]) + Case $id_CheckboxPictureFitSize + _SettingsWrite("$id_CheckboxPictureFitSize", GUICtrlRead($id_CheckboxPictureFitSize)) + _SelectCurrentPicture(GUICtrlRead($id_InputPicNumber)) + Case $id_InputPicNumber + GUICtrlSetData($id_InputPicNumber, Int(GUICtrlRead($id_InputPicNumber))) ; Da wir schlau sind wandeln wir alles aus dem Feld per Int() in eine Zahl. Bei Müll kommt da 0 raus + ; Die Zahlentasten sind mit kopieren belegt. Die Funktion WM_COMMAND schaltet das ab solange der Cursor im Input ist + ; Um das wieder einzuschalten wechseln wir den Focus auf ein anderes Control + ControlFocus($h_FormFotoSort2017, "", $id_Picture) + _SelectCurrentPicture(GUICtrlRead($id_InputPicNumber)) + Case Else + ; Diese Meldung sollte nie jemand lesen ... + MsgBox(16, "Fehler", "_ButtonPics(): War kein $id_ButtonPic!") + EndSwitch + ; Wenn wir nicht gerade im PicNumber Input waren den Focus auf die letzte Auswahl legen. Bei Mausklick ist er da sowieso, bei Tastendruck ist er es dann + If @GUI_CtrlId <> $id_InputPicNumber Then + ControlFocus($h_FormFotoSort2017, "", @GUI_CtrlId) + EndIf +EndFunc +; ############################################################################################################################################################################################### +;~ ____ _ _ ____ _ ____ _ _ _____ _ _ ____ _ _ _ +;~ | __ ) _ _| |_| |_ ___ _ __ | _ \(_) ___ ___ / ___| |__ ___ ___| | _| ____|_ __ __ _| |__ | | ___| _ \(_)___ __ _| |__ | | ___ +;~ | _ \| | | | __| __/ _ \| '_ \| |_) | |/ __/ __| | | '_ \ / _ \/ __| |/ / _| | '_ \ / _` | '_ \| |/ _ \ | | | / __|/ _` | '_ \| |/ _ \ +;~ | |_) | |_| | |_| || (_) | | | | __/| | (__\__ \ |___| | | | __/ (__| <| |___| | | | (_| | |_) | | __/ |_| | \__ \ (_| | |_) | | __/ +;~ ____|____/ \__,_|\__|\__\___/|_| |_|_| |_|\___|___/\____|_| |_|\___|\___|_|\_\_____|_| |_|\__,_|_.__/|_|\___|____/|_|___/\__,_|_.__/|_|\___| +;~ |_____| +; Aktiviert oder desktiviert die Schaltflächen für die Bildauswahl je nach Anzahl der Bilder +Func _ButtonPicsCheckEnableDisable() + Local $_i_PicNumber = GUICtrlRead($id_InputPicNumber) ; Zwischenspeichern damit wir das nur einmal für die Vergleiche abrufen + ; Wenn die Liste leer ist - alles aus! + If $a_s_PictureFilenames[0] = 0 Then + GUICtrlSetState($id_ButtonPicGoToFirst, $GUI_DISABLE) + GUICtrlSetState($id_ButtonPicBack100, $GUI_DISABLE) + GUICtrlSetState($id_ButtonPicBack10, $GUI_DISABLE) + GUICtrlSetState($id_ButtonPicBack1, $GUI_DISABLE) + GUICtrlSetState($id_ButtonPicForward1, $GUI_DISABLE) + GUICtrlSetState($id_ButtonPicForward10, $GUI_DISABLE) + GUICtrlSetState($id_ButtonPicForward100, $GUI_DISABLE) + GUICtrlSetState($id_ButtonPicGoToLast, $GUI_DISABLE) + Return 0 ; und raus aus der Funktion + EndIf + ; Ab hier Button für Button prüfen :-) + If $_i_PicNumber = 1 Then + GUICtrlSetState($id_ButtonPicGoToFirst, $GUI_DISABLE) + Else + GUICtrlSetState($id_ButtonPicGoToFirst, $GUI_ENABLE) + EndIf + If $_i_PicNumber > 100 Then + GUICtrlSetState($id_ButtonPicBack100, $GUI_ENABLE) + Else + GUICtrlSetState($id_ButtonPicBack100, $GUI_DISABLE) + EndIf + If $_i_PicNumber > 10 Then + GUICtrlSetState($id_ButtonPicBack10, $GUI_ENABLE) + Else + GUICtrlSetState($id_ButtonPicBack10, $GUI_DISABLE) + EndIf + If $_i_PicNumber > 1 Then + GUICtrlSetState($id_ButtonPicBack1, $GUI_ENABLE) + Else + GUICtrlSetState($id_ButtonPicBack1, $GUI_DISABLE) + EndIf + If ($a_s_PictureFilenames[0] - $_i_PicNumber) > 0 Then + GUICtrlSetState($id_ButtonPicForward1, $GUI_ENABLE) + Else + GUICtrlSetState($id_ButtonPicForward1, $GUI_DISABLE) + EndIf + If ($a_s_PictureFilenames[0] - $_i_PicNumber) > 9 Then + GUICtrlSetState($id_ButtonPicForward10, $GUI_ENABLE) + Else + GUICtrlSetState($id_ButtonPicForward10, $GUI_DISABLE) + EndIf + If ($a_s_PictureFilenames[0] - $_i_PicNumber) > 99 Then + GUICtrlSetState($id_ButtonPicForward100, $GUI_ENABLE) + Else + GUICtrlSetState($id_ButtonPicForward100, $GUI_DISABLE) + EndIf + If $a_s_PictureFilenames[0] = $_i_PicNumber Then + GUICtrlSetState($id_ButtonPicGoToLast, $GUI_DISABLE) + Else + GUICtrlSetState($id_ButtonPicGoToLast, $GUI_ENABLE) + EndIf +EndFunc +; ############################################################################################################################################################################################### +;~ ____ _ ____ __ __ _ +;~ | __ ) _ _| |_ ___/ ___| _ _ / _|/ _(_)_ __ +;~ | _ \| | | | __/ _ \___ \| | | | |_| |_| \ \/ / +;~ | |_) | |_| | || __/___) | |_| | _| _| |> < +;~ ____|____/ \__, |\__\___|____/ \__,_|_| |_| |_/_/\_\ +;~ |_____| |___/ +; Stammt 1:1 aus der Hilfe zu FileGetSize() +; Damit überstetzen wir die Rückgaben der Bildgrößen in "für Menschen lesbar" Angaben +Func _ByteSuffix($iBytes) + Local $iIndex = 0, $aArray = [' bytes', ' KB', ' MB', ' GB', ' TB', ' PB', ' EB', ' ZB', ' YB'] + While $iBytes > 1023 + $iIndex += 1 + $iBytes /= 1024 + WEnd + Return Round($iBytes) & $aArray[$iIndex] +EndFunc ;==>ByteSuffix +; ############################################################################################################################################################################################### +;~ ____ _ _ _ _____ _ _ __ _ +;~ / ___| |__ ___ ___| | _| |__ _____ _| ___(_) | ___ / _| ___ _ __ _ __ ___ __ _| |_ +;~ | | | '_ \ / _ \/ __| |/ / '_ \ / _ \ \/ / |_ | | |/ _ \ |_ / _ \| '__| '_ ` _ \ / _` | __| +;~ | |___| | | | __/ (__| <| |_) | (_) > <| _| | | | __/ _| (_) | | | | | | | | (_| | |_ +;~ ____\____|_| |_|\___|\___|_|\_\_.__/ \___/_/\_\_| |_|_|\___|_| \___/|_| |_| |_| |_|\__,_|\__| +;~ |_____| +; Springt an sobald irgendeine der Checkboxen für die Bildformate angeklickt wurde +Func _CheckboxFileformat() + ; Prüfen ob der Haken bei "Alle" gesetzt oder entfernt wurde + If @GUI_CtrlId = $a_id_CheckboxFileformat[0] Then + ; laut Hilfe darf man den Wert von GUICtrlRead() bei Checkboxen direkt nutzen! + Local $i_CheckedOrNot = GUICtrlRead($a_id_CheckboxFileformat[0]) + For $i = 1 To (UBound($a_id_CheckboxFileformat) - 1) Step 1 + GUICtrlSetState($a_id_CheckboxFileformat[$i], $i_CheckedOrNot) + Next + ; Was wurde da gemacht? Wir setzen einfach alle Checkboxen auf den gleichen Wert wie den von $a_id_CheckboxFileformat[0] + ; Ist die angehakt so wird der Haken überall gesetzt, wird er entfernt wird er wieder überall gelöscht + Else + ; Ok, es war eine der anderen Checkboxen. Wenn auch nur eine von denen nicht aktiviert ist muss der haken bei alle wieder raus + ; sind alle gesetzt soll der Haken aber rein. Wir setzen ihn erst rein und schauen dann ob er raus muss + GUICtrlSetState($a_id_CheckboxFileformat[0], $GUI_CHECKED) + For $i = 1 To (UBound($a_id_CheckboxFileformat) - 1) Step 1 + If GUICtrlRead($a_id_CheckboxFileformat[$i]) = $GUI_UNCHECKED Then + GUICtrlSetState($a_id_CheckboxFileformat[0], $GUI_UNCHECKED) + ExitLoop + EndIf + Next + EndIf + _CheckboxFileformatCreatePattern() ; Erzeugt das für die _RecursiveFileListToArray() Funktion notwendige Pattern +EndFunc + +; ############################################################################################################################################################################################### +;~ ____ _ _ _ _____ _ _ __ _ ____ _ ____ _ _ +;~ / ___| |__ ___ ___| | _| |__ _____ _| ___(_) | ___ / _| ___ _ __ _ __ ___ __ _| |_ / ___|_ __ ___ __ _| |_ ___| _ \ __ _| |_| |_ ___ _ __ _ __ +;~ | | | '_ \ / _ \/ __| |/ / '_ \ / _ \ \/ / |_ | | |/ _ \ |_ / _ \| '__| '_ ` _ \ / _` | __| | | '__/ _ \/ _` | __/ _ \ |_) / _` | __| __/ _ \ '__| '_ \ +;~ | |___| | | | __/ (__| <| |_) | (_) > <| _| | | | __/ _| (_) | | | | | | | | (_| | |_| |___| | | __/ (_| | || __/ __/ (_| | |_| || __/ | | | | | +;~ ____\____|_| |_|\___|\___|_|\_\_.__/ \___/_/\_\_| |_|_|\___|_| \___/|_| |_| |_| |_|\__,_|\__|\____|_| \___|\__,_|\__\___|_| \__,_|\__|\__\___|_| |_| |_| +;~ |_____| +; Erzeugt das für die _RecursiveFileListToArray() Funktion notwendige Pattern +Func _CheckboxFileformatCreatePattern() + ; Und wieder bei Oscor aus der FotoSort.au3 abgeschaut - bereitet das Suchpattern passend für seine _RecursiveFileListToArray() Funktion auf + Local $s_SaveFileFormat = "" + $s_SearchPattern = "" + For $i = 1 To $aGDIPlusDecoders[0][0] Step 1 + If GUICtrlRead($a_id_CheckboxFileformat[$i]) = $GUI_CHECKED Then + $s_SaveFileFormat = $s_SaveFileFormat & $aGDIPlusDecoders[$i][5] & "|" + $s_SearchPattern = $s_SearchPattern & StringRegExpReplace(StringReplace($aGDIPlusDecoders[$i][6], "*.", ""), ";", "|") & "|" + EndIf + Next + $s_SearchPattern = StringTrimRight($s_SearchPattern, 1) + _ReadFileList() + ; Und die Einstellungen noch sichern + For $i = 0 To (UBound($a_id_CheckboxFileformat) - 1) Step 1 + _SettingsWrite("$a_id_CheckboxFileformat[" & $i & "]", GUICtrlRead($a_id_CheckboxFileformat[$i])) + Next +EndFunc + +; ############################################################################################################################################################################################### +;~ _____ _ _ _ _ _ +;~ | ___|__ | | __| | ___ _ __ / \ __| | __| | +;~ | |_ / _ \| |/ _` |/ _ \ '__| / _ \ / _` |/ _` | +;~ | _| (_) | | (_| | __/ | / ___ \ (_| | (_| | +;~ ____|_| \___/|_|\__,_|\___|_|___/_/ \_\__,_|\__,_| +;~ |_____| |_____| +Func _Folder_Add() + ; Es wurde auf das + geklickt und der Anwender will eine Zeile mehr bekommen + ; Der Abstand zwischen den Zeilen wurde oben bei den Variablen festgelegt: $i_Distance + ; Wie groß ist die Group im Moment überhaupt ? + Local $a_GroupSize = ControlGetPos($h_FormFotoSort2017, "", $id_GroupTargetDirectories) + ; Platzbedarf: Pro Zeile $i_Distance Abstand mal die Anzahl der Zeilen + If (($a_id_TargetDirectories[0][0] + 1) * $i_Distance) >= ($a_GroupSize[3] - $i_Distance) Then + ; Da ist kein Platz mehr! Also nichts zu tun und raus hier + GUICtrlSetState($id_ButtonAddTargetDirectory, $GUI_DISABLE) + Return 1 + EndIf + ; Array mit den Controls um 1 vergrößern + $a_id_TargetDirectories[0][0] = $a_id_TargetDirectories[0][0] + 1 + ReDim $a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] + 1 ][5] + ; Platz schaffen, die Buttons mit + und - eine Zeile tiefer setzen + Local $a_ControlPos = ControlGetPos($h_FormFotoSort2017, "", $a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] - 1][1]) + GUICtrlSetPos($id_ButtonAddTargetDirectory, $a_ControlPos[0], 232 + (($a_id_TargetDirectories[0][0] - 1) * $i_Distance)) + GUICtrlSetPos($id_ButtonRemoveTargetDirectory, $a_ControlPos[0] + 32, 232 + (($a_id_TargetDirectories[0][0] - 1) * $i_Distance)) + ; Und die neuen Buttons und Input bauen: + ; Die Position der Zeile darüber holen + $a_ControlPos = ControlGetPos($h_FormFotoSort2017, "", $a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] - 1 ][1]) + ; Den Button für kopieren + $a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][1] = GUICtrlCreateButton($a_id_TargetDirectories[0][0], $a_ControlPos[0], 200 + (($a_id_TargetDirectories[0][0] - 1) * $i_Distance), 33, 25) + GUICtrlSetOnEvent($a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][1], "_Picture_Copy") + ; Diesen und die nachfolgenden Buttons heften wir Rechts und oben an, Größe ist fix + GUICtrlSetResizing($a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][1], $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) + GUICtrlSetTip($a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][1], "Taste: [" & $a_id_TargetDirectories[0][0] & "]" & @CRLF & "Datei kopieren") + ; Tasten zuweisen, jeweils die Zahlen über den Buchstaben + Nummernblock + If $a_id_TargetDirectories[0][0] < 10 Then ; 2 bis 9 + _AcceleratorKeyAdd($a_id_TargetDirectories[0][0], $a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][1]) + _AcceleratorKeyAdd("{NUMPAD" & $a_id_TargetDirectories[0][0] & "}", $a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][1]) + EndIf + If $a_id_TargetDirectories[0][0] = 10 Then ; und die 10 bekommt die 0 + _AcceleratorKeyAdd("0", $a_id_TargetDirectories[10][1]) + _AcceleratorKeyAdd("{NUMPAD0}", $a_id_TargetDirectories[10][1]) + EndIf + ; Den Button für verschieben + $a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][2] = GUICtrlCreateButton("»", $a_ControlPos[0] + 32, 200 + (($a_id_TargetDirectories[0][0] - 1) * $i_Distance), 33, 25) + GUICtrlSetOnEvent($a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][2], "_Picture_Move") + GUICtrlSetResizing($a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][2], $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) + GUICtrlSetTip($a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][2], "Taste: [Alt] + [" & $a_id_TargetDirectories[0][0] & "]" & @CRLF & "Datei verschieben") + ; gleiche Zahlen, nur in Kombination mit [ALT] + If $a_id_TargetDirectories[0][0] < 10 Then + _AcceleratorKeyAdd("!" & $a_id_TargetDirectories[0][0], $a_id_TargetDirectories[1][2]) + _AcceleratorKeyAdd("!{NUMPAD" & $a_id_TargetDirectories[0][0] & "}", $a_id_TargetDirectories[1][2]) + EndIf + If $a_id_TargetDirectories[0][0] = 10 Then + _AcceleratorKeyAdd("!0", $a_id_TargetDirectories[10][2]) + _AcceleratorKeyAdd("!{NUMPAD0}", $a_id_TargetDirectories[10][2]) + EndIf + ; Das Input mit dem Pfad + $a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][3] = GUICtrlCreateInput("", $a_ControlPos[0] + 67, 200 + (($a_id_TargetDirectories[0][0] - 1) * $i_Distance), 354, 25, BitOR($ES_READONLY,$ES_LEFT, $ES_AUTOHSCROLL), BitOR($WS_EX_CLIENTEDGE, $WS_EX_ACCEPTFILES)) + GUICtrlSetFont($a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][3], $s_FontSizeInputs * $i_AppliedDPI, 400, 0, $s_FontNameInputs) + GUICtrlSetBkColor($a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][3], 0xFFFFE1) + GUICtrlSetResizing($a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][3], $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) + ; Damit das Feld Drag'n Drop annimmt (muss zusätzlich zum Extended-Style gesetzt werden) + GUICtrlSetState($a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][3], $GUI_DROPACCEPTED) + ; Und noch der Button für die Pfadauswahl + $a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][4] = GUICtrlCreateButton("...", $a_ControlPos[0] + 424, 200 + (($a_id_TargetDirectories[0][0] - 1) * $i_Distance), 33, 25) + GUICtrlSetOnEvent($a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][4], "_Folder_Select") + GUICtrlSetResizing($a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][4], $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) + GUICtrlSetTip($a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][4], "Pfad wählen") + ; Ggf den + Button deaktivieren: + Local $a_GroupSize = ControlGetPos($h_FormFotoSort2017, "", $id_GroupTargetDirectories) + If (($a_id_TargetDirectories[0][0] + 1) * $i_Distance) >= ($a_GroupSize[3] - $i_Distance) Then + GUICtrlSetState($id_ButtonAddTargetDirectory, $GUI_DISABLE) + Else + GUICtrlSetState($id_ButtonAddTargetDirectory, $GUI_ENABLE) + EndIf + ; Den - Button aktivieren (wir sind bei mindestens 2 Zeilen) + GUICtrlSetState($id_ButtonRemoveTargetDirectory, $GUI_ENABLE) + ; Titel der Group anpassen + GUICtrlSetData($id_GroupTargetDirectories, " Zielverzeichnisse (1.." & $a_id_TargetDirectories[0][0] & "): ") + _GUICtrlStatusBar_SetText($id_StatusBar, $s_ProfileActive , 2) + ; Anzahl der Ordner sichern + _SettingsWrite("$a_id_TargetDirectories[0][0]" & "-" & $s_ProfileActive, $a_id_TargetDirectories[0][0]) + _SettingsWrite("$i_ProfileActive", $i_ProfileActive) + _SettingsWrite("$s_ProfileActive", $s_ProfileActive) +EndFunc +; ############################################################################################################################################################################################### +;~ _____ _ _ ____ +;~ | ___|__ | | __| | ___ _ __ | _ \ ___ _ __ ___ _____ _____ +;~ | |_ / _ \| |/ _` |/ _ \ '__|| |_) / _ \ '_ ` _ \ / _ \ \ / / _ \ +;~ | _| (_) | | (_| | __/ | | _ < __/ | | | | | (_) \ V / __/ +;~ ____|_| \___/|_|\__,_|\___|_|___|_| \_\___|_| |_| |_|\___/ \_/ \___| +;~ |_____| |_____| +Func _Folder_Remove() + ; Und wieder weg mit der letzten Zeile + ; Falls es die letzte Zeile = Zeile 1 ist gleich wieder raus + If $a_id_TargetDirectories[0][0] = 1 Then + GUICtrlSetState($id_ButtonRemoveTargetDirectory, $GUI_DISABLE) + Return 1 + EndIf + ; Und löschen - erst die Tastenzuweisungen + _AcceleratorKeyDelete($a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][1]) + _AcceleratorKeyDelete($a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][2]) + ; Registry-Schlüssel mit Pfad dazu (also was gesichert wurde) +;~ RegDelete($s_RegistryKeyname, "$a_id_TargetDirectories[" & $a_id_TargetDirectories[0][0] & "][3]" & "-" & $s_ProfileActive) + ; Die 4 Controls + For $i = 1 To 4 Step 1 + GUICtrlDelete($a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][$i]) + $a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][$i] = "" + Next + ; Array wieder verkleinern + $a_id_TargetDirectories[0][0] = $a_id_TargetDirectories[0][0] - 1 + ReDim $a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] + 1 ][5] + ; Die + und - Schaltfläche wieder hochrücken: + Local $a_ControlPos = ControlGetPos($h_FormFotoSort2017, "", $a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][1]) + GUICtrlSetPos($id_ButtonAddTargetDirectory, $a_ControlPos[0], 232 + (($a_id_TargetDirectories[0][0] - 1) * $i_Distance)) + GUICtrlSetPos($id_ButtonRemoveTargetDirectory, $a_ControlPos[0] + 32, 232 + (($a_id_TargetDirectories[0][0] - 1) * $i_Distance)) + ; Sind wir nun die letzte Zeile? + If $a_id_TargetDirectories[0][0] = 1 Then + GUICtrlSetState($id_ButtonRemoveTargetDirectory, $GUI_DISABLE) + Return 1 + EndIf + ; Ggf den + Button wieder aktivieren: + Local $a_GroupSize = ControlGetPos($h_FormFotoSort2017, "", $id_GroupTargetDirectories) + If (($a_id_TargetDirectories[0][0] + 1) * $i_Distance) >= ($a_GroupSize[3] - $i_Distance) Then + GUICtrlSetState($id_ButtonAddTargetDirectory, $GUI_DISABLE) + Else + GUICtrlSetState($id_ButtonAddTargetDirectory, $GUI_ENABLE) + EndIf + ; Titel der Group anpassen + GUICtrlSetData($id_GroupTargetDirectories, " Zielverzeichnisse (1.." & $a_id_TargetDirectories[0][0] & "): ") + ; Anzahl der Ordner sichern (jetzt einer weniger) + _SettingsWrite("$a_id_TargetDirectories[0][0]" & "-" & $s_ProfileActive, $a_id_TargetDirectories[0][0]) +EndFunc +; ############################################################################################################################################################################################### +;~ _____ _ _ ____ _ _ +;~ | ___|__ | | __| | ___ _ __ / ___| ___| | ___ ___| |_ +;~ | |_ / _ \| |/ _` |/ _ \ '__|\___ \ / _ \ |/ _ \/ __| __| +;~ | _| (_) | | (_| | __/ | ___) | __/ | __/ (__| |_ +;~ ____|_| \___/|_|\__,_|\___|_|___|____/ \___|_|\___|\___|\__| +;~ |_____| |_____| +; Wird aktiv wenn der ... Button neben den Quellordner oder einer der Zielordner geklickt wurde +Func _Folder_Select() + Local $_s_Folder ; Da kommt die Rückgabe aus dem FileSelectFolder() Dialog rein + If @GUI_CtrlId = $id_ButtonSelectSourceDirectory Then ; Ist für den Quellpfad + $_s_Folder = FileSelectFolder("Quellordner auswählen", GUICtrlRead($id_InputSourceDirectory), 0, "", $h_FormFotoSort2017) + If $_s_Folder <> "" Then + GUICtrlSetData($id_InputSourceDirectory, $_s_Folder) + _SettingsWrite("$id_InputSourceDirectory", $_s_Folder) + _ReadFileList() +;~ Else + ; Es wurde abgebrochen + ; Standard vom Anfang wiederherstellen. Also so lassen. Also Nix tun + EndIf + Return 0 + EndIf + ; Und hier die Auswahl der anderen Ordner... + For $i = 1 To $a_id_TargetDirectories[0][0] Step 1 + If @GUI_CtrlId = $a_id_TargetDirectories[$i][4] Then + $_s_Folder = FileSelectFolder("Zielordner " & $i & " auswählen", GUICtrlRead($a_id_TargetDirectories[$i][3]), 1, "", $h_FormFotoSort2017) + If $_s_Folder <> "" Then + GUICtrlSetData($a_id_TargetDirectories[$i][3], $_s_Folder) + _SettingsWrite("$a_id_TargetDirectories[0][0]" & "-" & $s_ProfileActive, $a_id_TargetDirectories[0][0]) + _SettingsWrite("$a_id_TargetDirectories[" & $i & "][3]" & "-" & $s_ProfileActive, $_s_Folder) + _SettingsWrite("$i_ProfileActive", $i_ProfileActive) + _SettingsWrite("$s_ProfileActive", $s_ProfileActive) +;~ Else + ; Abbruch ... nix machen oder löschen? + ;GUICtrlSetData($a_id_TargetDirectories[$i][3], "") + EndIf + ExitLoop + EndIf + Next +EndFunc +; ############################################################################################################################################################################################### +Func _GDIPlus_ScaleImage2($hImage, $iNewWidth, $iNewHeight, $iBGColor = 0xFFF0F0F0, $bBGClear = True, $iInterpolationMode = 7) ;coded by UEZ 2012 + Local $iWidth = _GDIPlus_ImageGetWidth($hImage) + Local $iHeight = _GDIPlus_ImageGetHeight($hImage) + + Local $iW, $iH, $f, $fRatio + + If $iWidth > $iHeight Then + $f = $iWidth / $iNewWidth + Else + $f = $iHeight / $iNewHeight + EndIf + $iW = Int($iWidth / $f) + $iH = Int($iHeight / $f) + + If $iW > $iNewWidth Then + $fRatio = $iNewWidth / $iW + $iW = Int($iW * $fRatio) + $iH = Int($iH * $fRatio) + ElseIf $iH > $iNewHeight Then + $fRatio = $iNewHeight / $iH + $iW = Int($iW * $fRatio) + $iH = Int($iH * $fRatio) + EndIf + + Local $hBitmap = DllCall($__g_hGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iW, "int", $iH, "int", 0, "int", 0x0026200A, "ptr", 0, "int*", 0) + If @error Then Return SetError(3, 0, 0) + $hBitmap = $hBitmap[6] + Local $hBmpCtxt = _GDIPlus_ImageGetGraphicsContext($hBitmap) + If $bBGClear Then _GDIPlus_GraphicsClear($hBmpCtxt, $iBGColor) + DllCall($__g_hGDIPDll, "uint", "GdipSetInterpolationMode", "handle", $hBmpCtxt, "int", $iInterpolationMode) + _GDIPlus_GraphicsDrawImageRect($hBmpCtxt, $hImage, 0, 0, $iW, $iH) + _GDIPlus_ImageDispose($hImage) + _GDIPlus_GraphicsDispose($hBmpCtxt) + Return $hBitmap +EndFunc +; ############################################################################################################################################################################################### +;~ ____ _ _ _ _ _____ _ _ _ _ +;~ / ___| ___| |_| | | |_ __ (_) __ _ _ _ ___| ___(_) | ___| \ | | __ _ _ __ ___ ___ +;~ | | _ / _ \ __| | | | '_ \| |/ _` | | | |/ _ \ |_ | | |/ _ \ \| |/ _` | '_ ` _ \ / _ \ +;~ | |_| | __/ |_| |_| | | | | | (_| | |_| | __/ _| | | | __/ |\ | (_| | | | | | | __/ +;~ ____\____|\___|\__|\___/|_| |_|_|\__, |\__,_|\___|_| |_|_|\___|_| \_|\__,_|_| |_| |_|\___| +;~ |_____| |_| +; Wir benötigt falls ein Suffix für das Umbenennen angehängt werden soll +; Oscar hat einfach ein (Zahl) angehängt. Das finde ich beim Windows Explorer schon doof +; Man kan im Input hierzu etwas beliebiges angeben, jedes # daraus wird durch die Zahl ersetzt. +; bei mehreren #### wird mit führenden Nullen aufgefüllt +; sind es zu wenig # wird trotzdem die nächst höhere Zahl gesetzt => ### steht und 1000 wäre dran - kein Problem! +Func _GetUniqueFileName($_s_Filename, $_s_Extension) + Local $_s_NewFilename ; Da kommt der neuen Name rein + Local $_s_NumberString = GUICtrlRead($id_InputSuffix) ; Was für ein Suffix darf es denn sein + Local $_i_NumberOfHash = StringReplace($_s_NumberString, "#", "") ; Zählen wir mal die #m steht dann in @extended + $_i_NumberOfHash = @extended + If $_i_NumberOfHash < 1 Then ; ein # muss schon sein. Fällt erste bei der 2. Datei auf + MsgBox(16, "FEHLER:", "Das anzuhängende Suffic muss mindestens einmal das # enthalten!") + Return -1 + EndIf + Local $_s_ResultStringFormat ; falls wir mit 0 auffüllen müssen kommt hier die passende Zahl rein + Local $_s_Replacement = "" ; oben haben wir die Anzahl der # gezählt. diese werden wir durch die # ersetzten. Wer _#__##_# schreibt hat Pech gehabt + For $y = 1 To $_i_NumberOfHash Step 1 + $_s_Replacement = $_s_Replacement & "#" + Next + Local $_i_Counter = 0 ; ist die Zahl die angehängt wird + While 1 + $_i_Counter = $_i_Counter + 1 + If $_i_NumberOfHash < StringLen(String($_i_Counter)) Then + ; zu wenig # ! Also ignorieren und nur die Zahl nehmen + $_s_ResultStringFormat = $_i_Counter + Else + ; Zahl mit führenden 0en erstellen + $_s_ResultStringFormat = StringFormat("%0" & $_i_NumberOfHash & "d", $_i_Counter) + EndIf + ; Und den neuen Dateinamen zusammenbauen + $_s_NewFilename = $_s_Filename & StringReplace($_s_NumberString, $_s_Replacement, $_s_ResultStringFormat) & $_s_Extension + ; So, neuen namen zusammengebaut, Testen ob es die Datei schon gibt + If FileExists($_s_NewFilename) = 0 Then + ; Gibt es noch nicht! $_s_NewFilename enthält einen passenden Dateinamen! Raus hier! + ExitLoop + EndIf + ; Den Namen gab es wohl auch schon - also noch einmal von vorne! + WEnd + Return $_s_NewFilename ; und den Dateinamen zurück geben +EndFunc +; ############################################################################################################################################################################################### +; Modifizierte Version der original _GUICtrlSetGIF() aus der GIFAnimation.au3 von trancexx, angepasst an das was in diesem Programm benötigt wird +Func _GUICtrlSetGIF_Mod($iControld, $vGIF, $fUpscale = True, $vAdditionalData = Default, $iRenderingStyle = Default, $iForcedARGB = Default) + Local $iScalefactor = 1 + Local $iImgWidth, $iImgHeight, $fDebugInfo = False, $iFactorW, $iFactorH, $iScaleWidth, $iScaleHeight + ; Erst einmal die Größe des GIF ermitteln: + Local $_a_PictureMetrics[5] ; 0 = X / 1 = Y / 2 = Farbtiefe / 3 = Darstellungsgröße in % / 4 = Dateigröße + Local $_a_GIF_Size = _GIF_GetDimension($vGIF) + $_a_PictureMetrics[0] = $_a_GIF_Size[0] + $_a_PictureMetrics[1] = $_a_GIF_Size[1] + $_a_PictureMetrics[2] = "8 Bit" + $_a_PictureMetrics[4] = _ByteSuffix(FileGetSize($vGIF)) + + Local $_a_LabelBehindPicture1 = ControlGetPos($h_FormFotoSort2017, "", $id_LabelBehindPicture1) + Local $_a_LabelBehindPicture2 = ControlGetPos($h_FormFotoSort2017, "", $id_LabelBehindPicture2) + + ; Die eigentliche Funktion +;~ Local $aCtrlPos = WinGetPos(GUICtrlGetHandle($iControld)) + Local $aCtrlPos = ControlGetPos($h_FormFotoSort2017, "", $iControld) + If @error Then Return SetError(6, 0, False) + If $vAdditionalData = Default Then $vAdditionalData = "" + If $aCtrlPos[2] = 0 Then $aCtrlPos[2] = Default + If $aCtrlPos[3] = 0 Then $aCtrlPos[3] = Default + ; So, es wurde sich die Größe des PicControls geholt - und im normalfall wird das Gif einfach in der Größe erstellt. + + ; Anpassung: Wir holen uns die Größe von dem schwarzen Rahmen umzu. Der skaliert nämlich sauber mit + $aCtrlPos[0] = $_a_LabelBehindPicture1[0] + 2 + $aCtrlPos[1] = $_a_LabelBehindPicture1[1] + 2 + $aCtrlPos[2] = $_a_LabelBehindPicture1[2] - 4 + $aCtrlPos[3] = $_a_LabelBehindPicture2[3] - 4 + + If $id_Background = 0 Then + $id_Background = GUICtrlCreateGraphic($aCtrlPos[0], $aCtrlPos[1], $aCtrlPos[2], $aCtrlPos[3]) + GUICtrlSetGraphic($id_Background, $GUI_GR_COLOR, "0x" & Hex(_RGB_2_ARGB($d_BackgroundColor_ARGB), 6), "0x" & Hex(_RGB_2_ARGB($d_BackgroundColor_ARGB),6)) + GUICtrlSetGraphic($id_Background, $GUI_GR_RECT, 0, 0, $aCtrlPos[2], $aCtrlPos[3]) + GUICtrlSetState($id_Background, $GUI_DROPACCEPTED) + EndIf + ; Wir passen es mit den richtigen Seitenverhältnissen an: + $iImgWidth = $_a_PictureMetrics[0] ; die Breite der Grafikdatei holen + $iImgHeight = $_a_PictureMetrics[1] ; die Höhe der Grafikdatei holen + + ; Testen ob wir größer sind: + $iFactorW = $aCtrlPos[2] / $iImgWidth + $iFactorH = $aCtrlPos[3] / $iImgHeight + + + If $iImgWidth > $aCtrlPos[2] Or $iImgHeight > $aCtrlPos[3] Then + ; Ok, wir müssen verkleinern! Was ist denn zu groß? X, Y oder beides? + If $iFactorW > $iFactorH Then + $iScalefactor = $iFactorH + Else + $iScalefactor = $iFactorW + EndIf + Else + ; Testen ob wir kleiner sind + If $iImgWidth < $aCtrlPos[2] Or $iImgHeight < $aCtrlPos[3] Then + ; Vergrößern! + If $b_Upscale = True Then + If $iFactorW > $iFactorH Then + $iScalefactor = $iFactorH + Else + $iScalefactor = $iFactorW + EndIf + Else + $iScalefactor = 1 + EndIf + EndIf + EndIf + Local $iScaleWidth = Int($iImgWidth * $iScalefactor) ; die Breite der skalierten Grafikdatei berechnen + Local $iScaleHeight = Int($iImgHeight * $iScalefactor) ; die Höhe der skalierten Grafikdatei berechnen + $_a_PictureMetrics[3] = Int($iScalefactor * 100) & "%" + _GIF_ExitAnimation($iControld) + _GIF_DeleteGIF($iControld, True) + ; V1: oben links und entsprechend kleiner nach rechts und unten +;~ _GUICtrlCreateGIF($vGIF, $vAdditionalData, $aCtrlPos[0], $aCtrlPos[1], $iScaleWidth, $iScaleHeight, $iRenderingStyle, $iForcedARGB, $iControld) + ; V2: Zentrieren. Also tiefer bzw. nach rechts versetzt + $iFactorW = Int(($aCtrlPos[2] - $iScaleWidth) / 2) + $iFactorH = Int(($aCtrlPos[3] - $iScaleHeight) / 2) + $iControld = _GUICtrlCreateGIF($vGIF, $vAdditionalData, $aCtrlPos[0] + $iFactorW, $aCtrlPos[1] + $iFactorH, $iScaleWidth, $iScaleHeight) + + +;~ _GUICtrlCreateGIF($vGIF, $vAdditionalData, $aCtrlPos[0], $aCtrlPos[1], $aCtrlPos[2], $aCtrlPos[3], $iRenderingStyle, $iForcedARGB, $iControld) + + SetError(@error, @extended, Not @error) + Return $_a_PictureMetrics +EndFunc ;==>_GUICtrlSetGIF_Mod +; ############################################################################################################################################################################################### +;~ ____ _ ____ _ _ ____ _ ___ _____ +;~ / ___|_ _(_)/ ___| |_ _ __| / ___| ___| |_|_ _|_ __ ___ __ _ __ _ ___| ____|_ __ +;~ | | _| | | | | | | __| '__| \___ \ / _ \ __|| || '_ ` _ \ / _` |/ _` |/ _ \ _| \ \/ / +;~ | |_| | |_| | | |___| |_| | | |___) | __/ |_ | || | | | | | (_| | (_| | __/ |___ > < +;~ ____\____|\__,_|_|\____|\__|_| |_|____/ \___|\__|___|_| |_| |_|\__,_|\__, |\___|_____/_/\_\ +;~ |_____| |___/ +;=============================================================================== +; Name: : _GuiCtrlSetImageEx +; Description: : Funktion zum laden von Grafikdateien (alle die GDI+ unterstützt) in ein Pic-Control +; Dabei werden die Grafikdateien proportional in das Pic-Control eingepasst (skaliert) +; Die Grafikdatei darf auch als Variable mit Binärdaten übergeben werden. +; Syntax: : _GuiCtrlSetImageEx([$idPic][, $sImgFile][, $fUpscale][, $iBkColor][, $fDebugInfo]) +; Parameter(s): : $idPic = ID des Pic-Control (kann auch "Default" oder "-1" sein) +; $sImgFile = der Pfad und Dateiname der Grafikdatei oder die Grafikdatei als Variable mit Binärdaten +; $fUpscale = falls TRUE, wird die Grafikdatei auf die Maße des Pic-Control hochscaliert +; $iBkColor = Hintergrundfarbe (Format: ARGB) für das Pic-Control +; $fDebugInfo = falls TRUE, werden ein paar Debugdaten in der Console angezeigt +; Requirement: : oben stehende Includes und AutoIt-Version >= v3.3.12.0 +; Return Value(s): : Im Erfolgsfall wird TRUE zurückgegeben (@error = 0). Ansonsten: +; @error = 1 wenn das Pic-Control nicht existiert +; @error = 2 wenn die Abmessungen des Pic-Control nicht gelesen werden konnten +; @error = 3 wenn die Grafikdatei nicht geladen werden konnte +; Author(s): : Oscar (www.autoit.de) +; Version / Date: : 1.1.0.0 / 14.07.2015 +;=============================================================================== +; Das original von Oscar. Macht die ganze Arbeit im Skript. Hat er als Antwort auf die Frage geschickt wie man die Vorschau dynamisch an die GUI-Größe anpassen kann +; https://autoit.de/index.php/Thread/85338-GUI-Fenster-Gr%C3%B6%C3%9Fen%C3%A4nderung-wie-geht-das-mit-GDIPlus-Elementen/?postID=683416#post683416 +; Funktioniert 1a - Nutze ich abgewandelt (siehe nächste Funktion) +Func _GuiCtrlSetImageEx($idPic = Default, $sImgFile = '', $fUpscale = False, $iBkColor = 0x00000000, $fDebugInfo = False) + Local $hPic, $hParent, $aPos, $hGfx, $hImage, $hBitmap, $hGfxCtxt, $iImgWidth, $iImgHeight, $hBitmapScaled, $hBMP + Local $iScalefactor = 1, $iFactorW, $iFactorH, $iScaleWidth, $iScaleHeight, $iError = 0 + If $idPic = Default Or $idPic <= 0 Then $idPic = _WinAPI_GetDlgCtrlID(GUICtrlGetHandle($idPic)) + $hPic = GUICtrlGetHandle($idPic) ; das Handle vom Pic-Control holen + If Not IsHWnd($hPic) Then Return SetError(1, 0, 0) ; wenn kein Handle, dann Funktion mit Fehlermeldung verlassen + $hParent = _WinAPI_GetParent($hPic) ; das Fenster des Pic-Controls ermitteln + $aPos = ControlGetPos($hParent, '', $idPic) ; die Koordinaten und Abmessungen des Pic-Control ermitteln + _GDIPlus_Startup() ; GDI-Plus starten + $hBitmap = _GDIPlus_BitmapCreateFromScan0($aPos[2], $aPos[3]) ; Eine Bitmap erstellen + $hGfxCtxt = _GDIPlus_ImageGetGraphicsContext($hBitmap) ; Graphic-Context der Bitmap holen + _GDIPlus_GraphicsSetInterpolationMode($hGfxCtxt, $GDIP_INTERPOLATIONMODE_HIGHQUALITYBICUBIC) + _GDIPlus_GraphicsClear($hGfxCtxt, $iBkColor) ; Die Bitmap mit der Hintergrundfarbe füllen + If IsBinary($sImgFile) Then ; wenn die Grafikdatei als Binärdaten übergeben wurde, dann... + $hImage = _GDIPlus_BitmapCreateFromMemory($sImgFile) ; die Grafikdatei aus den Binärdaten laden + If @error Then $iError = 3 ; wenn das laden der Binärdaten fehlgeschlagen ist, dann Errorcode speichern + Else ; sonst (Grafikdatei befindet sich auf Datenträger)... + $hImage = _GDIPlus_BitmapCreateFromFile($sImgFile) ; die Grafikdatei laden + If @error Then $iError = 3 ; wenn das laden der Datei fehlgeschlagen ist, dann Errorcode speichern + EndIf + If Not $iError Then ; wenn kein Fehler aufgetreten ist, dann... + $iImgWidth = _GDIPlus_ImageGetWidth($hImage) ; die Breite der Grafikdatei holen + $iImgHeight = _GDIPlus_ImageGetHeight($hImage) ; die Höhe der Grafikdatei holen + ; wenn die Größe des Pic-Controls kleiner als die Grafikdatei ist oder $fUpscale = True, + ; dann muss die Grafikdatei skaliert werden (Scalefactor berechnen): + If ($aPos[2] < $iImgWidth Or $aPos[3] < $iImgHeight) Or ($fUpscale = True) Then + $iFactorW = $aPos[2] / $iImgWidth + $iFactorH = $aPos[3] / $iImgHeight + $iScalefactor = ($iFactorW > $iFactorH ? $iFactorH : $iFactorW) + EndIf + $iScaleWidth = Int($iImgWidth * $iScalefactor) ; die Breite der skalierten Grafikdatei berechnen + $iScaleHeight = Int($iImgHeight * $iScalefactor) ; die Höhe der skalierten Grafikdatei berechnen + If $fDebugInfo Then ; Debuginformationen ausgeben, wenn gewünscht: + ConsoleWrite(StringFormat('Ctrl-Size: %i x %i\n', $aPos[2], $aPos[3])) + ConsoleWrite(StringFormat('Img-Size: %i x %i\n', $iImgWidth, $iImgHeight)) + ConsoleWrite(StringFormat('Scale-Factor: %f\n', $iScalefactor)) + ConsoleWrite(StringFormat('Scale-Size: %i x %i\n\n', $iScaleWidth, $iScaleHeight)) + EndIf + $hBitmapScaled = _GDIPlus_ImageResize($hImage, $iScaleWidth, $iScaleHeight) ; die Grafikdatei skalieren + ; und zentriert in die Bitmap zeichnen: + _GDIPlus_GraphicsDrawImageRect($hGfxCtxt, $hBitmapScaled, ($aPos[2] - $iScaleWidth) / 2, ($aPos[3] - $iScaleHeight) / 2, $iScaleWidth, $iScaleHeight) + EndIf + _WinAPI_LockWindowUpdate($hParent) + $hBMP = _GDIPlus_BitmapCreateDIBFromBitmap($hBitmap) ; HBitmap von der Bitmap erstellen + _WinAPI_DeleteObject(GUICtrlSendMsg($idPic, $STM_SETIMAGE, $IMAGE_BITMAP, $hBMP)) ; und an das Pic-Control senden + _WinAPI_LockWindowUpdate(0) + ; zum Schluss noch aufräumen... + _WinAPI_DeleteObject($hBMP) + _GDIPlus_BitmapDispose($hBitmapScaled) + _GDIPlus_GraphicsDispose($hGfxCtxt) + _GDIPlus_BitmapDispose($hBitmap) + _GDIPlus_GraphicsDispose($hGfx) + _GDIPlus_BitmapDispose($hImage) + _GDIPlus_Shutdown() + Return SetError($iError, 0, $iError = 0) +EndFunc ;==>_GuiCtrlSetImageEx + +; ############################################################################################################################################################################################### +;~ ____ _ ____ _ _ ____ _ ___ _____ __ __ _ _ __ _ _ +;~ / ___|_ _(_)/ ___| |_ _ __| / ___| ___| |_|_ _|_ __ ___ __ _ __ _ ___| ____|_ __ | \/ | ___ __| (_)/ _(_) ___ __| | +;~ | | _| | | | | | | __| '__| \___ \ / _ \ __|| || '_ ` _ \ / _` |/ _` |/ _ \ _| \ \/ / | |\/| |/ _ \ / _` | | |_| |/ _ \/ _` | +;~ | |_| | |_| | | |___| |_| | | |___) | __/ |_ | || | | | | | (_| | (_| | __/ |___ > < | | | | (_) | (_| | | _| | __/ (_| | +;~ ____\____|\__,_|_|\____|\__|_| |_|____/ \___|\__|___|_| |_| |_|\__,_|\__, |\___|_____/_/\_\___|_| |_|\___/ \__,_|_|_| |_|\___|\__,_| +;~ |_____| |___/ |_____| +; Die Funktion wie zuvor, jedoch abgeändert für dieses Programm +; Änderung 1: Gibt die Bildmaße als Array zurück: $_a_PictureMetrics[5] ; 0 = X / 1 = Y / 2 = Farbtiefe / 3 = Darstellungsgröße in % / 4 = Dateigröße +; also alle Zeilen welche dieses Array enthalten sind neu +Func _GuiCtrlSetImageEx_Modified($idPic = Default, $sImgFile = '', $fUpscale = False, $iBkColor = 0x00000000, $fDebugInfo = False) + Local $_a_PictureMetrics[5] ; 0 = X / 1 = Y / 2 = Farbtiefe / 3 = Darstellungsgröße in % / 4 = Dateigröße + Local $hPic, $hParent, $aPos, $hGfx, $hImage, $hBitmap, $hGfxCtxt, $iImgWidth, $iImgHeight, $hBitmapScaled, $hBMP, $aPixelFormat + Local $iScalefactor = 1, $iFactorW, $iFactorH, $iScaleWidth, $iScaleHeight, $iError = 0 + If $idPic = Default Or $idPic <= 0 Then $idPic = _WinAPI_GetDlgCtrlID(GUICtrlGetHandle($idPic)) + $hPic = GUICtrlGetHandle($idPic) ; das Handle vom Pic-Control holen + If Not IsHWnd($hPic) Then + SetError(1, 0, 0) ; wenn kein Handle, dann Funktion mit Fehlermeldung verlassen + Return $_a_PictureMetrics + EndIf + $hParent = _WinAPI_GetParent($hPic) ; das Fenster des Pic-Controls ermitteln + $aPos = ControlGetPos($hParent, '', $idPic) ; die Koordinaten und Abmessungen des Pic-Control ermitteln + _GDIPlus_Startup() ; GDI-Plus starten + $hBitmap = _GDIPlus_BitmapCreateFromScan0($aPos[2], $aPos[3]) ; Eine Bitmap erstellen + $hGfxCtxt = _GDIPlus_ImageGetGraphicsContext($hBitmap) ; Graphic-Context der Bitmap holen + _GDIPlus_GraphicsSetInterpolationMode($hGfxCtxt, $GDIP_INTERPOLATIONMODE_HIGHQUALITYBICUBIC) + _GDIPlus_GraphicsClear($hGfxCtxt, $iBkColor) ; Die Bitmap mit der Hintergrundfarbe füllen + If IsBinary($sImgFile) Then ; wenn die Grafikdatei als Binärdaten übergeben wurde, dann... + $hImage = _GDIPlus_BitmapCreateFromMemory($sImgFile) ; die Grafikdatei aus den Binärdaten laden + If @error Then $iError = 3 ; wenn das laden der Binärdaten fehlgeschlagen ist, dann Errorcode speichern + Else ; sonst (Grafikdatei befindet sich auf Datenträger)... + $hImage = _GDIPlus_BitmapCreateFromFile($sImgFile) ; die Grafikdatei laden + If @error Then + $iError = 3 ; wenn das laden der Datei fehlgeschlagen ist, dann Errorcode speichern + Else + ; Dateigröße holen + $_a_PictureMetrics[4] = _ByteSuffix(FileGetSize($sImgFile)) + EndIf + EndIf + If Not $iError Then ; wenn kein Fehler aufgetreten ist, dann... + $iImgWidth = _GDIPlus_ImageGetWidth($hImage) ; die Breite der Grafikdatei holen + $iImgHeight = _GDIPlus_ImageGetHeight($hImage) ; die Höhe der Grafikdatei holen + $_a_PictureMetrics[0] = $iImgWidth + $_a_PictureMetrics[1] = $iImgHeight + $aPixelFormat = _GDIPlus_ImageGetPixelFormat($hImage) ; Daten zu Farbtiefe, dpi etc holen + $_a_PictureMetrics[2] = StringFormat("%i Bit", $aPixelFormat[1]) +;~ MsgBox(0, "$aPixelFormat", "$aPixelFormat[0]: " & $aPixelFormat[0] & @CRLF & "$aPixelFormat[1]: " & $_a_PictureMetrics[2]) + ; wenn die Größe des Pic-Controls kleiner als die Grafikdatei ist oder $fUpscale = True, + ; dann muss die Grafikdatei skaliert werden (Scalefactor berechnen): + If ($aPos[2] < $iImgWidth Or $aPos[3] < $iImgHeight) Or ($fUpscale = True) Then + $iFactorW = $aPos[2] / $iImgWidth + $iFactorH = $aPos[3] / $iImgHeight + $iScalefactor = ($iFactorW > $iFactorH ? $iFactorH : $iFactorW) + EndIf + $iScaleWidth = Int($iImgWidth * $iScalefactor) ; die Breite der skalierten Grafikdatei berechnen + $iScaleHeight = Int($iImgHeight * $iScalefactor) ; die Höhe der skalierten Grafikdatei berechnen +;~ $fDebugInfo = True + If $fDebugInfo Then ; Debuginformationen ausgeben, wenn gewünscht: + ConsoleWrite(StringFormat('Ctrl-Size: %i x %i\n', $aPos[2], $aPos[3])) + ConsoleWrite(StringFormat('Img-Size: %i x %i\n', $iImgWidth, $iImgHeight)) + ConsoleWrite(StringFormat('Scale-Factor: %f\n', $iScalefactor)) + ConsoleWrite(StringFormat('Scale-Size: %i x %i\n\n', $iScaleWidth, $iScaleHeight)) + EndIf + $_a_PictureMetrics[3] = Int($iScalefactor * 100) & "%" + $hBitmapScaled = _GDIPlus_ImageResize($hImage, $iScaleWidth, $iScaleHeight) ; die Grafikdatei skalieren + ; und zentriert in die Bitmap zeichnen: + _GDIPlus_GraphicsDrawImageRect($hGfxCtxt, $hBitmapScaled, ($aPos[2] - $iScaleWidth) / 2, ($aPos[3] - $iScaleHeight) / 2, $iScaleWidth, $iScaleHeight) + EndIf + _WinAPI_LockWindowUpdate($hParent) + $hBMP = _GDIPlus_BitmapCreateDIBFromBitmap($hBitmap) ; HBitmap von der Bitmap erstellen + _WinAPI_DeleteObject(GUICtrlSendMsg($idPic, $STM_SETIMAGE, $IMAGE_BITMAP, $hBMP)) ; und an das Pic-Control senden + _WinAPI_LockWindowUpdate(0) + ; zum Schluss noch aufräumen... + _WinAPI_DeleteObject($hBMP) + _GDIPlus_BitmapDispose($hBitmapScaled) + _GDIPlus_GraphicsDispose($hGfxCtxt) + _GDIPlus_BitmapDispose($hBitmap) + _GDIPlus_GraphicsDispose($hGfx) + _GDIPlus_BitmapDispose($hImage) + _GDIPlus_Shutdown() + SetError($iError, 0, $iError = 0) + Return $_a_PictureMetrics +EndFunc ;==>_GuiCtrlSetImageEx + +; ############################################################################################################################################################################################### +;~ _ _ _ +;~ | | | | ___| |_ __ +;~ | |_| |/ _ \ | '_ \ +;~ | _ | __/ | |_) | +;~ ____|_| |_|\___|_| .__/ +;~ |_____| |_| +Func _Help() + ; Transparentes Overlay als Hilfe über dem Fenster - Schritt für Schritt die Bedienelemente + Local $_a_MousePos + ; Drag'n Drop auf die Vorschau und den Quellpfad + Local $_help_Bitmap = _GDIPlus_BitmapCreateFromMemory(_Help_DragNDrop1png()) + Local $_help_h_Bitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($_help_Bitmap) + Local $_i_Width1 = _GDIPlus_ImageGetWidth($_help_Bitmap) + Local $_i_Height1 = _GDIPlus_ImageGetHeight($_help_Bitmap) + Local $_a_ControlPos = _WinAPI_ControlGetPosEx($h_FormFotoSort2017, $id_InputSourceDirectory) + Local $_i_TargetX = $_a_ControlPos[0] + Int($_i_Width1 / 2) - 100 + Local $_i_TargetY = $_a_ControlPos[1] + Local $_help_h_FormHint = GUICreate("FotoSort2017 Hilfe Pfeile", $_i_Width1, $_i_Height1, $_i_TargetX, $_i_TargetY, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST, $WS_EX_TOOLWINDOW)) + GUISetState(@SW_SHOW, $_help_h_FormHint) + _WinAPI_DisplayTransparentBitmapInGUI($_help_h_Bitmap, $_help_h_FormHint, $_i_Width1, $_i_Height1) + + Local $_help_ButtonOK = _GDIPlus_BitmapCreateFromMemory(_Help_ButtonOK()) + Local $_help_h_ButtonOK = _GDIPlus_BitmapCreateHBITMAPFromBitmap($_help_ButtonOK) + Local $_i_Width2 = _GDIPlus_ImageGetWidth($_help_ButtonOK) + Local $_i_Height2 = _GDIPlus_ImageGetHeight($_help_ButtonOK) + Local $_help_h_FormOK = GUICreate("FotoSort2017 Hilfe OK", $_i_Width2, $_i_Height2, $_i_TargetX + $_i_Width1, $_i_TargetY + Int($_i_Height1 / 2 - $_i_Height2 / 2), $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST, $WS_EX_TOOLWINDOW)) + GUISetState(@SW_SHOW, $_help_h_FormOK) + _WinAPI_DisplayTransparentBitmapInGUI($_help_h_ButtonOK, $_help_h_FormOK, $_i_Width2, $_i_Height2) + + AutoItSetOption("GUIOnEventMode", 0) + While 1 + $_a_MousePos = MouseGetPos() + ToolTip("Abbruch der Hilfe mit rechter Maustaste!", $_a_MousePos[0] + 15, $_a_MousePos[1], "Hinweis:") + Sleep(100) + Local $_n_Msg = GUIGetMsg(1) + Switch $_n_Msg[0] + Case $GUI_EVENT_PRIMARYDOWN + If $_n_Msg[1] = $_help_h_FormOK Then + GUISetState(@SW_HIDE, $_help_h_FormOK) + Sleep(250) + ExitLoop + EndIf + Case $GUI_EVENT_SECONDARYDOWN + _GDIPlus_BitmapDispose($_help_Bitmap) + GUIDelete($_help_h_FormHint) + ; Hilfe ist Fertig! + _GDIPlus_BitmapDispose($_help_ButtonOK) + GUIDelete($_help_h_FormOK) + AutoItSetOption("GUIOnEventMode", 1) + ToolTip("") + Return 1 + EndSwitch + WEnd + _GDIPlus_BitmapDispose($_help_Bitmap) + GUIDelete($_help_h_FormHint) + ; Navigieren + $_help_Bitmap = _GDIPlus_BitmapCreateFromMemory(_Help_Navigationpng()) + $_help_h_Bitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($_help_Bitmap) + $_i_Width1 = _GDIPlus_ImageGetWidth($_help_Bitmap) + $_i_Height1 = _GDIPlus_ImageGetHeight($_help_Bitmap) + $_a_ControlPos = _WinAPI_ControlGetPosEx($h_FormFotoSort2017, $id_InputPicNumber) + $_i_TargetX = $_a_ControlPos[0] - 115 + $_i_TargetY = $_a_ControlPos[1] - 358 + $_help_h_FormHint = GUICreate("FotoSort2017 Hilfe Pfeile", $_i_Width1, $_i_Height1, $_i_TargetX, $_i_TargetY, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST,$WS_EX_TOOLWINDOW)) + GUISetState(@SW_SHOW, $_help_h_FormHint) + _WinAPI_DisplayTransparentBitmapInGUI($_help_h_Bitmap, $_help_h_FormHint, $_i_Width1, $_i_Height1) + WinMove($_help_h_FormOK, "", $_i_TargetX , $_i_TargetY - 200) + GUISetState(@SW_SHOW, $_help_h_FormOK) + While 1 + $_a_MousePos = MouseGetPos() + ToolTip("Abbruch der Hilfe mit rechter Maustaste!", $_a_MousePos[0] + 15, $_a_MousePos[1], "Hinweis:") + Sleep(100) + $_n_Msg = GUIGetMsg(1) + Switch $_n_Msg[0] + Case $GUI_EVENT_PRIMARYDOWN + If $_n_Msg[1] = $_help_h_FormOK Then + GUISetState(@SW_HIDE, $_help_h_FormOK) + Sleep(250) + ExitLoop + EndIf + Case $GUI_EVENT_SECONDARYDOWN + _GDIPlus_BitmapDispose($_help_Bitmap) + GUIDelete($_help_h_FormHint) + ; Hilfe ist Fertig! + _GDIPlus_BitmapDispose($_help_ButtonOK) + GUIDelete($_help_h_FormOK) + AutoItSetOption("GUIOnEventMode", 1) + ToolTip("") + Return 1 + EndSwitch + WEnd + _GDIPlus_BitmapDispose($_help_Bitmap) + GUIDelete($_help_h_FormHint) + ; Kopieren oder verschieben + $_help_Bitmap = _GDIPlus_BitmapCreateFromMemory(_Help_CopyMovepng()) + $_help_h_Bitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($_help_Bitmap) + $_i_Width1 = _GDIPlus_ImageGetWidth($_help_Bitmap) + $_i_Height1 = _GDIPlus_ImageGetHeight($_help_Bitmap) + $_a_ControlPos = _WinAPI_ControlGetPosEx($h_FormFotoSort2017, $a_id_TargetDirectories[1][1]) + $_i_TargetX = $_a_ControlPos[0] - 205 + $_i_TargetY = $_a_ControlPos[1] - $_i_Height1 + 15 + $_help_h_FormHint = GUICreate("FotoSort2017 Hilfe Pfeile", $_i_Width1, $_i_Height1, $_i_TargetX, $_i_TargetY, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST,$WS_EX_TOOLWINDOW)) + GUISetState(@SW_SHOW, $_help_h_FormHint) + _WinAPI_DisplayTransparentBitmapInGUI($_help_h_Bitmap, $_help_h_FormHint, $_i_Width1, $_i_Height1) + WinMove($_help_h_FormOK, "", $_i_TargetX + 100, $_i_TargetY + 300) + GUISetState(@SW_SHOW, $_help_h_FormOK) + While 1 + $_a_MousePos = MouseGetPos() + ToolTip("Abbruch der Hilfe mit rechter Maustaste!", $_a_MousePos[0] + 15, $_a_MousePos[1], "Hinweis:") + Sleep(100) + $_n_Msg = GUIGetMsg(1) + Switch $_n_Msg[0] + Case $GUI_EVENT_PRIMARYDOWN + If $_n_Msg[1] = $_help_h_FormOK Then + GUISetState(@SW_HIDE, $_help_h_FormOK) + Sleep(250) + ExitLoop + EndIf + Case $GUI_EVENT_SECONDARYDOWN + _GDIPlus_BitmapDispose($_help_Bitmap) + GUIDelete($_help_h_FormHint) + ; Hilfe ist Fertig! + _GDIPlus_BitmapDispose($_help_ButtonOK) + GUIDelete($_help_h_FormOK) + AutoItSetOption("GUIOnEventMode", 1) + ToolTip("") + Return 1 + EndSwitch + WEnd + _GDIPlus_BitmapDispose($_help_Bitmap) + GUIDelete($_help_h_FormHint) + ; Zielverzeichnis hinzufügen + $_help_Bitmap = _GDIPlus_BitmapCreateFromMemory(_Help_AddTargetDirectoriespng()) + $_help_h_Bitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($_help_Bitmap) + $_i_Width1 = _GDIPlus_ImageGetWidth($_help_Bitmap) + $_i_Height1 = _GDIPlus_ImageGetHeight($_help_Bitmap) + $_a_ControlPos = _WinAPI_ControlGetPosEx($h_FormFotoSort2017, $id_ButtonAddTargetDirectory) + $_i_TargetX = $_a_ControlPos[0] - $_i_Width1 + 10 + $_i_TargetY = $_a_ControlPos[1] - Int($_i_Height1 / 2) + Int($_a_ControlPos[3] / 2) + $_help_h_FormHint = GUICreate("FotoSort2017 Hilfe Pfeile", $_i_Width1, $_i_Height1, $_i_TargetX, $_i_TargetY, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST,$WS_EX_TOOLWINDOW)) + GUISetState(@SW_SHOW, $_help_h_FormHint) + _WinAPI_DisplayTransparentBitmapInGUI($_help_h_Bitmap, $_help_h_FormHint, $_i_Width1, $_i_Height1) + WinMove($_help_h_FormOK, "", $_i_TargetX + 50, $_i_TargetY + 200) + GUISetState(@SW_SHOW, $_help_h_FormOK) + While 1 + $_a_MousePos = MouseGetPos() + ToolTip("Abbruch der Hilfe mit rechter Maustaste!", $_a_MousePos[0] + 15, $_a_MousePos[1], "Hinweis:") + Sleep(100) + $_n_Msg = GUIGetMsg(1) + Switch $_n_Msg[0] + Case $GUI_EVENT_PRIMARYDOWN + If $_n_Msg[1] = $_help_h_FormOK Then + GUISetState(@SW_HIDE, $_help_h_FormOK) + Sleep(250) + ExitLoop + EndIf + Case $GUI_EVENT_SECONDARYDOWN + _GDIPlus_BitmapDispose($_help_Bitmap) + GUIDelete($_help_h_FormHint) + ; Hilfe ist Fertig! + _GDIPlus_BitmapDispose($_help_ButtonOK) + GUIDelete($_help_h_FormOK) + AutoItSetOption("GUIOnEventMode", 1) + ToolTip("") + Return 1 + EndSwitch + WEnd + _GDIPlus_BitmapDispose($_help_Bitmap) + GUIDelete($_help_h_FormHint) + ; Kopieren oder verschieben + $_help_Bitmap = _GDIPlus_BitmapCreateFromMemory(_Help_CopyMovepng()) + $_help_h_Bitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($_help_Bitmap) + $_i_Width1 = _GDIPlus_ImageGetWidth($_help_Bitmap) + $_i_Height1 = _GDIPlus_ImageGetHeight($_help_Bitmap) + $_a_ControlPos = _WinAPI_ControlGetPosEx($h_FormFotoSort2017, $a_id_TargetDirectories[1][1]) + $_i_TargetX = $_a_ControlPos[0] - 205 + $_i_TargetY = $_a_ControlPos[1] - $_i_Height1 + 15 + $_help_h_FormHint = GUICreate("FotoSort2017 Hilfe Pfeile", $_i_Width1, $_i_Height1, $_i_TargetX, $_i_TargetY, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST,$WS_EX_TOOLWINDOW)) + GUISetState(@SW_SHOW, $_help_h_FormHint) + _WinAPI_DisplayTransparentBitmapInGUI($_help_h_Bitmap, $_help_h_FormHint, $_i_Width1, $_i_Height1) + WinMove($_help_h_FormOK, "", $_i_TargetX + 100, $_i_TargetY + 300) + GUISetState(@SW_SHOW, $_help_h_FormOK) + While 1 + $_a_MousePos = MouseGetPos() + ToolTip("Abbruch der Hilfe mit rechter Maustaste!", $_a_MousePos[0] + 15, $_a_MousePos[1], "Hinweis:") + Sleep(100) + $_n_Msg = GUIGetMsg(1) + Switch $_n_Msg[0] + Case $GUI_EVENT_PRIMARYDOWN + If $_n_Msg[1] = $_help_h_FormOK Then + GUISetState(@SW_HIDE, $_help_h_FormOK) + Sleep(250) + ExitLoop + EndIf + Case $GUI_EVENT_SECONDARYDOWN + _GDIPlus_BitmapDispose($_help_Bitmap) + GUIDelete($_help_h_FormHint) + ; Hilfe ist Fertig! + _GDIPlus_BitmapDispose($_help_ButtonOK) + GUIDelete($_help_h_FormOK) + AutoItSetOption("GUIOnEventMode", 1) + ToolTip("") + Return 1 + EndSwitch + WEnd + _GDIPlus_BitmapDispose($_help_Bitmap) + GUIDelete($_help_h_FormHint) + ; Zielverzeichnis wählen + $_help_Bitmap = _GDIPlus_BitmapCreateFromMemory(_Help_DragNDrop2png()) + $_help_h_Bitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($_help_Bitmap) + $_i_Width1 = _GDIPlus_ImageGetWidth($_help_Bitmap) + $_i_Height1 = _GDIPlus_ImageGetHeight($_help_Bitmap) + $_a_ControlPos = _WinAPI_ControlGetPosEx($h_FormFotoSort2017, $a_id_TargetDirectories[1][3]) + $_i_TargetX = $_a_ControlPos[0] - 50 + $_i_TargetY = $_a_ControlPos[1] + $_help_h_FormHint = GUICreate("FotoSort2017 Hilfe Pfeile", $_i_Width1, $_i_Height1, $_i_TargetX, $_i_TargetY, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST, $WS_EX_TOOLWINDOW)) + GUISetState(@SW_SHOW, $_help_h_FormHint) + _WinAPI_DisplayTransparentBitmapInGUI($_help_h_Bitmap, $_help_h_FormHint, $_i_Width1, $_i_Height1) + WinMove($_help_h_FormOK, "", $_i_TargetX + 75, $_i_TargetY + 240) + GUISetState(@SW_SHOW, $_help_h_FormOK) + While 1 + $_a_MousePos = MouseGetPos() + ToolTip("Abbruch der Hilfe mit rechter Maustaste!", $_a_MousePos[0] + 15, $_a_MousePos[1], "Hinweis:") + Sleep(100) + $_n_Msg = GUIGetMsg(1) + Switch $_n_Msg[0] + Case $GUI_EVENT_PRIMARYDOWN + If $_n_Msg[1] = $_help_h_FormOK Then + GUISetState(@SW_HIDE, $_help_h_FormOK) + Sleep(250) + ExitLoop + EndIf + Case $GUI_EVENT_SECONDARYDOWN + _GDIPlus_BitmapDispose($_help_Bitmap) + GUIDelete($_help_h_FormHint) + ; Hilfe ist Fertig! + _GDIPlus_BitmapDispose($_help_ButtonOK) + GUIDelete($_help_h_FormOK) + AutoItSetOption("GUIOnEventMode", 1) + ToolTip("") + Return 1 + EndSwitch + WEnd + _GDIPlus_BitmapDispose($_help_Bitmap) + GUIDelete($_help_h_FormHint) + ; Button Löschen + $_help_Bitmap = _GDIPlus_BitmapCreateFromMemory(_Help_BildLoeschenpng()) + $_help_h_Bitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($_help_Bitmap) + $_i_Width1 = _GDIPlus_ImageGetWidth($_help_Bitmap) + $_i_Height1 = _GDIPlus_ImageGetHeight($_help_Bitmap) + For $i = 0 To (UBound($a_id_Tools) - 1) Step 1 + If $a_id_Tools[$i][0] = "DEL" Then + $_a_ControlPos = _WinAPI_ControlGetPosEx($h_FormFotoSort2017, $a_id_Tools[$i][1]) + ExitLoop + EndIf + Next + $_i_TargetX = $_a_ControlPos[0] - 50 + $_i_TargetY = $_a_ControlPos[1] - $_i_Height1 + 6 + $_help_h_FormHint = GUICreate("FotoSort2017 Hilfe Pfeile", $_i_Width1, $_i_Height1, $_i_TargetX, $_i_TargetY, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST, $WS_EX_TOOLWINDOW)) + GUISetState(@SW_SHOW, $_help_h_FormHint) + _WinAPI_DisplayTransparentBitmapInGUI($_help_h_Bitmap, $_help_h_FormHint, $_i_Width1, $_i_Height1) + WinMove($_help_h_FormOK, "", $_i_TargetX - $_i_Width2 - 20 , $_i_TargetY) + GUISetState(@SW_SHOW, $_help_h_FormOK) + While 1 + $_a_MousePos = MouseGetPos() + ToolTip("Abbruch der Hilfe mit rechter Maustaste!", $_a_MousePos[0] + 15, $_a_MousePos[1], "Hinweis:") + Sleep(100) + $_n_Msg = GUIGetMsg(1) + Switch $_n_Msg[0] + Case $GUI_EVENT_PRIMARYDOWN + If $_n_Msg[1] = $_help_h_FormOK Then + GUISetState(@SW_HIDE, $_help_h_FormOK) + Sleep(250) + ExitLoop + EndIf + Case $GUI_EVENT_SECONDARYDOWN + _GDIPlus_BitmapDispose($_help_Bitmap) + GUIDelete($_help_h_FormHint) + ; Hilfe ist Fertig! + _GDIPlus_BitmapDispose($_help_ButtonOK) + GUIDelete($_help_h_FormOK) + AutoItSetOption("GUIOnEventMode", 1) + ToolTip("") + Return 1 + EndSwitch + WEnd + _GDIPlus_BitmapDispose($_help_Bitmap) + GUIDelete($_help_h_FormHint) + ; Button Umbennen + $_help_Bitmap = _GDIPlus_BitmapCreateFromMemory(_Help_Umbennenpng()) + $_help_h_Bitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($_help_Bitmap) + $_i_Width1 = _GDIPlus_ImageGetWidth($_help_Bitmap) + $_i_Height1 = _GDIPlus_ImageGetHeight($_help_Bitmap) + For $i = 0 To (UBound($a_id_Tools) - 1) Step 1 + If $a_id_Tools[$i][0] = "Rename" Then + $_a_ControlPos = _WinAPI_ControlGetPosEx($h_FormFotoSort2017, $a_id_Tools[$i][1]) + ExitLoop + EndIf + Next + $_i_TargetX = $_a_ControlPos[0] - 50 + $_i_TargetY = $_a_ControlPos[1] - $_i_Height1 + 6 + $_help_h_FormHint = GUICreate("FotoSort2017 Hilfe Pfeile", $_i_Width1, $_i_Height1, $_i_TargetX, $_i_TargetY, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST, $WS_EX_TOOLWINDOW)) + GUISetState(@SW_SHOW, $_help_h_FormHint) + _WinAPI_DisplayTransparentBitmapInGUI($_help_h_Bitmap, $_help_h_FormHint, $_i_Width1, $_i_Height1) + WinMove($_help_h_FormOK, "", $_i_TargetX - $_i_Width2 - 20 , $_i_TargetY) + GUISetState(@SW_SHOW, $_help_h_FormOK) + While 1 + $_a_MousePos = MouseGetPos() + ToolTip("Abbruch der Hilfe mit rechter Maustaste!", $_a_MousePos[0] + 15, $_a_MousePos[1], "Hinweis:") + Sleep(100) + $_n_Msg = GUIGetMsg(1) + Switch $_n_Msg[0] + Case $GUI_EVENT_PRIMARYDOWN + If $_n_Msg[1] = $_help_h_FormOK Then + GUISetState(@SW_HIDE, $_help_h_FormOK) + Sleep(250) + ExitLoop + EndIf + Case $GUI_EVENT_SECONDARYDOWN + _GDIPlus_BitmapDispose($_help_Bitmap) + GUIDelete($_help_h_FormHint) + ; Hilfe ist Fertig! + _GDIPlus_BitmapDispose($_help_ButtonOK) + GUIDelete($_help_h_FormOK) + AutoItSetOption("GUIOnEventMode", 1) + ToolTip("") + Return 1 + EndSwitch + WEnd + _GDIPlus_BitmapDispose($_help_Bitmap) + GUIDelete($_help_h_FormHint) + ; Button Reload + $_help_Bitmap = _GDIPlus_BitmapCreateFromMemory(_Help_Reloadpng()) + $_help_h_Bitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($_help_Bitmap) + $_i_Width1 = _GDIPlus_ImageGetWidth($_help_Bitmap) + $_i_Height1 = _GDIPlus_ImageGetHeight($_help_Bitmap) + For $i = 0 To (UBound($a_id_Tools) - 1) Step 1 + If $a_id_Tools[$i][0] = "RELOAD" Then + $_a_ControlPos = _WinAPI_ControlGetPosEx($h_FormFotoSort2017, $a_id_Tools[$i][1]) + ExitLoop + EndIf + Next + $_i_TargetX = $_a_ControlPos[0] - 55 + $_i_TargetY = $_a_ControlPos[1] - $_i_Height1 + 6 + $_help_h_FormHint = GUICreate("FotoSort2017 Hilfe Pfeile", $_i_Width1, $_i_Height1, $_i_TargetX, $_i_TargetY, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST, $WS_EX_TOOLWINDOW)) + GUISetState(@SW_SHOW, $_help_h_FormHint) + _WinAPI_DisplayTransparentBitmapInGUI($_help_h_Bitmap, $_help_h_FormHint, $_i_Width1, $_i_Height1) + WinMove($_help_h_FormOK, "", $_i_TargetX - $_i_Width2 - 20 , $_i_TargetY) + GUISetState(@SW_SHOW, $_help_h_FormOK) + While 1 + $_a_MousePos = MouseGetPos() + ToolTip("Abbruch der Hilfe mit rechter Maustaste!", $_a_MousePos[0] + 15, $_a_MousePos[1], "Hinweis:") + Sleep(100) + $_n_Msg = GUIGetMsg(1) + Switch $_n_Msg[0] + Case $GUI_EVENT_PRIMARYDOWN + If $_n_Msg[1] = $_help_h_FormOK Then + GUISetState(@SW_HIDE, $_help_h_FormOK) + Sleep(250) + ExitLoop + EndIf + Case $GUI_EVENT_SECONDARYDOWN + _GDIPlus_BitmapDispose($_help_Bitmap) + GUIDelete($_help_h_FormHint) + ; Hilfe ist Fertig! + _GDIPlus_BitmapDispose($_help_ButtonOK) + GUIDelete($_help_h_FormOK) + AutoItSetOption("GUIOnEventMode", 1) + ToolTip("") + Return 1 + EndSwitch + WEnd + _GDIPlus_BitmapDispose($_help_Bitmap) + GUIDelete($_help_h_FormHint) + ; Button Dateiliste + $_help_Bitmap = _GDIPlus_BitmapCreateFromMemory(_Help_FileListpng()) + $_help_h_Bitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($_help_Bitmap) + $_i_Width1 = _GDIPlus_ImageGetWidth($_help_Bitmap) + $_i_Height1 = _GDIPlus_ImageGetHeight($_help_Bitmap) + For $i = 0 To (UBound($a_id_Tools) - 1) Step 1 + If $a_id_Tools[$i][0] = "Filenames" Then + $_a_ControlPos = _WinAPI_ControlGetPosEx($h_FormFotoSort2017, $a_id_Tools[$i][1]) + ExitLoop + EndIf + Next + $_i_TargetX = $_a_ControlPos[0] - 55 + $_i_TargetY = $_a_ControlPos[1] - $_i_Height1 + 6 + $_help_h_FormHint = GUICreate("FotoSort2017 Hilfe Pfeile", $_i_Width1, $_i_Height1, $_i_TargetX, $_i_TargetY, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST, $WS_EX_TOOLWINDOW)) + GUISetState(@SW_SHOW, $_help_h_FormHint) + _WinAPI_DisplayTransparentBitmapInGUI($_help_h_Bitmap, $_help_h_FormHint, $_i_Width1, $_i_Height1) + WinMove($_help_h_FormOK, "", $_i_TargetX - $_i_Width2 - 20 , $_i_TargetY) + GUISetState(@SW_SHOW, $_help_h_FormOK) + While 1 + $_a_MousePos = MouseGetPos() + ToolTip("Abbruch der Hilfe mit rechter Maustaste!", $_a_MousePos[0] + 15, $_a_MousePos[1], "Hinweis:") + Sleep(100) + $_n_Msg = GUIGetMsg(1) + Switch $_n_Msg[0] + Case $GUI_EVENT_PRIMARYDOWN + If $_n_Msg[1] = $_help_h_FormOK Then + GUISetState(@SW_HIDE, $_help_h_FormOK) + Sleep(250) + ExitLoop + EndIf + Case $GUI_EVENT_SECONDARYDOWN + _GDIPlus_BitmapDispose($_help_Bitmap) + GUIDelete($_help_h_FormHint) + ; Hilfe ist Fertig! + _GDIPlus_BitmapDispose($_help_ButtonOK) + GUIDelete($_help_h_FormOK) + AutoItSetOption("GUIOnEventMode", 1) + ToolTip("") + Return 1 + EndSwitch + WEnd + _GDIPlus_BitmapDispose($_help_Bitmap) + GUIDelete($_help_h_FormHint) + ; Button Hintergrundfarbe + $_help_Bitmap = _GDIPlus_BitmapCreateFromMemory(_Help_Backgroundpng()) + $_help_h_Bitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($_help_Bitmap) + $_i_Width1 = _GDIPlus_ImageGetWidth($_help_Bitmap) + $_i_Height1 = _GDIPlus_ImageGetHeight($_help_Bitmap) + For $i = 0 To (UBound($a_id_Tools) - 1) Step 1 + If $a_id_Tools[$i][0] = "BKG" Then + $_a_ControlPos = _WinAPI_ControlGetPosEx($h_FormFotoSort2017, $a_id_Tools[$i][1]) + ExitLoop + EndIf + Next + $_i_TargetX = $_a_ControlPos[0] - 55 + $_i_TargetY = $_a_ControlPos[1] - $_i_Height1 + 6 + $_help_h_FormHint = GUICreate("FotoSort2017 Hilfe Pfeile", $_i_Width1, $_i_Height1, $_i_TargetX, $_i_TargetY, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST, $WS_EX_TOOLWINDOW)) + GUISetState(@SW_SHOW, $_help_h_FormHint) + _WinAPI_DisplayTransparentBitmapInGUI($_help_h_Bitmap, $_help_h_FormHint, $_i_Width1, $_i_Height1) + WinMove($_help_h_FormOK, "", $_i_TargetX - $_i_Width2 - 20 , $_i_TargetY) + GUISetState(@SW_SHOW, $_help_h_FormOK) + While 1 + $_a_MousePos = MouseGetPos() + ToolTip("Abbruch der Hilfe mit rechter Maustaste!", $_a_MousePos[0] + 15, $_a_MousePos[1], "Hinweis:") + Sleep(100) + $_n_Msg = GUIGetMsg(1) + Switch $_n_Msg[0] + Case $GUI_EVENT_PRIMARYDOWN + If $_n_Msg[1] = $_help_h_FormOK Then + GUISetState(@SW_HIDE, $_help_h_FormOK) + Sleep(250) + ExitLoop + EndIf + Case $GUI_EVENT_SECONDARYDOWN + _GDIPlus_BitmapDispose($_help_Bitmap) + GUIDelete($_help_h_FormHint) + ; Hilfe ist Fertig! + _GDIPlus_BitmapDispose($_help_ButtonOK) + GUIDelete($_help_h_FormOK) + AutoItSetOption("GUIOnEventMode", 1) + ToolTip("") + Return 1 + EndSwitch + WEnd + _GDIPlus_BitmapDispose($_help_Bitmap) + GUIDelete($_help_h_FormHint) + ; Reset + $_help_Bitmap = _GDIPlus_BitmapCreateFromMemory(_Help_Resetpng()) + $_help_h_Bitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($_help_Bitmap) + $_i_Width1 = _GDIPlus_ImageGetWidth($_help_Bitmap) + $_i_Height1 = _GDIPlus_ImageGetHeight($_help_Bitmap) + For $i = 0 To (UBound($a_id_Tools) - 1) Step 1 + If $a_id_Tools[$i][0] = "RESET" Then + $_a_ControlPos = _WinAPI_ControlGetPosEx($h_FormFotoSort2017, $a_id_Tools[$i][1]) + ExitLoop + EndIf + Next + $_i_TargetX = $_a_ControlPos[0] - 55 + $_i_TargetY = $_a_ControlPos[1] - $_i_Height1 + 6 + $_help_h_FormHint = GUICreate("FotoSort2017 Hilfe Pfeile", $_i_Width1, $_i_Height1, $_i_TargetX, $_i_TargetY, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST, $WS_EX_TOOLWINDOW)) + GUISetState(@SW_SHOW, $_help_h_FormHint) + _WinAPI_DisplayTransparentBitmapInGUI($_help_h_Bitmap, $_help_h_FormHint, $_i_Width1, $_i_Height1) + WinMove($_help_h_FormOK, "", $_i_TargetX - $_i_Width2 - 20 , $_i_TargetY) + GUISetState(@SW_SHOW, $_help_h_FormOK) + While 1 + $_a_MousePos = MouseGetPos() + ToolTip("Abbruch der Hilfe mit rechter Maustaste!", $_a_MousePos[0] + 15, $_a_MousePos[1], "Hinweis:") + Sleep(100) + $_n_Msg = GUIGetMsg(1) + Switch $_n_Msg[0] + Case $GUI_EVENT_PRIMARYDOWN + If $_n_Msg[1] = $_help_h_FormOK Then + GUISetState(@SW_HIDE, $_help_h_FormOK) + Sleep(250) + ExitLoop + EndIf + Case $GUI_EVENT_SECONDARYDOWN + _GDIPlus_BitmapDispose($_help_Bitmap) + GUIDelete($_help_h_FormHint) + ; Hilfe ist Fertig! + _GDIPlus_BitmapDispose($_help_ButtonOK) + GUIDelete($_help_h_FormOK) + AutoItSetOption("GUIOnEventMode", 1) + ToolTip("") + Return 1 + EndSwitch + WEnd + _GDIPlus_BitmapDispose($_help_Bitmap) + GUIDelete($_help_h_FormHint) + + ; Hilfe ist Fertig! + _GDIPlus_BitmapDispose($_help_ButtonOK) + GUIDelete($_help_h_FormOK) + AutoItSetOption("GUIOnEventMode", 1) + ToolTip("") + + +EndFunc + + +; ############################################################################################################################################################################################### +;~ ____ _ _ _ _ ___ _ _ ____ ____ _ _ +;~ | _ \(_) ___| |_ _ _ _ __ ___ / \ ___| | __/ _ \__ _____ _ ____ ___ __(_) |_ ___| _ \ ___ _ __ __ _ _ __ ___ ___| _ \(_) __ _| | ___ __ _ +;~ | |_) | |/ __| __| | | | '__/ _ \ / _ \ / __| |/ / | | \ \ / / _ \ '__\ \ /\ / / '__| | __/ _ \ |_) / _ \ '_ \ / _` | '_ ` _ \ / _ \ | | | |/ _` | |/ _ \ / _` | +;~ | __/| | (__| |_| |_| | | | __// ___ \\__ \ <| |_| |\ V / __/ | \ V V /| | | | || __/ _ < __/ | | | (_| | | | | | | __/ |_| | | (_| | | (_) | (_| | +;~ ____|_| |_|\___|\__|\__,_|_| \___/_/ \_\___/_|\_\\___/ \_/ \___|_| \_/\_/ |_| |_|\__\___|_| \_\___|_| |_|\__,_|_| |_| |_|\___|____/|_|\__,_|_|\___/ \__, | +;~ |_____| |___/ +; Falls es die Zieldatei schon gibt kann man neben Überschreiben und Suffix auch "Nachfragen" auswählen. +; Da kommt jetzt ein neues Fenster welches Quelle und Ziel nebeneinander zeigt und man zwischen 3 Optionen wählen kann +Func _PictureAskOverwriteRenameDialog($_s_PicSourceFile, $_s_PicTargetFile, $_s_Headline = "Bild ist schon im Zielordner vorhanden:", $_b_Overwrite = True, $_b_Rename = True, $_b_Cancel = True) + GUISetState(@SW_DISABLE, $h_FormFotoSort2017) ; Das Hauptfenster reagiert ab jetzt auf nichts mehr + Local $_s_empty = "" + Local $_a_SourceFile = _PathSplit($_s_PicSourceFile, $_s_empty, $_s_empty, $_s_empty, $_s_empty) + Local $_a_TargetFile = _PathSplit($_s_PicTargetFile, $_s_empty, $_s_empty, $_s_empty, $_s_empty) + Local $_Sub1_h_FormAskOverwriteRename = GUICreate("Überschreiben oder Umbenennen", 1072, 733, -1, -1, $WS_POPUP, $WS_EX_TOPMOST, $h_FormFotoSort2017) + GUISetFont($s_FontSizeForm * $i_AppliedDPI, 400, 0, "$s_FontNameForm") + GUISetBkColor(0x000000) + Local $_Sub1_id_Label1 = GUICtrlCreateLabel($_s_Headline, 0, 4, 1072, 28, BitOR($SS_CENTER,$SS_CENTERIMAGE)) + GUICtrlSetFont($_Sub1_id_Label1, 20 * $i_AppliedDPI, 400, 0, "$s_FontNameForm") + GUICtrlSetColor($_Sub1_id_Label1, 0xC0C0C0) + Local $_Sub1_id_PictureSource = GUICtrlCreatePic("", 5, 40, 514, 530) + Local $_Sub1_id_PictureTarget = GUICtrlCreatePic("", 549, 40, 514, 530) + Local $_Sub1_id_LabelSource = GUICtrlCreateLabel("", 5, 576, 514, 25, BitOR($SS_CENTER,$SS_CENTERIMAGE)) + Local $_Sub1_id_LabelSourceName = GUICtrlCreateLabel($_a_SourceFile[3] & $_a_SourceFile[4], 5, 606, 514, 25, BitOR($SS_CENTER,$SS_CENTERIMAGE)) + GUICtrlSetColor($_Sub1_id_LabelSource, 0xC0C0C0) + GUICtrlSetColor($_Sub1_id_LabelSourceName, 0xC0C0C0) + Local $_Sub1_id_LabelTarget = GUICtrlCreateLabel("", 549, 576, 514, 25, BitOR($SS_CENTER,$SS_CENTERIMAGE)) + Local $_Sub1_id_LabelTargetName = GUICtrlCreateLabel($_a_TargetFile[3] & $_a_TargetFile[4], 549, 606, 514, 25, BitOR($SS_CENTER,$SS_CENTERIMAGE)) + GUICtrlSetColor($_Sub1_id_LabelTarget, 0xC0C0C0) + GUICtrlSetColor($_Sub1_id_LabelTargetName, 0xC0C0C0) + Local $_Sub1_id_ButtonOverwrite = GUICtrlCreateButton(" A Überschreiben", 406, 638, 234, 30, $BS_LEFT) + _WinAPI_DeleteObject(_SendMessage(GUICtrlGetHandle($_Sub1_id_ButtonOverwrite), $BM_SETIMAGE, $IMAGE_BITMAP, $_Resources_Overwriteico)) + If $_b_Overwrite = False Then + GUICtrlSetState($_Sub1_id_ButtonOverwrite, $GUI_DISABLE) + EndIf + Local $_Sub1_id_ButtonRename = GUICtrlCreateButton(" B Umbenennen", 406, 670, 234, 30, $BS_LEFT) + _WinAPI_DeleteObject(_SendMessage(GUICtrlGetHandle($_Sub1_id_ButtonRename), $BM_SETIMAGE, $IMAGE_BITMAP, $_Resources_CheckOffico2)) + If $_b_Rename = False Then + GUICtrlSetState($_Sub1_id_ButtonRename, $GUI_DISABLE) + EndIf + Local $_Sub1_id_ButtonCancel = GUICtrlCreateButton(" C Abbrechen", 406, 702, 234, 30, $BS_LEFT) + _WinAPI_DeleteObject(_SendMessage(GUICtrlGetHandle($_Sub1_id_ButtonCancel), $BM_SETIMAGE, $IMAGE_BITMAP, $_Resources_Cancelico)) + If $_b_Cancel = False Then + GUICtrlSetState($_Sub1_id_ButtonCancel, $GUI_DISABLE) + EndIf + ; Auch hier natürlich mit Tastendruck möglich. Da es nur 4 sind legen wir die eben händisch an + Local $_a_AccKeys[4][2] = [ [ "a", $_Sub1_id_ButtonOverwrite ], [ "b", $_Sub1_id_ButtonRename ], [ "c", $_Sub1_id_ButtonCancel ], [ "{ESC}", $_Sub1_id_ButtonCancel ] ] + GUISetState(@SW_SHOW, $_Sub1_h_FormAskOverwriteRename) + GUISetAccelerators($_a_AccKeys, $_Sub1_h_FormAskOverwriteRename) + ; $_Sub1_a_PicMetrics1: 0 = X / 1 = Y / 2 = Farbtiefe / 3 = Darstellungsgröße in % / 4 = Dateigröße + Local $_Sub1_a_PicMetrics1 = _GuiCtrlSetImageEx_Modified($_Sub1_id_PictureSource, $_s_PicSourceFile, $b_Upscale, 0xFF00AA00, False) + Local $_Sub1_a_PicMetrics2 = _GuiCtrlSetImageEx_Modified($_Sub1_id_PictureTarget, $_s_PicTargetFile, $b_Upscale, 0xFFAA0000, False) + GUICtrlSetData($_Sub1_id_LabelSource, $_Sub1_a_PicMetrics1[0] & " x " & $_Sub1_a_PicMetrics1[1] & " px - " & $_Sub1_a_PicMetrics1[2] & " - " & $_Sub1_a_PicMetrics1[4]) + GUICtrlSetData($_Sub1_id_LabelTarget, $_Sub1_a_PicMetrics2[0] & " x " & $_Sub1_a_PicMetrics2[1] & " px - " & $_Sub1_a_PicMetrics2[2] & " - " & $_Sub1_a_PicMetrics2[4]) + ; Ich wollte das jetzt nicht in das Hauptprogramm einbauen. Der Benutzer darf jetzt schon so lange in dieser Funktion bleiben bis er sich entschieden hat + ; Also klassisch mit einer endlos While 1 Schleife bis ein Button gewählt wurde, Der GUIOnEventMode kommt solange aus (sonst funktioniert GUIGetMsg() nicht) + AutoItSetOption("GUIOnEventMode", 0) + While 1 + Local $_n_Msg = GUIGetMsg() + Switch $_n_Msg + Case $_Sub1_id_ButtonCancel + GUIDelete($_Sub1_h_FormAskOverwriteRename) ; Dialog löschen + AutoItSetOption("GUIOnEventMode", 1) ; GUIOnEventMode wieder an + GUISetState(@SW_ENABLE, $h_FormFotoSort2017) ; Hauptprogramm wieder bedienbar + WinActivate($h_FormFotoSort2017) + If @Compiled = 0 Then + WinSetOnTop($h_FormFotoSort2017, "", $WINDOWS_ONTOP) + Sleep(250) + WinSetOnTop($h_FormFotoSort2017, "", $WINDOWS_NOONTOP) + EndIf + Return "Cancel" ; Ergebnis der Frag zurück geben + Case $_Sub1_id_ButtonOverwrite + GUIDelete($_Sub1_h_FormAskOverwriteRename) + AutoItSetOption("GUIOnEventMode", 1) + GUISetState(@SW_ENABLE, $h_FormFotoSort2017) + WinActivate($h_FormFotoSort2017) + If @Compiled = 0 Then + WinSetOnTop($h_FormFotoSort2017, "", $WINDOWS_ONTOP) + Sleep(250) + WinSetOnTop($h_FormFotoSort2017, "", $WINDOWS_NOONTOP) + EndIf + Return "Overwrite" + Case $_Sub1_id_ButtonRename + GUIDelete($_Sub1_h_FormAskOverwriteRename) + AutoItSetOption("GUIOnEventMode", 1) + GUISetState(@SW_ENABLE, $h_FormFotoSort2017) + WinActivate($h_FormFotoSort2017) + If @Compiled = 0 Then + WinSetOnTop($h_FormFotoSort2017, "", $WINDOWS_ONTOP) + Sleep(250) + WinSetOnTop($h_FormFotoSort2017, "", $WINDOWS_NOONTOP) + EndIf + Return "Rename" + EndSwitch + WEnd +EndFunc +; ############################################################################################################################################################################################### +;~ ____ _ _ ____ +;~ | _ \(_) ___| |_ _ _ _ __ ___ / ___|___ _ __ _ _ +;~ | |_) | |/ __| __| | | | '__/ _ \ | | / _ \| '_ \| | | | +;~ | __/| | (__| |_| |_| | | | __/ | |__| (_) | |_) | |_| | +;~ ____|_| |_|\___|\__|\__,_|_| \___|___\____\___/| .__/ \__, | +;~ |_____| |_____| |_| |___/ +; Kopiert das Bild in den Zielordner +Func _Picture_Copy() + For $i = 1 to $a_id_TargetDirectories[0][0] Step 1 + If @GUI_CtrlId = $a_id_TargetDirectories[$i][1] Then + ; Den eigentlichen Vorgang habe ich ausgelagert da sonst in _Picture_Copy() und _Picture_Move() ganz viel doppelt stehen würde + _Picture_WorkerModule($i, False) ; False = kopieren + ExitLoop + EndIf + Next +EndFunc +; ############################################################################################################################################################################################### +;~ ____ _ _ ____ _ _ +;~ | _ \(_) ___| |_ _ _ _ __ ___ | _ \ ___| | ___| |_ ___ +;~ | |_) | |/ __| __| | | | '__/ _ \ | | | |/ _ \ |/ _ \ __/ _ \ +;~ | __/| | (__| |_| |_| | | | __/ | |_| | __/ | __/ || __/ +;~ ____|_| |_|\___|\__|\__,_|_| \___|___|____/ \___|_|\___|\__\___| +;~ |_____| |_____| +; Löscht das aktuelle Bild. Wenn es nicht klappt bekommt der Benutzer es "wieder" angezeigt +Func _Picture_Delete() + Local $_i_PicNumber = GUICtrlRead($id_InputPicNumber) + If FileRecycle($a_s_PictureFilenames[ $_i_PicNumber ]) = 1 Then + _GUICtrlStatusBar_SetText($id_StatusBar, "Datei gelöscht: " & $a_s_PictureFilenames[ $_i_PicNumber ], 0) + _GUICtrlStatusBar_SetIcon($id_StatusBar, 0, $h_IconCheckOff) + Else + _GUICtrlStatusBar_SetText($id_StatusBar, "Konnte nicht gelöscht werden: " & $a_s_PictureFilenames[ $_i_PicNumber ], 0) + _GUICtrlStatusBar_SetIcon($id_StatusBar, 0, $h_IconWarning) + Return 1 + EndIf + _ArrayDelete($a_s_PictureFilenames, $_i_PicNumber) + $a_s_PictureFilenames[0] = $a_s_PictureFilenames[0] - 1 +;~ _ReadFileList() + _SelectCurrentPicture($_i_PicNumber) +EndFunc +; ############################################################################################################################################################################################### +;~ ____ _ _ __ __ +;~ | _ \(_) ___| |_ _ _ _ __ ___ | \/ | _____ _____ +;~ | |_) | |/ __| __| | | | '__/ _ \ | |\/| |/ _ \ \ / / _ \ +;~ | __/| | (__| |_| |_| | | | __/ | | | | (_) \ V / __/ +;~ ____|_| |_|\___|\__|\__,_|_| \___|___|_| |_|\___/ \_/ \___| +;~ |_____| |_____| +; Verschiebt das Bild. Nein macht es nicht. Bild wird kopiert - und wenn das geklappt hat wird das Original gelöscht +Func _Picture_Move() + For $i = 1 to $a_id_TargetDirectories[0][0] Step 1 + If @GUI_CtrlId = $a_id_TargetDirectories[$i][2] Then + ; Den eigentlichen Vorgang habe ich ausgelagert da sonst in _Picture_Copy() und _Picture_Move() ganz viel doppelt stehen würde + _Picture_WorkerModule($i, True) ; True = "verschieben" + ExitLoop + EndIf + Next +EndFunc +; ############################################################################################################################################################################################### +;~ ____ _ _ __ __ _ __ __ _ _ +;~ | _ \(_) ___| |_ _ _ _ __ ___ \ \ / /__ _ __| | _____ _ __| \/ | ___ __| |_ _| | ___ +;~ | |_) | |/ __| __| | | | '__/ _ \ \ \ /\ / / _ \| '__| |/ / _ \ '__| |\/| |/ _ \ / _` | | | | |/ _ \ +;~ | __/| | (__| |_| |_| | | | __/ \ V V / (_) | | | < __/ | | | | | (_) | (_| | |_| | | __/ +;~ ____|_| |_|\___|\__|\__,_|_| \___|___\_/\_/ \___/|_| |_|\_\___|_| |_| |_|\___/ \__,_|\__,_|_|\___| +;~ |_____| |_____| +Func _Picture_WorkerModule($_i_NumberTargetDirectory, $_b_Move = False) + Local $_b_Error = False ; Zum auswerten ob es Fehler gab. In dem Fall löschen wir nix + Local $_b_FindDoubleFiles = False + If BitAND(GUICtrlRead($id_CheckboxDoubleFiles), $GUI_CHECKED) = $GUI_CHECKED Then + $_b_FindDoubleFiles = True + EndIf + If $_b_Move = False Then + ControlFocus($h_FormFotoSort2017, "", $a_id_TargetDirectories[$_i_NumberTargetDirectory][1]) ; Focus auf den Button Kopieren der Zeile + Else + ControlFocus($h_FormFotoSort2017, "", $a_id_TargetDirectories[$_i_NumberTargetDirectory][2]) ; Focus auf den Button verschieben der Zeile + EndIf + ; Positon vorne / hinten der Zeile holen um unseren Rahmen zu plazieren + $_a_ButtonCopy = ControlGetPos($h_FormFotoSort2017, "", $a_id_TargetDirectories[$_i_NumberTargetDirectory][1]) + $_a_ButtonSelectFolder = ControlGetPos($h_FormFotoSort2017, "", $a_id_TargetDirectories[$_i_NumberTargetDirectory][4]) + ; Und den Rahmen verschieben + ControlMove($h_FormFotoSort2017, "", $id_ThisOne1, $_a_ButtonCopy[0] - 2, $_a_ButtonCopy[1] - 2) + ControlMove($h_FormFotoSort2017, "", $id_ThisOne2, $_a_ButtonCopy[0] - 3, $_a_ButtonCopy[1] - 3) + ; Und einfärben - erst einmal rot + GUICtrlSetColor($id_ThisOne1, 0xFF0000) ; rot + GUICtrlSetColor($id_ThisOne2, 0xFF0000) ; rot + If GUICtrlRead($a_id_TargetDirectories[$_i_NumberTargetDirectory][3]) <> "" And Int(GUICtrlRead($id_InputPicNumber)) > 0 Then + ; Der Check mit den doppelten Dateien + If $_b_FindDoubleFiles = True Then + Local $_i_SizeSourceFile = FileGetSize($a_s_PictureFilenames[ Int(GUICtrlRead($id_InputPicNumber)) ]) + _Crypt_Startup() + Local $_md5_SourceFile = _Crypt_HashFile($a_s_PictureFilenames[ Int(GUICtrlRead($id_InputPicNumber)) ], $CALG_MD5) + $a_s_FilesInTarget = _RecursiveFileListToArray(GUICtrlRead($a_id_TargetDirectories[$_i_NumberTargetDirectory][3]), '(?m)(?i).+\.(' & $s_SearchPattern & ')$', 1, 1, False) + If IsArray($a_s_FilesInTarget) Then + ReDim $a_i_FileSizesInTarget[ $a_s_FilesInTarget[0] + 1 ] + $a_i_FileSizesInTarget[0] = $a_s_FilesInTarget[0] + _GUICtrlStatusBar_SetText($id_StatusBar, "Prüfe " & $a_s_FilesInTarget[0] & " Dateien ...", 0) + _GUICtrlStatusBar_SetIcon($id_StatusBar, 0, $h_IconInfo) + For $z = 1 To $a_s_FilesInTarget[0] Step 1 + $a_i_FileSizesInTarget[$z] = FileGetSize($a_s_FilesInTarget[$z]) + If $a_i_FileSizesInTarget[$z] = $_i_SizeSourceFile Then + If _Crypt_HashFile($a_s_FilesInTarget[$z], $CALG_MD5) = $_md5_SourceFile Then + _PictureAskOverwriteRenameDialog($a_s_PictureFilenames[ GUICtrlRead($id_InputPicNumber) ], $a_s_FilesInTarget[$z], "Identische Datei (gleiche Prüfsumme)", False, False, True) + $i_Timeout = 1000 + _ThisOne() ; setzt den Rahmen von alleine wieder auf unsichtbar + Return + EndIf + EndIf + Next + EndIf + _Crypt_Shutdown() + EndIf + ; Es gibt schon mal einen Zielordner + ; Wir bauen uns den Zielnahmen zusammen + Local $_s_TargetFilename = GUICtrlRead($a_id_TargetDirectories[$_i_NumberTargetDirectory][3]) & "\" & $a_CurrentPictureFilename[0] & $a_CurrentPictureFilename[1] + If FileExists($_s_TargetFilename) = 0 Then ; Zieldatei gibt es nicht, weiter! + If FileCopy($a_s_PictureFilenames[ GUICtrlRead($id_InputPicNumber) ], $_s_TargetFilename, $FC_NOOVERWRITE ) = 1 Then + _GUICtrlStatusBar_SetText($id_StatusBar, "Kopiert nach: " & $_s_TargetFilename, 0) + _GUICtrlStatusBar_SetIcon($id_StatusBar, 0, $h_IconCheckOff) + Else + _GUICtrlStatusBar_SetText($id_StatusBar, "FEHLER beim Kopieren nach: " & $_s_TargetFilename, 0) + _GUICtrlStatusBar_SetIcon($id_StatusBar, 0, $h_IconWarning) + $_b_Error = True ; Es gab einen Fehler - den merken wir uns falls noch gelöscht werden soll + EndIf + Else + ; Einfach kopieren ging nicht, die Zieldatei gibt es schon + If BitAND(GUICtrlRead($id_RadioOverwrite), $GUI_CHECKED) = $GUI_CHECKED Then + ; Aber wir wollen einfach überschreiben! + If FileCopy($a_s_PictureFilenames[ GUICtrlRead($id_InputPicNumber) ], $_s_TargetFilename, $FC_OVERWRITE) = 1 Then + _GUICtrlStatusBar_SetText($id_StatusBar, "Überschrieben: " & $_s_TargetFilename, 0) + _GUICtrlStatusBar_SetIcon($id_StatusBar, 0, $h_IconCheckOff) + Else + _GUICtrlStatusBar_SetText($id_StatusBar, "FEHLER beim Überschreiben von: " & $_s_TargetFilename, 0) + _GUICtrlStatusBar_SetIcon($id_StatusBar, 0, $h_IconWarning) + $_b_Error = True + EndIf + EndIf + If BitAND(GUICtrlRead($id_RadioAddSuffix), $GUI_CHECKED) = $GUI_CHECKED Then + ; Wir wollen ein Suffix anhängen! + $_s_TargetFilename = _GetUniqueFileName(GUICtrlRead($a_id_TargetDirectories[$_i_NumberTargetDirectory][3]) & "\" & $a_CurrentPictureFilename[0], $a_CurrentPictureFilename[1]) + If $_s_TargetFilename = -1 Then + ;Es gab einen eindeutigen neuen Dateinamen zurück. Passiert wenn im Suffix-Feld keine # stehen + Return 1 + EndIf + If FileCopy($a_s_PictureFilenames[ GUICtrlRead($id_InputPicNumber) ], $_s_TargetFilename, $FC_NOOVERWRITE) = 1 Then + _GUICtrlStatusBar_SetText($id_StatusBar, "Kopiert nach: " & $_s_TargetFilename, 0) + _GUICtrlStatusBar_SetIcon($id_StatusBar, 0, $h_IconCheckOff) + Else + _GUICtrlStatusBar_SetText($id_StatusBar, "FEHLER beim Kopieren nach: " & $_s_TargetFilename, 0) + _GUICtrlStatusBar_SetIcon($id_StatusBar, 0, $h_IconWarning) + $_b_Error = True + EndIf + EndIf + If BitAND(GUICtrlRead($id_RadioAskOverwrite), $GUI_CHECKED) = $GUI_CHECKED Then + ; Wir wollen gefragt werden! Also den Dialog mit den beiden Bildern nebeneinander einblenden und das Ergebnis auswerten + Local $_s_Answer = _PictureAskOverwriteRenameDialog($a_s_PictureFilenames[ GUICtrlRead($id_InputPicNumber) ], $_s_TargetFilename) + Switch $_s_Answer + Case "Overwrite" + If FileCopy($a_s_PictureFilenames[ GUICtrlRead($id_InputPicNumber) ], $_s_TargetFilename, $FC_OVERWRITE) = 1 Then + _GUICtrlStatusBar_SetText($id_StatusBar, "Überschrieben: " & $_s_TargetFilename, 0) + _GUICtrlStatusBar_SetIcon($id_StatusBar, 0, $h_IconCheckOff) + Else + _GUICtrlStatusBar_SetText($id_StatusBar, "FEHLER beim Überschreiben von: " & $_s_TargetFilename, 0) + _GUICtrlStatusBar_SetIcon($id_StatusBar, 0, $h_IconWarning) + $_b_Error = True + EndIf + Case "Rename" + $_s_TargetFilename = _GetUniqueFileName(GUICtrlRead($a_id_TargetDirectories[$_i_NumberTargetDirectory][3]) & "\" & $a_CurrentPictureFilename[0], $a_CurrentPictureFilename[1]) + If $_s_TargetFilename = -1 Then + Return 1 + EndIf + If FileCopy($a_s_PictureFilenames[ GUICtrlRead($id_InputPicNumber) ], $_s_TargetFilename, $FC_NOOVERWRITE) = 1 Then + _GUICtrlStatusBar_SetText($id_StatusBar, "Kopiert nach: " & $_s_TargetFilename, 0) + _GUICtrlStatusBar_SetIcon($id_StatusBar, 0, $h_IconCheckOff) + Else + _GUICtrlStatusBar_SetText($id_StatusBar, "FEHLER beim Kopieren nach: " & $_s_TargetFilename, 0) + _GUICtrlStatusBar_SetIcon($id_StatusBar, 0, $h_IconWarning) + $_b_Error = True + EndIf + EndSwitch + EndIf + EndIf + Else + If Int(GUICtrlRead($id_InputPicNumber)) < 1 Then + ; Der Zähler ist auf 0 + _GUICtrlStatusBar_SetText($id_StatusBar, "Fehler: Kein Bild vorhanden!", 0) + _GUICtrlStatusBar_SetIcon($id_StatusBar, 0, $h_IconWarning) + Else + ; Das Feld mit dem Zielordner ist leer + _GUICtrlStatusBar_SetText($id_StatusBar, "Fehler: Zielverzeichnis " & $_i_NumberTargetDirectory & " ist nicht gesetzt", 0) + _GUICtrlStatusBar_SetIcon($id_StatusBar, 0, $h_IconWarning) + EndIf + $_b_Error = True + EndIf + If $_b_Error = False And $_b_Move = True Then + ; Es gab keine Fehler und es soll "verschoben" werden - na dann löschen wir das Original + _Picture_Delete() + EndIf + ; Rahmen auf grün setzen + Sleep(250) + GUICtrlSetColor($id_ThisOne1, 0x00FF00) ; grün + GUICtrlSetColor($id_ThisOne2, 0x00FF00) ; grün + $i_Timeout = 1000 + _ThisOne() ; setzt den Rahmen von alleine wieder auf unsichtbar +EndFunc +; ############################################################################################################################################################################################### +Func _PrimaryDown() + Local $_a_MouseCursorInfo = GUIGetCursorInfo($h_FormFotoSort2017) + If $_a_MouseCursorInfo[4] = $id_Picture Then + Local $_i_DoubleClickSpeed = RegRead('HKCU\Control Panel\Mouse', 'DoubleClickSpeed') + If TimerDiff($i_DoubleClickTimer) < $_i_DoubleClickSpeed Then + ShellExecute($a_s_PictureFilenames[Int(GUICtrlRead($id_InputPicNumber))]) +;~ MsgBox(64, "", $a_s_PictureFilenames[$i_CurrentFilename]) + $i_DoubleClickTimer = TimerInit() + EndIf + EndIf + $i_DoubleClickTimer = TimerInit() + +EndFunc +; ############################################################################################################################################################################################### +;~ ____ __ _ _ _____ _ _ _ +;~ | _ \ _ __ ___ / _(_) | ___ ___ | ____|_ ____ _| |_ _ __ _| |_(_) ___ _ __ +;~ | |_) | '__/ _ \| |_| | |/ _ \/ __| | _| \ \ / / _` | | | | |/ _` | __| |/ _ \| '_ \ +;~ | __/| | | (_) | _| | | __/\__ \ | |___ \ V / (_| | | |_| | (_| | |_| | (_) | | | | +;~ ____|_| |_| \___/|_| |_|_|\___||___/___|_____| \_/ \__,_|_|\__,_|\__,_|\__|_|\___/|_| |_| +;~ |_____| |_____| +Func _Profiles_Evaluation($hWnd, $iMsg, $wParam, $lParam) + #forceref $hWnd, $iMsg, $lParam + Local $_i_Selection = Dec(StringTrimLeft($wParam,2)) - 1000 + GUIRegisterMsg($WM_COMMAND, "WM_COMMAND") + GUIRegisterMsg($WM_CONTEXTMENU, "") + Switch $_i_Selection + Case 101 + ; Speichern +;~ MsgBox(0,"","Speichern unter neuen Namen!") + _Profiles_SaveNew() + Case 102 + ; Umbennen +;~ MsgBox(0,"","Umbennen!") + _Profiles_Rename() + Case 103 + ; Umbennen +;~ MsgBox(0,"","Löschen!") + _Profiles_Delete() + Case 104 + ; Leeren + _Profiles_Empty() + Case 1 To 100 + Local $i_Folders = $a_id_TargetDirectories[0][0] ; Anzahl des gerade noch aktiven Profiles sichern - denn _Folder_Remove() zählt runter + ; Alle Ordner löschen + For $z = 2 To $a_id_TargetDirectories[0][0] Step 1 + _Folder_Remove() + Next + _SettingsWrite("$a_id_TargetDirectories[0][0]" & "-" & $s_ProfileActive, $i_Folders) ; Gesicherte Anzahl wieder setzen - und jetzt wechseln wir zum neuen Profil + $i_ProfileActive = $_i_Selection + $s_ProfileActive = $a_Profiles[$_i_Selection] + _SettingsWrite("$i_ProfileActive", $i_ProfileActive) + _SettingsWrite("$s_ProfileActive", $s_ProfileActive) + GUICtrlSetData($a_id_TargetDirectories[1][3], _SettingsRead("$a_id_TargetDirectories[1][3]" & "-" & $s_ProfileActive)) + For $i = 2 To Int(_SettingsRead("$a_id_TargetDirectories[0][0]" & "-" & $s_ProfileActive)) Step 1 ; gibt es den Wert nicht so ist er 0 - und die Schleife wird nie gestartet + _Folder_Add() + GUICtrlSetData($a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][3], _SettingsRead("$a_id_TargetDirectories[" & $a_id_TargetDirectories[0][0] & "][3]" & "-" & $s_ProfileActive)) + Next + ; Manchmal - warum auch immer - sitzen nach einem Programmstart und einem WinMove die + und - Schaltflächen nicht richtig. Also Sicherheitshalber noch mal die Korrektur laufen lassen + Local $a_ControlPos = ControlGetPos($h_FormFotoSort2017, "", $a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][1]) + GUICtrlSetPos($id_ButtonAddTargetDirectory, $a_ControlPos[0], 232 + (($a_id_TargetDirectories[0][0] - 1) * $i_Distance)) + GUICtrlSetPos($id_ButtonRemoveTargetDirectory, $a_ControlPos[0] + 32, 232 + (($a_id_TargetDirectories[0][0] - 1) * $i_Distance)) + _GUICtrlStatusBar_SetText($id_StatusBar, 'zu Profil "' & $s_ProfileActive & '" gewechselt!', 0) + _GUICtrlStatusBar_SetIcon($id_StatusBar, 0, $h_IconInfo) + _GUICtrlStatusBar_SetText($id_StatusBar, $s_ProfileActive, 2) + EndSwitch +EndFunc ;==>WM_COMMAND +; ############################################################################################################################################################################################### +;~ ____ __ _ _ ____ __ __ +;~ | _ \ _ __ ___ / _(_) | ___ ___ | _ \ ___ _ __ _ _ _ __ | \/ | ___ _ __ _ _ +;~ | |_) | '__/ _ \| |_| | |/ _ \/ __| | |_) / _ \| '_ \| | | | '_ \| |\/| |/ _ \ '_ \| | | | +;~ | __/| | | (_) | _| | | __/\__ \ | __/ (_) | |_) | |_| | |_) | | | | __/ | | | |_| | +;~ ____|_| |_| \___/|_| |_|_|\___||___/___|_| \___/| .__/ \__,_| .__/|_| |_|\___|_| |_|\__,_| +;~ |_____| |_____| |_| |_| +Func _Profiles_PopupMenu($hWnd, $iMsg, $wParam, $lParam) + ; Wird beim Klick auf die Profile-Schaltfläche geöffnet + ; Handle WM_CONTEXTMENU messages + #forceref $hWnd, $iMsg, $lParam + Local $_h_Menu, $_i_Index + $_h_Menu = _GUICtrlMenu_CreatePopup() +;~ $hMenu = _GUICtrlMenu_CreatePopup($MNS_NOCHECK ) + For $i = 1 To $a_Profiles[0] Step 1 + _GUICtrlMenu_InsertMenuItem($_h_Menu, $i - 1, $a_Profiles[$i], (1000 + $i)) + If $a_Profiles[$i] = $s_ProfileActive Then + _GUICtrlMenu_CheckMenuItem($_h_Menu, $i - 1, True) + EndIf + $_i_Index = $i - 1 + Next + $_i_Index = $_i_Index + 1 + _GUICtrlMenu_InsertMenuItem($_h_Menu, $_i_Index, "") + $_i_Index = $_i_Index + 1 + _GUICtrlMenu_InsertMenuItem($_h_Menu, $_i_Index, "Speichern unter neuen Namen", (1101)) + $_i_Index = $_i_Index + 1 + _GUICtrlMenu_InsertMenuItem($_h_Menu, $_i_Index, "Umbennen", (1102)) + $_i_Index = $_i_Index + 1 + _GUICtrlMenu_InsertMenuItem($_h_Menu, $_i_Index, "Leeren", (1104)) + $_i_Index = $_i_Index + 1 + _GUICtrlMenu_InsertMenuItem($_h_Menu, $_i_Index, "Löschen", (1103)) + _GUICtrlMenu_TrackPopupMenu($_h_Menu, $wParam) + _GUICtrlMenu_DestroyMenu($_h_Menu) + Return True +EndFunc ;==>_Profiles_PopupMenu +; ############################################################################################################################################################################################### +Func _Profiles_Delete() + Local $_s_ProfileToDelete = $s_ProfileActive + If $a_Profiles[0] > 1 Then + For $i = 1 To $a_Profiles[0] + If $a_Profiles[$i] = $s_ProfileActive Then + _ArrayDelete($a_Profiles, $i) + ExitLoop + EndIf + Next + $a_Profiles[0] = $a_Profiles[0] - 1 + For $i = 1 To 50 Step 1 + RegDelete($s_RegistryKeyname, "$a_Profiles[" & $i & "]") + Next + For $i = 1 To $a_Profiles[0] Step 1 + _SettingsWrite("$a_Profiles[" & $i & "]", $a_Profiles[$i]) + Next + _SettingsWrite("$a_Profiles[0]", $a_Profiles[0]) + ; Und Zielordner neu aufbauen + ; Alle Ordner löschen + For $z = 2 To $a_id_TargetDirectories[0][0] Step 1 + _Folder_Remove() + Next + For $i = 1 To 30 Step 1 + RegDelete($s_RegistryKeyname, "$a_id_TargetDirectories[" & $i & "][3]" & "-" & $s_ProfileActive) + Next + RegDelete($s_RegistryKeyname, "$a_id_TargetDirectories[0][0]" & "-" & $s_ProfileActive) + $i_ProfileActive = 1 + $s_ProfileActive = $a_Profiles[1] + _SettingsWrite("$i_ProfileActive", $i_ProfileActive) + _SettingsWrite("$s_ProfileActive", $s_ProfileActive) +;~ _SettingsWrite("$a_id_TargetDirectories[0][0]" & "-" & $s_ProfileActive, $a_id_TargetDirectories[0][0]) + GUICtrlSetData($a_id_TargetDirectories[1][3], _SettingsRead("$a_id_TargetDirectories[1][3]" & "-" & $s_ProfileActive)) + For $i = 2 To Int(_SettingsRead("$a_id_TargetDirectories[0][0]" & "-" & $s_ProfileActive)) Step 1 ; gibt es den Wert nicht so ist er 0 - und die Schleife wird nie gestartet + _Folder_Add() + GUICtrlSetData($a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][3], _SettingsRead("$a_id_TargetDirectories[" & $a_id_TargetDirectories[0][0] & "][3]" & "-" & $s_ProfileActive)) + Next + ; Manchmal - warum auch immer - sitzen nach einem Programmstart und einem WinMove die + und - Schaltflächen nicht richtig. Also Sicherheitshalber noch mal die Korrektur laufen lassen +;~ Local $a_ControlPos = ControlGetPos($h_FormFotoSort2017, "", $a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][1]) +;~ GUICtrlSetPos($id_ButtonAddTargetDirectory, $a_ControlPos[0], 232 + (($a_id_TargetDirectories[0][0] - 1) * $i_Distance)) +;~ GUICtrlSetPos($id_ButtonRemoveTargetDirectory, $a_ControlPos[0] + 32, 232 + (($a_id_TargetDirectories[0][0] - 1) * $i_Distance)) + _GUICtrlStatusBar_SetText($id_StatusBar, "Profil gelöscht: " & $_s_ProfileToDelete, 0) + _GUICtrlStatusBar_SetIcon($id_StatusBar, 0, $h_IconInfo) + _GUICtrlStatusBar_SetText($id_StatusBar, $s_ProfileActive, 2) + EndIf +EndFunc +; ############################################################################################################################################################################################### +Func _Profiles_Empty() + For $z = 1 To $a_id_TargetDirectories[0][0] Step 1 + GUICtrlSetData($a_id_TargetDirectories[$z][3], "") + _SettingsWrite("$a_id_TargetDirectories[" & $z & "][3]" & "-" & $s_ProfileActive, "") + Next + _GUICtrlStatusBar_SetText($id_StatusBar, "Zielpfade geleert!", 0) + _GUICtrlStatusBar_SetIcon($id_StatusBar, 0, $h_IconInfo) +EndFunc +; ############################################################################################################################################################################################### +Func _Profiles_Rename() + Local $_s_InputBoxAnswer = InputBox("Profil umbennen","Neuer Name des Profiles:", $a_Profiles[$i_ProfileActive] ," ","-1 ","-1", Default, Default,"300", $h_FormFotoSort2017) + If $_s_InputBoxAnswer <> "" Then + For $i = 1 To $a_id_TargetDirectories[0][0] Step 1 ; Pfade unter altem Profilnamen löschen + RegDelete($s_RegistryKeyname, "$a_id_TargetDirectories[" & $i & "][3]" & "-" & $s_ProfileActive) + Next + $a_Profiles[$i_ProfileActive] = $_s_InputBoxAnswer + _ArraySort($a_Profiles, 0, 1) + For $i = 1 To $a_Profiles[0] Step 1 + _SettingsWrite("$a_Profiles[" & $i & "]", $a_Profiles[$i]) + If $a_Profiles[$i] = $_s_InputBoxAnswer Then + $i_ProfileActive = $i + EndIf + Next + $s_ProfileActive = $_s_InputBoxAnswer + _SettingsWrite("$a_Profiles[0]", $a_Profiles[0]) + _SettingsWrite("$i_ProfileActive", $i_ProfileActive) + _SettingsWrite("$s_ProfileActive", $s_ProfileActive) + _SettingsWrite("$a_id_TargetDirectories[0][0]" & "-" & $s_ProfileActive, $a_id_TargetDirectories[0][0]) + For $i = 1 To $a_id_TargetDirectories[0][0] Step 1 ; Pfade unter neuen Profilnamen wieder schreiben + _SettingsWrite("$a_id_TargetDirectories[" & $i & "][3]" & "-" & $s_ProfileActive, GUICtrlRead($a_id_TargetDirectories[$i][3])) + Next + _GUICtrlStatusBar_SetText($id_StatusBar, "Profil umbenannt: " & $s_ProfileActive, 0) + _GUICtrlStatusBar_SetIcon($id_StatusBar, 0, $h_IconInfo) + _GUICtrlStatusBar_SetText($id_StatusBar, $s_ProfileActive, 2) + Else + _GUICtrlStatusBar_SetText($id_StatusBar, "Fehler: Kein neuer Profilname angegeben", 0) + _GUICtrlStatusBar_SetIcon($id_StatusBar, 0, $h_IconWarning) + EndIf +EndFunc +; ############################################################################################################################################################################################### +Func _Profiles_SaveNew() + Local $_s_InputBoxAnswer = InputBox("Profil speichern","Name des neuen Profiles:", "" ," ","-1 ","-1", Default, Default,"300", $h_FormFotoSort2017) + If $_s_InputBoxAnswer <> "" Then + $i_ProfileActive = 1 + $a_Profiles[0] = $a_Profiles[0] + 1 + ReDim $a_Profiles[ $a_Profiles[0] + 1] + $a_Profiles[ $a_Profiles[0] ] = $_s_InputBoxAnswer + _ArraySort($a_Profiles, 0, 1) + For $i = 1 To $a_Profiles[0] Step 1 + _SettingsWrite("$a_Profiles[" & $i & "]", $a_Profiles[$i]) + If $a_Profiles[$i] = $_s_InputBoxAnswer Then + $i_ProfileActive = $i + EndIf + Next + $s_ProfileActive = $_s_InputBoxAnswer + For $i = 1 To $a_id_TargetDirectories[0][0] + _SettingsWrite("$a_id_TargetDirectories[" & $i & "][3]" & "-" & $s_ProfileActive, GUICtrlRead($a_id_TargetDirectories[$i][3])) + Next + _SettingsWrite("$a_Profiles[0]", $a_Profiles[0]) + _SettingsWrite("$i_ProfileActive", $i_ProfileActive) + _SettingsWrite("$s_ProfileActive", $s_ProfileActive) + _SettingsWrite("$a_id_TargetDirectories[0][0]" & "-" & $s_ProfileActive, $a_id_TargetDirectories[0][0]) + _GUICtrlStatusBar_SetText($id_StatusBar, "Profil gespeichert: " & $s_ProfileActive, 0) + _GUICtrlStatusBar_SetIcon($id_StatusBar, 0, $h_IconInfo) + _GUICtrlStatusBar_SetText($id_StatusBar, $s_ProfileActive, 2) + Else + _GUICtrlStatusBar_SetText($id_StatusBar, "Fehler: Kein Profilname angegeben", 0) + _GUICtrlStatusBar_SetIcon($id_StatusBar, 0, $h_IconWarning) + EndIf +EndFunc +; ############################################################################################################################################################################################### +Func _Profiles_Switch2Next() + ; Überarbeitet: Nicht alle Ordner löschen und wieder neu einrichten sondern Unterschiede in der Anzahl ermitteln und nur die neuen Namen eintragen + Local $_s_ProfileOld, $_i_ProfileOld, $_s_ProfileNew, $_i_ProfileNew + $_s_ProfileOld = $s_ProfileActive + $i_ProfileActive = $i_ProfileActive + 1 + If $i_ProfileActive > $a_Profiles[0] Then + $i_ProfileActive = 1 + EndIf + $s_ProfileActive = $a_Profiles[$i_ProfileActive] + $_s_ProfileNew = $a_Profiles[$i_ProfileActive] + $_i_ProfileOld = Int(_SettingsRead("$a_id_TargetDirectories[0][0]" & "-" & $_s_ProfileOld)) + $_i_ProfileNew = Int(_SettingsRead("$a_id_TargetDirectories[0][0]" & "-" & $_s_ProfileNew)) +;~ MsgBox(0, "$i_ProfileActive", "$i_ProfileActive: " & $i_ProfileActive) + If $_i_ProfileOld > $_i_ProfileNew Then + For $z = 1 To ($_i_ProfileOld - $_i_ProfileNew) Step 1 + _Folder_Remove() + Next + EndIf + If $_i_ProfileOld < $_i_ProfileNew Then + For $z = 1 To ($_i_ProfileNew - $_i_ProfileOld) Step 1 + _Folder_Add() + Next + EndIf + _SettingsWrite("$a_id_TargetDirectories[0][0]" & "-" & $_s_ProfileOld, $_i_ProfileOld) ; Gesicherte Anzahl wieder setzen (_Folder_Remove() setzt den Zähler herunter, löscht aber nicht) + _SettingsWrite("$i_ProfileActive", $i_ProfileActive) + _SettingsWrite("$s_ProfileActive", $s_ProfileActive) + For $i = 1 To $_i_ProfileNew + GUICtrlSetData($a_id_TargetDirectories[$i][3], _SettingsRead("$a_id_TargetDirectories[" & $i & "][3]" & "-" & $_s_ProfileNew)) + Next + _GUICtrlStatusBar_SetText($id_StatusBar, 'zu Profil "' & $s_ProfileActive & '" gewechselt!', 0) + _GUICtrlStatusBar_SetIcon($id_StatusBar, 0, $h_IconInfo) + _GUICtrlStatusBar_SetText($id_StatusBar, $s_ProfileActive, 2) +EndFunc +; ############################################################################################################################################################################################### +;~ ____ _ _ _____ _ _ _____ _ _ +;~ | _ \ __ _ __| (_) ___ | ___(_) | ___| ____|_ _(_)___| |_ ___ +;~ | |_) / _` |/ _` | |/ _ \| |_ | | |/ _ \ _| \ \/ / / __| __/ __| +;~ | _ < (_| | (_| | | (_) | _| | | | __/ |___ > <| \__ \ |_\__ \ +;~ ____|_| \_\__,_|\__,_|_|\___/|_| |_|_|\___|_____/_/\_\_|___/\__|___/ +;~ |_____| +; Die Optione was bei doppelten Dateien passieren soll. Wenn da was geklickt wird in der Registry abspeichern +Func _RadioFileExists() + _SettingsWrite("$id_RadioOverwrite", GUICtrlRead($id_RadioOverwrite)) + _SettingsWrite("$id_RadioAddSuffix", GUICtrlRead($id_RadioAddSuffix)) + _SettingsWrite("$id_RadioAskOverwrite", GUICtrlRead($id_RadioAskOverwrite)) + _SettingsWrite("$id_InputSuffix", GUICtrlRead($id_InputSuffix)) + _SettingsWrite("$id_CheckboxDoubleFiles", GUICtrlRead($id_CheckboxDoubleFiles)) + If @GUI_CtrlId = $id_InputSuffix Then + ; Das gleiche wie beim Input für die Bildnummer. Sobald der Cursor in einem Input steht sind alle Tastenbedienungen aus. + ; Damit die wieder angehen müssen wir den Focus verschieben + ControlFocus($h_FormFotoSort2017, "", $id_Picture) + EndIf +EndFunc +; ############################################################################################################################################################################################### +;~ ____ _ _____ _ _ _ _ _ +;~ | _ \ ___ __ _ __| | ___(_) | ___| | (_)___| |_ +;~ | |_) / _ \/ _` |/ _` | |_ | | |/ _ \ | | / __| __| +;~ | _ < __/ (_| | (_| | _| | | | __/ |___| \__ \ |_ +;~ ____|_| \_\___|\__,_|\__,_|_| |_|_|\___|_____|_|___/\__| +;~ |_____| +; Sorgt dafür das die aktuelle Liste der Dateien erstellt wird +Func _ReadFileList() + Local $_a_dummy[1] = [ 0 ], $_a_LabelBehindPicture1, $_a_LabelBehindPicture2, $_a_PicControlPos + If $s_SearchPattern = "" Then + _GUICtrlStatusBar_SetText($id_StatusBar, "Fehler: Kein Grafikformat ausgewählt" , 0) + _GUICtrlStatusBar_SetIcon($id_StatusBar, 0, $h_IconWarning) + $a_s_PictureFilenames = $_a_dummy + Return 1 + EndIf + If GUICtrlRead($id_InputSourceDirectory) = "" Then + _GUICtrlStatusBar_SetText($id_StatusBar, "Fehler: Kein Quellpfad ausgewählt" , 0) + _GUICtrlStatusBar_SetIcon($id_StatusBar, 0, $h_IconWarning) + $a_s_PictureFilenames = $_a_dummy + Return 1 + EndIf + If FileExists(GUICtrlRead($id_InputSourceDirectory)) = 0 then + GUICtrlSetData($id_InputSourceDirectory, "") + _SettingsWrite("$id_InputSourceDirectory", "") + _GUICtrlStatusBar_SetText($id_StatusBar, "Fehler: Quellpfad existiert nicht" , 0) + _GUICtrlStatusBar_SetIcon($id_StatusBar, 0, $h_IconWarning) + $a_s_PictureFilenames = $_a_dummy + Return 1 + Else + _GUICtrlStatusBar_SetText($id_StatusBar, "Lese Bilderliste ein ..." , 0) + _GUICtrlStatusBar_SetIcon($id_StatusBar, 0, $h_IconInfo) + EndIf + If BitAND(GUICtrlRead($id_CheckboxScanFolderRecursive), $GUI_CHECKED) = $GUI_CHECKED Then + Local $_b_ScanFolderRecursive = True + Else + Local $_b_ScanFolderRecursive = False + EndIf + _SettingsWrite("$_b_ScanFolderRecursive", $_b_ScanFolderRecursive) ; an dieser Stelle speichern wir ob wir rekurisv suchen oder nicht + $a_s_PictureFilenames = _RecursiveFileListToArray(GUICtrlRead($id_InputSourceDirectory), '(?m)(?i).+\.(' & $s_SearchPattern & ')$', 1, 1, $_b_ScanFolderRecursive) + If IsArray($a_s_PictureFilenames) = 0 Then + $a_s_PictureFilenames = $_a_dummy + EndIf +;~ $a_s_PictureFilenames = _RecursiveFileListToArray(GUICtrlRead($id_InputSourceDirectory), '(?i).+\.(' & $s_SearchPattern & ')', 1, 1, $_b_ScanFolderRecursive) + ; Im gegensatz zu Oscar möchte ich meine Dateiliste alphabetisch sortiert + _ArraySort($a_s_PictureFilenames, 0, 1) + If $a_s_PictureFilenames[0] > 0 Then ; und wenn was in der Liste ist das erste Bild auswählen + _SelectCurrentPicture(1) + $i_CurrentFilename = 1 + Else + $_a_LabelBehindPicture1 = ControlGetPos($h_FormFotoSort2017, "", $id_LabelBehindPicture1) + $_a_LabelBehindPicture2 = ControlGetPos($h_FormFotoSort2017, "", $id_LabelBehindPicture2) + $_a_PicControlPos = ControlGetPos($h_FormFotoSort2017, "", $id_Picture) ; aktuelle Position sichern + $_a_PicControlPos[0] = $_a_LabelBehindPicture1[0] + 2 + $_a_PicControlPos[1] = $_a_LabelBehindPicture1[1] + 2 + $_a_PicControlPos[2] = $_a_LabelBehindPicture1[2] - 4 + $_a_PicControlPos[3] = $_a_LabelBehindPicture2[3] - 4 + If $b_GIF = True Then + If $id_Background <> 0 Then + GUICtrlDelete($id_Background) + $id_Background = 0 + EndIf + _GIF_DeleteGIF($id_Picture) + $id_Picture = GUICtrlCreatePic("", $_a_PicControlPos[0], $_a_PicControlPos[1], $_a_PicControlPos[2], $_a_PicControlPos[3]) + GUICtrlSetResizing($id_Picture, $GUI_DOCKLEFT+$GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKBOTTOM) + GUICtrlSetStyle($id_Picture, "", $WS_EX_TOPMOST) + GUICtrlSetState($id_Picture, $GUI_DROPACCEPTED) + $b_GIF = False + EndIf +;~ -Global $h_test = _GDIPlus_ScaleImage2($d_Resources_PicTestBildpngGlobal, $_a_PicControlPos[2], $_a_PicControlPos[3], $d_BackgroundColor_ARGB, True, 7) +;~ _GDIPlus_ImageScale + _GuiCtrlSetImageEx($id_Picture, $d_Resources_PicTestBildpngGlobal, False, $d_BackgroundColor_ARGB, False) +;~ ControlMove($h_FormFotoSort2017, "", $id_Picture, 7, 90, 510, 526) +;~ Sleep(50) +;~ _WinAPI_DeleteObject(GUICtrlSendMsg($id_Picture, $STM_SETIMAGE, $IMAGE_BITMAP, $h_Resources_PicTestBildpngGlobal)) +;~ Sleep(250) +;~ ControlMove($h_FormFotoSort2017, "", $id_Picture, $_a_PicControlPos[0], $_a_PicControlPos[1], $_a_PicControlPos[2], $_a_PicControlPos[3]) + $b_Use_GuiCtrlSetImageEx = False + GUICtrlSetData($id_LabelPictureName, "") + _GUICtrlStatusBar_SetText($id_StatusBar, "Fehler: Keine Bilder gefunden" , 0) + _GUICtrlStatusBar_SetIcon($id_StatusBar, 0, $h_IconWarning) + EndIf +EndFunc +; ############################################################################################################################################################################################### +;~ ____ _ _____ _ _ _ _ _ _____ _ +;~ | _ \ ___ ___ _ _ _ __ ___(_)_ _____| ___(_) | ___| | (_)___| ||_ _|__ / \ _ __ _ __ __ _ _ _ +;~ | |_) / _ \/ __| | | | '__/ __| \ \ / / _ \ |_ | | |/ _ \ | | / __| __|| |/ _ \ / _ \ | '__| '__/ _` | | | | +;~ | _ < __/ (__| |_| | | \__ \ |\ V / __/ _| | | | __/ |___| \__ \ |_ | | (_) / ___ \| | | | | (_| | |_| | +;~ ____|_| \_\___|\___|\__,_|_| |___/_| \_/ \___|_| |_|_|\___|_____|_|___/\__||_|\___/_/ \_\_| |_| \__,_|\__, | +;~ |_____| |___/ +;=============================================================================== +; Function Name: _RecursiveFileListToArray($sPath[, $sPattern][, $iFlag][, $iFormat][, $fRecursion][, $sDelim]) +; Description:: gibt Verzeichnisse (rekursiv) und/oder Dateien zurück, die einem RegExp-Pattern entsprechen +; Parameter(s): $sPath = Startverzeichnis +; $sPattern = ein beliebiges RexExp-Pattern für die Auswahl +; $iFlag = Auswahl +; 0 = Dateien & Verzeichnisse +; 1 = nur Dateien +; 2 = nur Verzeichnisse +; $iFormat = Rückgabeformat +; 0 = String +; 1 = Array mit [0] = Anzahl +; 2 = Nullbasiertes Array +; $fRecursion = Verzeichnisse rekursiv durchsuchen +; False = Nein +; True = Ja +; $sDelim = Trennzeichen für die String-Rückgabe +; Requirement(s): AutoIt 3.3.0.0 +; Return Value(s): Array/String mit den gefundenen Dateien/Verzeichnissen +; Author(s): Oscar (www.autoit.de) +; Anregungen von: bernd670 (www.autoit.de) +; und: AspirinJunkie (www.autoit.de) +;=============================================================================== +; Oscars Funktion ist 4x schneller als das was ich sonst benutzt habe (bei 6000 Dateien statt 2 sec nur 0,05 sec) +Func _RecursiveFileListToArray($sPath, $sPattern = '', $iFlag = 0, $iFormat = 1, $fRecursion = True, $sDelim = @CRLF, $fOpenDLL = True) + Local $hSearch, $sFile, $sReturn = '', $aD + Local Static $hDll + If StringRight($sPath, 1) <> '\' Then $sPath &= '\' + $hSearch = FileFindFirstFile($sPath & '*') + If @error Or $hSearch = -1 Then Return SetError(1, 0, $sReturn) + If $fOpenDLL Then $hDll = DllOpen('kernel32.dll') + While True + $sFile = FileFindNextFile($hSearch) + If @error Then ExitLoop + If @extended Then + $aD = DllCall($hDll, 'dword', 'GetFileAttributesW', 'wstr', $sPath & $sFile) + If @error Or BitAND($aD[0], 0x400) Then ContinueLoop + If StringRegExp($sPath & $sFile, $sPattern) And ($iFlag = 0 Or $iFlag = 2) Then $sReturn &= $sPath & $sFile & '\' & $sDelim + If $fRecursion Then $sReturn &= _RecursiveFileListToArray($sPath & $sFile & '\', $sPattern, $iFlag, 0, True, $sDelim, False) + ContinueLoop + EndIf + If StringRegExp($sFile, $sPattern) And ($iFlag = 0 Or $iFlag = 1) Then $sReturn &= $sPath & $sFile & $sDelim + WEnd + FileClose($hSearch) + If $fOpenDLL Then DllClose($hDll) + If $iFormat And $sReturn = '' Then Return SetError(0, 1, StringSplit($sReturn, '', $iFormat)) + If $iFormat Then Return SetError(0, 2, StringSplit(StringTrimRight($sReturn, StringLen($sDelim)), $sDelim, $iFormat)) + Return $sReturn +EndFunc ;==>_RecursiveFileListToArray +; ############################################################################################################################################################################################### +;~ ____ ____ ____ ____ _ ____ ____ ____ +;~ | _ \ / ___| __ ) |___ \ / \ | _ \ / ___| __ ) +;~ | |_) | | _| _ \ __) | / _ \ | |_) | | _| _ \ +;~ | _ <| |_| | |_) | / __/ / ___ \| _ <| |_| | |_) | +;~ ____|_| \_\\____|____/___|_____|___/_/ \_\_| \_\\____|____/ +;~ |_____| |_____| |_____| +Func _RGB_2_ARGB($d_RGB) + ; Wandelt "normale" RGB-Werte im Format 0XRRGGBB in ARGB-Werte um + ; https://www.autoitscript.com/forum/topic/167489-converting-hexcolor-to-argb/?do=findComment&comment=1225875 + Local $_Blue = BitAND($d_RGB, 0xFF) + Local $_Green = BitAND(BitShift($d_RGB, 8), 0xFF) + Local $_Red = BitAND(BitShift($d_RGB, 16), 0xFF) + Return (0xFF000000 + $_Red * 0x10000 + $_Green * 0x100 + $_Blue) +EndFunc +; ############################################################################################################################################################################################### +;~ ____ _ _ ____ _ ____ _ _ +;~ / ___| ___| | ___ ___| |_ / ___| _ _ __ _ __ ___ _ __ | |_| _ \(_) ___| |_ _ _ _ __ ___ +;~ \___ \ / _ \ |/ _ \/ __| __| | | | | | '__| '__/ _ \ '_ \| __| |_) | |/ __| __| | | | '__/ _ \ +;~ ___) | __/ | __/ (__| |_| |__| |_| | | | | | __/ | | | |_| __/| | (__| |_| |_| | | | __/ +;~ ____|____/ \___|_|\___|\___|\__|\____\__,_|_| |_| \___|_| |_|\__|_| |_|\___|\__|\__,_|_| \___| +;~ |_____| +; Der Funktion übergibt man das gewünschte Bild - und diese sorgt dafür das es angezeigt wird +Func _SelectCurrentPicture($_i_PicNumber = 1) + Local $_a_PicControlPos, $_a_LabelBehindPicture1, $_a_LabelBehindPicture2 + ; Ersteinmal prüfen ob es ein gültiger Wert war, ggf. setzen wir auf das erste oder letzte Bild + If $a_s_PictureFilenames[0] > 0 Then + If $_i_PicNumber < 1 Then + $_i_PicNumber = 1 + EndIf + If $_i_PicNumber > $a_s_PictureFilenames[0] Then + $_i_PicNumber = $a_s_PictureFilenames[0] + EndIf + _GUICtrlStatusBar_SetText($id_StatusBar, "Bild " & $_i_PicNumber & " von " & $a_s_PictureFilenames[0], 1) + GUICtrlSetData($id_InputPicNumber, $_i_PicNumber) + Else + ; Keine gültige Nummer möglich, raus hier + _GUICtrlStatusBar_SetText($id_StatusBar, "", 1) + _GUICtrlStatusBar_SetText($id_StatusBar, "", 3) + GUICtrlSetData($id_InputPicNumber, 0) + WinSetTitle($h_FormFotoSort2017, "", $s_ProgramTitle & " " & $s_ProgramVersion) + Return 1 + EndIf + $d_CurrentPicture = $a_s_PictureFilenames[$_i_PicNumber] ; Noch mal extra in eine Variable - weil wir das in der Funktion WM_SIZE etc. auch noch brauchen + Local $_s_empty = "" + ; Wir dröseln den Pfad des Bildes auseinander + Local $_a_PathSplit = _PathSplit($a_s_PictureFilenames[$_i_PicNumber], $_s_empty, $_s_empty, $_s_empty, $_s_empty) + $a_CurrentPictureFilename[0] = $_a_PathSplit[3] ; Dateiname + $a_CurrentPictureFilename[1] = $_a_PathSplit[4] ; Endung + ; Den Namen tragen wir in der Gui ein: + _GUICtrlStatusBar_SetText($id_StatusBar, $_a_PathSplit[3] & $_a_PathSplit[4], 0) + _GUICtrlStatusBar_SetIcon($id_StatusBar, 0, $h_IconPicture) + GUICtrlSetData($id_LabelPictureName, $_a_PathSplit[3] & $_a_PathSplit[4]) + GUICtrlSetTip($id_LabelPictureName, $_a_PathSplit[3] & $_a_PathSplit[4]) + $_a_LabelBehindPicture1 = ControlGetPos($h_FormFotoSort2017, "", $id_LabelBehindPicture1) + $_a_LabelBehindPicture2 = ControlGetPos($h_FormFotoSort2017, "", $id_LabelBehindPicture2) + If $b_FirstPicture = True Then + ; Sonderlocke erstes Bild. Da wird das PicControl einmal gelöscht und neu erstellt + ; Nutzen wir auch ggf. zur Fehlerbehebung beim Maximieren / Restore + $_a_PicControlPos = ControlGetPos($h_FormFotoSort2017, "", $id_Picture) ; aktuelle Position sichern + GUICtrlDelete($id_Picture) ; löschen + $_a_PicControlPos[0] = $_a_LabelBehindPicture1[0] + 2 + $_a_PicControlPos[1] = $_a_LabelBehindPicture1[1] + 2 + $_a_PicControlPos[2] = $_a_LabelBehindPicture1[2] - 4 + $_a_PicControlPos[3] = $_a_LabelBehindPicture2[3] - 4 + ; Wieder neu erstellen + $id_Picture = GUICtrlCreatePic("", $_a_PicControlPos[0], $_a_PicControlPos[1], $_a_PicControlPos[2], $_a_PicControlPos[3]) + GUICtrlSetResizing($id_Picture, $GUI_DOCKLEFT+$GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKBOTTOM) + GUICtrlSetStyle($id_Picture, "", $WS_EX_TOPMOST) + GUICtrlSetState($id_Picture, $GUI_DROPACCEPTED) + $b_FirstPicture = False + $b_Use_GuiCtrlSetImageEx = True + EndIf + ; Auswerten ob kleinere Bilder gezoomt werden + If BitAND(GUICtrlRead($id_CheckboxPictureFitSize), $GUI_CHECKED) = $GUI_CHECKED Then + $b_Upscale = True + Else + $b_Upscale = False + EndIf + ; $a_CurrentPictureMetrics; 0 = X / 1 = Y / 2 = Farbtiefe / 3 = Darstellungsgröße in % / 4 = Dateigröße + ; Jetzt wird das Bild geladen / gezeichnet + If $a_CurrentPictureFilename[1] = ".gif" Then + $a_CurrentPictureMetrics = _GUICtrlSetGIF_Mod($id_Picture, $d_CurrentPicture, $b_Upscale) + $b_GIF = True + GUICtrlSetState($id_Picture, $GUI_DROPACCEPTED) + Else + If $b_GIF = True Then + If $id_Background <> 0 Then + GUICtrlDelete($id_Background) + $id_Background = 0 + EndIf + $_a_PicControlPos = ControlGetPos($h_FormFotoSort2017, "", $id_Picture) ; aktuelle Position sichern + $_a_PicControlPos[0] = $_a_LabelBehindPicture1[0] + 2 + $_a_PicControlPos[1] = $_a_LabelBehindPicture1[1] + 2 + $_a_PicControlPos[2] = $_a_LabelBehindPicture1[2] - 4 + $_a_PicControlPos[3] = $_a_LabelBehindPicture2[3] - 4 + _GIF_DeleteGIF($id_Picture) + $id_Picture = GUICtrlCreatePic("", $_a_PicControlPos[0], $_a_PicControlPos[1], $_a_PicControlPos[2], $_a_PicControlPos[3]) + GUICtrlSetResizing($id_Picture, $GUI_DOCKLEFT+$GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKBOTTOM) + GUICtrlSetStyle($id_Picture, "", $WS_EX_TOPMOST) + GUICtrlSetState($id_Picture, $GUI_DROPACCEPTED) + $b_GIF = False + EndIf + $a_CurrentPictureMetrics = _GuiCtrlSetImageEx_Modified($id_Picture, $d_CurrentPicture, $b_Upscale, $d_BackgroundColor_ARGB, False) + EndIf + ; Das letzte Bild in der Registry merken + _SettingsWrite("$id_InputPicNumber", GUICtrlRead($id_InputPicNumber)) + _SettingsWrite("$id_CheckboxPictureFitSize", GUICtrlRead($id_CheckboxPictureFitSize)) + _GUICtrlStatusBar_SetText($id_StatusBar, $a_CurrentPictureMetrics[0] & " x " & $a_CurrentPictureMetrics[1] & "px - " & $a_CurrentPictureMetrics[2] & " (" & $a_CurrentPictureMetrics[4] & ")", 3) + _GUICtrlStatusBar_SetIcon($id_StatusBar, 3, $h_IconPicture) + WinSetTitle($h_FormFotoSort2017, "", $s_ProgramTitle & " " & $s_ProgramVersion & " " & $a_CurrentPictureMetrics[0] & " x " & $a_CurrentPictureMetrics[1] & " (" & $a_CurrentPictureMetrics[3] & ")") + ; Und die Navigationbuttons überprüfen + _ButtonPicsCheckEnableDisable() +EndFunc +; ############################################################################################################################################################################################### +;~ ____ _ _ ____ _ ____ _ _ _____ _ +;~ / ___| ___| | ___ ___| |_ / ___| _ _ __ _ __ ___ _ __ | |_| _ \(_) ___| |_ _ _ _ __ __|_ _(_)_ __ ___ ___ _ __ +;~ \___ \ / _ \ |/ _ \/ __| __| | | | | | '__| '__/ _ \ '_ \| __| |_) | |/ __| __| | | | '__/ _ \| | | | '_ ` _ \ / _ \ '__| +;~ ___) | __/ | __/ (__| |_| |__| |_| | | | | | __/ | | | |_| __/| | (__| |_| |_| | | | __/| | | | | | | | | __/ | +;~ ____|____/ \___|_|\___|\___|\__|\____\__,_|_| |_| \___|_| |_|\__|_| |_|\___|\__|\__,_|_| \___||_| |_|_| |_| |_|\___|_| +;~ |_____| +; Wenn die GUI maximiert oder restored wird stimmen die Bildpropertionen meist nicht mehr +; Die einfache Lösung ist in diesem Fall das PictureControl neu zu erstellen +; Das hatte ich erst in den Funktionen id_FormFotoSort2017Maximize() und id_FormFotoSort2017Restore() eingebaut. +; Aber nach irgendeiner Änderung ging das nicht mehr. Die beiden werden jetzt schon aufgerufen bevor die Controls ihre neue Größe haben, +; Die Vorschau bleibt also zu klein oder zu groß. +; Die Lösung war diese Funktion die man einmal anstößt - und dann 250ms später das ganze erledigt +Func _SelectCurrentPictureTimer() + If $i_TimerSelectCurrentPicture = 0 Then + ; Erster Aufruf, wir starten den Timer und AdlibRegister'n uns selbst + $i_TimerSelectCurrentPicture = TimerInit() + AdlibRegister("_SelectCurrentPictureTimer", 250) + Return 0 + EndIf + ; Der 2. oder n. Aufruf: + If TimerDiff($i_TimerSelectCurrentPicture) > 250 Then + AdlibUnRegister("_SelectCurrentPictureTimer") + $i_TimerSelectCurrentPicture = 0 + If Int(GUICtrlRead($id_InputPicNumber)) > 0 Then + $b_FirstPicture = True + _SelectCurrentPicture(GUICtrlRead($id_InputPicNumber)) + EndIf + EndIf +EndFunc +; ############################################################################################################################################################################################### +;~ ____ _ _ _ __ __ _ _ +;~ / ___| ___| |_| |_(_)_ __ __ _ __\ \ / / __(_) |_ ___ +;~ \___ \ / _ \ __| __| | '_ \ / _` / __\ \ /\ / / '__| | __/ _ \ +;~ ___) | __/ |_| |_| | | | | (_| \__ \\ V V /| | | | || __/ +;~ ____|____/ \___|\__|\__|_|_| |_|\__, |___/ \_/\_/ |_| |_|\__\___| +;~ |_____| |___/ +;Schreibt Einstellungen in die Registry, Kürzel um nicht jedesmal das komplette RegWrite zu schreiben +Func _SettingsWrite($_s_Valuename, $_s_Value) + Return RegWrite($s_RegistryKeyname, $_s_Valuename, "REG_SZ", $_s_Value) +EndFunc +; ############################################################################################################################################################################################### +;~ ____ _ _ _ ____ _ +;~ / ___| ___| |_| |_(_)_ __ __ _ ___| _ \ ___ __ _ __| | +;~ \___ \ / _ \ __| __| | '_ \ / _` / __| |_) / _ \/ _` |/ _` | +;~ ___) | __/ |_| |_| | | | | (_| \__ \ _ < __/ (_| | (_| | +;~ ____|____/ \___|\__|\__|_|_| |_|\__, |___/_| \_\___|\__,_|\__,_| +;~ |_____| |___/ +; Wie zuvor, jedoch auslesen +Func _SettingsRead($_s_Valuename) + Return RegRead($s_RegistryKeyname, $_s_Valuename) +EndFunc +; ############################################################################################################################################################################################### +;~ _____ _ _ ___ +;~ |_ _| |__ (_)___ / _ \ _ __ ___ +;~ | | | '_ \| / __| | | | '_ \ / _ \ +;~ | | | | | | \__ \ |_| | | | | __/ +;~ ____|_| |_| |_|_|___/\___/|_| |_|\___| +;~ |_____| +; Um die Buttons leuchte immer ein Rahmen auf wenn die Funktion gewählt wurde. +; Diese Funktion macht den wieder unsichtbar - nach der eingestellten Wartezeit +Func _ThisOne() + If $i_TimerThisOne = 0 Then + $i_TimerThisOne = TimerInit() + AdlibRegister("_ThisOne", 100) + Return 0 + EndIf + If TimerDiff($i_TimerThisOne) > $i_Timeout Then + AdlibUnRegister("_ThisOne") + ; Eine Funktion für alle! + GUICtrlSetColor($id_ThisOne1, 0xC8C8C8) + GUICtrlSetColor($id_ThisOne2, 0xC8C8C8) + GUICtrlSetColor($id_ButtonSelected1, 0xC8C8C8) + GUICtrlSetColor($id_ButtonSelected2, 0xC8C8C8) + GUICtrlSetColor($id_ToolSelected1, 0xC8C8C8) + GUICtrlSetColor($id_ToolSelected2, 0xC8C8C8) + $i_TimerThisOne = 0 + EndIf +EndFunc +; ############################################################################################################################################################################################### +;~ _____ _ +;~ |_ _|__ ___ | |___ +;~ | |/ _ \ / _ \| / __| +;~ | | (_) | (_) | \__ \ +;~ ____|_|\___/ \___/|_|___/ +;~ |_____| +; Verarbeitet die Klicks auf die Tools Button +Func _Tools() + Local $_a_ButtonPos, $_i_PicNumber + $_a_ButtonPos = ControlGetPos($h_FormFotoSort2017, "", @GUI_CtrlId) + GUICtrlSetPos($id_ToolSelected1, $_a_ButtonPos[0] - 1, $_a_ButtonPos[1] - 1) + GUICtrlSetPos($id_ToolSelected2, $_a_ButtonPos[0] - 2, $_a_ButtonPos[1] - 2) + GUICtrlSetColor($id_ToolSelected1, $hex_SignalColor) + GUICtrlSetColor($id_ToolSelected2, $hex_SignalColor) + $i_Timeout = 250 + _ThisOne() + For $i = 0 To (UBound($a_id_Tools) - 1) Step 1 + If @GUI_CtrlId = $a_id_Tools[$i][1] Then + Switch $a_id_Tools[$i][0] + Case "RESET" + ; Alles auf 0 + ; Verzeichnisse + GUICtrlSetData($id_InputSourceDirectory, "") + GUICtrlSetData($a_id_TargetDirectories[1][3], "") + For $z = 2 To $a_id_TargetDirectories[0][0] Step 1 + _Folder_Remove() + Next + ReDim $a_Profiles[2] + $a_Profiles[0] = 1 + $a_Profiles[1] = "Standard" + $i_ProfileActive = 1 + ; GUI + $a_FormFotoSortNew_Size[0] = Int((@DesktopWidth - $i_FormFotoSortNew_SizeMinWidth) / 2) + $a_FormFotoSortNew_Size[1] = Int((@DesktopHeight - $i_FormFotoSortNew_SizeMinHeight) / 2) + $a_FormFotoSortNew_Size[2] = $i_FormFotoSortNew_SizeMinWidth + $a_FormFotoSortNew_Size[3] = $i_FormFotoSortNew_SizeMinHeight + WinMove($h_FormFotoSort2017, "", $a_FormFotoSortNew_Size[0], $a_FormFotoSortNew_Size[1], $a_FormFotoSortNew_Size[2], $a_FormFotoSortNew_Size[3]) + ; Vorschau + _WinAPI_DeleteObject(GUICtrlSendMsg($id_Picture, $STM_SETIMAGE, $IMAGE_BITMAP, $h_Resources_PicTestBildpngGlobal)) + $b_Use_GuiCtrlSetImageEx = False + GUICtrlSetData($id_LabelPictureName, "") + GUICtrlSetTip($id_LabelPictureName, "") + $d_BackgroundColor_ARGB = 0xFF000000 + _GUICtrlStatusBar_SetText($id_StatusBar, "Fehler: Kein Quellpfad ausgewählt" , 0) + _GUICtrlStatusBar_SetIcon($id_StatusBar, 0, $h_IconWarning) + _GUICtrlStatusBar_SetText($id_StatusBar, "" , 1) + _GUICtrlStatusBar_SetText($id_StatusBar, "" , 3) + _GUICtrlStatusBar_SetIcon($id_StatusBar, 3, -1) + WinSetTitle($h_FormFotoSort2017, "", $s_ProgramTitle & " " & $s_ProgramVersion) + Redim $a_s_PictureFilenames[1] + $a_s_PictureFilenames[0] = 0 + GUICtrlSetData($id_InputPicNumber, 0) + _ButtonPicsCheckEnableDisable() + RegDelete($s_RegistryKeyname) + Case "Filenames" + ; Textdatei mit Dateinamen erstellen + If $a_s_PictureFilenames[0] > 0 Then + Local $_s_FilenamesTXT = @TempDir & "\" & StringReplace(StringReplace(GUICtrlRead($id_InputSourceDirectory), "\", "-"), ":", "-") & ".txt" + Local $_h_FilenamesTXT = FileOpen($_s_FilenamesTXT, 2 + 256) + For $z = 1 To $a_s_PictureFilenames[0] Step 1 + FileWriteLine($_h_FilenamesTXT, $a_s_PictureFilenames[$z]) + Next + FileClose($_h_FilenamesTXT) + ShellExecute($_s_FilenamesTXT) + EndIf + Case "DEL" + _Picture_Delete() + Case "RELOAD" + ; Quellordner neu einlesen, wenn möglich das letzte Bild wieder auswählen + $_i_PicNumber = GUICtrlRead($id_InputPicNumber) + _ReadFileList() + _SelectCurrentPicture($_i_PicNumber) + Case "Rename" + $_i_PicNumber = GUICtrlRead($id_InputPicNumber) + Local $_s_InputBoxAnswer = InputBox("Bild umbennen","Neuer Name für die Datei:" & @CRLF & @CRLF & $a_CurrentPictureFilename[0] & $a_CurrentPictureFilename[1] & @CRLF & @CRLF & "(Ohne Dateiendung!)", $a_CurrentPictureFilename[0] ," ","-1 ","-1", Default, Default,"300", $h_FormFotoSort2017) + Local $_s_TargetFilename = StringReplace($a_s_PictureFilenames[ $_i_PicNumber ], $a_CurrentPictureFilename[0] & $a_CurrentPictureFilename[1], $_s_InputBoxAnswer & $a_CurrentPictureFilename[1]) + If $_s_InputBoxAnswer <> "" Then + FileMove($a_s_PictureFilenames[ $_i_PicNumber ], $_s_TargetFilename, $FC_NOOVERWRITE) + $a_s_PictureFilenames[ $_i_PicNumber ] = $_s_TargetFilename + GUICtrlSetData($id_LabelPictureName, $_s_InputBoxAnswer & $a_CurrentPictureFilename[1]) + _GUICtrlStatusBar_SetText($id_StatusBar, $_s_InputBoxAnswer & $a_CurrentPictureFilename[1], 0) + _GUICtrlStatusBar_SetIcon($id_StatusBar, 0, $h_IconPicture) + EndIf + Case "BKG" + ; Hintergrundfarbe ändern + ; Die aktuelle steht in $d_BackgroundColor_ARGB + Local $hex_NewColor = _ChooseColor(2, _ARGB_2_RGB($d_BackgroundColor_ARGB), 2, $h_FormFotoSort2017) + If $hex_NewColor <> -1 Then + $d_BackgroundColor_ARGB = _RGB_2_ARGB($hex_NewColor) + _SelectCurrentPicture(GUICtrlRead($id_InputPicNumber)) + _SettingsWrite("$d_BackgroundColor_ARGB", $d_BackgroundColor_ARGB) + EndIf + Case "Hilfe" + _Help() + Case "Profiles" + ; Unsichtbare GUI erstellen um dieser das Popup anzuheften + Local $h_PopupGUI = GUICreate("", 0, 0, 0, 0) + GUISetState(@SW_SHOW, $h_PopupGUI) + ; Register message handlers + GUIRegisterMsg($WM_COMMAND, "_Profiles_evaluation") + GUIRegisterMsg($WM_CONTEXTMENU, "_Profiles_PopupMenu") + ;~ Sleep(250) + ControlClick($h_PopupGUI, "", "", "right") + GUIDelete($h_PopupGUI) + Case Else + MsgBox(64, "Tools", "Tool gestartet: " & $a_id_Tools[$i][0]) + EndSwitch + ExitLoop + EndIf + Next +EndFunc + +; ############################################################################################################################################################################################### +;~ __ ___ _ ____ ___ ____ _ _ ____ _ ____ _____ +;~ \ \ / (_)_ __ / \ | _ \_ _| / ___|___ _ __ | |_ _ __ ___ | |/ ___| ___| |_| _ \ ___ ___| ____|_ __ +;~ \ \ /\ / /| | '_ \ / _ \ | |_) | | | | / _ \| '_ \| __| '__/ _ \| | | _ / _ \ __| |_) / _ \/ __| _| \ \/ / +;~ \ V V / | | | | |/ ___ \| __/| | | |__| (_) | | | | |_| | | (_) | | |_| | __/ |_| __/ (_) \__ \ |___ > < +;~ ____\_/\_/ |_|_| |_/_/ \_\_| |___|___\____\___/|_| |_|\__|_| \___/|_|\____|\___|\__|_| \___/|___/_____/_/\_\ +;~ |_____| |_____| +; Gibt die Position eines Controls auf den ganzen Bildschirm bezogen zurück +; Abgeleitet aus https://www.autoitscript.com/forum/topic/115616-get-position-of-control-to-the-screen/ +Func _WinAPI_ControlGetPosEx($_h_Form, $_id_OfControl) + Local $_a_Pos = ControlGetPos($_h_Form, "", $_id_OfControl) +;~ MsgBox(0, "Position", "Relative to GUI:" & @CRLF & $aPos[0] & " - " & $aPos[1]) + Local $_t_Point = DllStructCreate("int X;int Y") + DllStructSetData($_t_Point, "X", $_a_Pos[0]) + DllStructSetData($_t_Point, "Y", $_a_Pos[1]) + _WinAPI_ClientToScreen($_h_Form, $_t_Point) + Local $_a_Return[4] + $_a_Return[0] = DllStructGetData($_t_Point, "X") + $_a_Return[1] = DllStructGetData($_t_Point, "Y") + $_a_Return[2] = $_a_Pos[2] + $_a_Return[3] = $_a_Pos[3] +;~ MsgBox(0, "Position", "Relative to Screen:" & @CRLF & DllStructGetData($_t_Point, "X") & " - " & DllStructGetData($_t_Point, "Y")) + Return $_a_Return +EndFunc +; ############################################################################################################################################################################################### +;~ __ ___ _ ____ ___ ____ _ _ _____ _ ____ _ _ ___ ____ _ _ ___ +;~ \ \ / (_)_ __ / \ | _ \_ _| | _ \(_)___ _ __ | | __ _ _ |_ _| __ __ _ _ __ ___ _ __ __ _ _ __ ___ _ __ | |_| __ )(_) |_ _ __ ___ __ _ _ __|_ _|_ __ / ___| | | |_ _| +;~ \ \ /\ / /| | '_ \ / _ \ | |_) | | | | | | / __| '_ \| |/ _` | | | || || '__/ _` | '_ \/ __| '_ \ / _` | '__/ _ \ '_ \| __| _ \| | __| '_ ` _ \ / _` | '_ \| || '_ \| | _| | | || | +;~ \ V V / | | | | |/ ___ \| __/| | | |_| | \__ \ |_) | | (_| | |_| || || | | (_| | | | \__ \ |_) | (_| | | | __/ | | | |_| |_) | | |_| | | | | | (_| | |_) | || | | | |_| | |_| || | +;~ ____\_/\_/ |_|_| |_/_/ \_\_| |___|___|____/|_|___/ .__/|_|\__,_|\__, ||_||_| \__,_|_| |_|___/ .__/ \__,_|_| \___|_| |_|\__|____/|_|\__|_| |_| |_|\__,_| .__/___|_| |_|\____|\___/|___| +;~ |_____| |_____| |_| |___/ |_| |_| +; #FUNCTION# ==================================================================================================================== +; Name ..........: _WinAPI_DisplayTransparentBitmapInGUI +; Description ...: +; Syntax ........: _WinAPI_DisplayTransparentBitmapInGUI($hHBitmap, $hGUI, $iW, $iH[, $iOpacity = 0xFF]) +; Parameters ....: $hHBitmap - a handle to the bitmap +; $hGUI - a handle to the GUI +; $iW - width of bitmap +; $iH - height of bitmap +; $iOpacity - [optional] a hex value for Opacity. Default is 0xFF (255) = total transparent +; Return values .: None +; =============================================================================================================================== +Func _WinAPI_DisplayTransparentBitmapInGUI($hHBitmap, $hGUI,$iW ,$iH, $iOpacity = 0xFF) + If Not BitAND(GUIGetStyle($hGUI)[1], $WS_EX_LAYERED) = $WS_EX_LAYERED Then Return SetError(1, 0, 0) + Local Const $hScrDC = _WinAPI_GetDC(0), $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC), $hOld = _WinAPI_SelectObject($hMemDC, $hHBitmap) + Local $tSize = DllStructCreate($tagSIZE) + $tSize.X = $iW + $tSize.Y = $iH + Local $tSource = DllStructCreate($tagPOINT) + Local $tBlend = DllStructCreate($tagBLENDFUNCTION) + $tBlend.Alpha = $iOpacity + $tBlend.Format = 1 + _WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, DllStructGetPtr($tSize), $hMemDC, DllStructGetPtr($tSource), 0, DllStructGetPtr($tBlend), $ULW_ALPHA) + _WinAPI_ReleaseDC(0, $hScrDC) + _WinAPI_SelectObject($hMemDC, $hOld) + _WinAPI_DeleteObject($hHBitmap) + _WinAPI_DeleteDC($hMemDC) + Return True +EndFunc +; ############################################################################################################################################################################################### +;====================================================================================== +; Function Name: _WinAPI_SetWindowTitleIcon +; Description: Loads an image, scales it to desired width or height and creates and icon handle +; +; Parameters: $sFile: image file to be loaded or bitmap handle +; $hWnd: GUI handle where the new icon should be displayed +; $iW: new image (icon) width. Default values is 32 +; $iH: new image (icon) height. Default values is 32 +; +; Requirement(s): GDIPlus.au3, _WinAPI_GetClassLongEx() and _WinAPI_SetClassLongEx() +; Return Value(s): Success: HICON handle, Error: 0 (see below) +; Error codes: 1: Code is running as x64 - not supported yet +; 2: $sFile value is empty +; 3: $hWnd is not a windows handle +; 4: filename doesn't exist or $sFile is not a valid bitmap handle +; 5: unable to create image from file +; 6: unable to create thumbnail from image handle +; 7: unable to create HICON from bitmap handle +; 8: unable to set ClassLongEx from GUI handle +; +; Limitation: only x86 compatible currently +; +; Author(s): UEZ, Yashied for _WinAPI_GetClassLongEx() and _WinAPI_SetClassLongEx() +; Version: v0.98 Build 2016-11-21 Beta +; +; Remarks: When finished release icon with _WinAPI_DestroyIcon() +;======================================================================================= +Func _WinAPI_SetWindowTitleIcon($sFile, $hWnd, $iW = 16, $iH = 16) + If @AutoItX64 Then Return SetError(1, 0, 0) + If $sFile = "" Then Return SetError(2, 0, 0) + If Not IsHWnd($hWnd) Then Return SetError(3, 0, 0) +;~ Local Const $GCL_HICON = -14, $GCL_HICONSM = -34 + Local $hImage, $bExtHandle = False + If Not FileExists($sFile) Then + If _GDIPlus_ImageGetType($sFile) = -1 Then Return SetError(4, @error, 0) + $hImage = $sFile ;interpret $sFile as a bitmap handle + $bExtHandle = True + Else + $hImage = _GDIPlus_ImageLoadFromFile($sFile) + If @error Then Return SetError(5, @error, 0) + EndIf + Local Const $hImageScaled = _GDIPlus_ImageScale($hImage, $iW, $iH) + If @error Then Return SetError(6, @error, 0) + If Not $bExtHandle Then _GDIPlus_ImageDispose($hImage) + + Local Const $hIconNew = _GDIPlus_HICONCreateFromBitmap($hImageScaled) + If @error Then + _GDIPlus_ImageDispose($hImageScaled) + Return SetError(7, @error, 0) + EndIf +;~ _WinAPI_SetClassLongEx($hWnd, $GCL_HICONSM, $hIconNew) + _SendMessage($hWnd, $WM_SETICON, 1, $hIconNew) + If @error Then + _GDIPlus_ImageDispose($hImageScaled) + Return SetError(8, @error, 0) + EndIf + _GDIPlus_ImageDispose($hImageScaled) + Return $hIconNew +EndFunc ;==>_WinAPI_SetWindowTitleIcon + +; ############################################################################################################################################################################################### +;~ _ _ _____ _____ _ ____ _ _ _ ____ _ +;~ (_) __| | | ___|__ _ __ _ __ ___ | ___|__ | |_ ___/ ___| ___ _ __| |_| \ | | ___ _ _ / ___| | ___ ___ ___ +;~ | |/ _` | | |_ / _ \| '__| '_ ` _ \| |_ / _ \| __/ _ \___ \ / _ \| '__| __| \| |/ _ \ | | | | | |/ _ \/ __|/ _ \ +;~ | | (_| | | _| (_) | | | | | | | | _| (_) | || (_) |__) | (_) | | | |_| |\ | __/ |_| | |___| | (_) \__ \ __/ +;~ |_|\__,_|___|_| \___/|_| |_| |_| |_|_| \___/ \__\___/____/ \___/|_| \__|_| \_|\___|\__,_|\____|_|\___/|___/\___| +;~ |_____| +; Wird aufgerufen wenn jemand auf das rote X oben rechts klickt oder ESC drückt (siehe in der Hilfe beim Befehl AutoItSetOption("GUICloseOnESC")) +Func id_FormFotoSort2017Close() +;~ If $h_FormFotoSort2017 Then _WinAPI_DeleteObject($h_FormFotoSort2017) + _WinAPI_DestroyIcon($_Resources_FotoSort2017ico) + _WinAPI_DestroyIcon($_Resources_Burnpng) + _WinAPI_DestroyIcon($_Resources_Colorpng) + _WinAPI_DestroyIcon($_Resources_CopyDocpng) + _WinAPI_DestroyIcon($_Resources_Editpng) + _WinAPI_DestroyIcon($_Resources_Refreshpng) + _WinAPI_DestroyIcon($_Resources_TrashFullpng) + _WinAPI_DestroyIcon($_Resources_Helppng) + _WinAPI_DestroyIcon($h_IconCheckOff) + _WinAPI_DestroyIcon($h_IconPicture) + _WinAPI_DestroyIcon($h_IconWarning) + _WinAPI_DestroyIcon($h_IconInfo) + _GDIPlus_Shutdown() + GUIDelete($h_FormFotoSort2017) + Exit +EndFunc + +; ############################################################################################################################################################################################### +;~ _ _ _____ _____ _ ____ _ _ _ __ __ _ _ +;~ (_) __| | | ___|__ _ __ _ __ ___ | ___|__ | |_ ___/ ___| ___ _ __| |_| \ | | ___ _ _| \/ | __ ___ _(_)_ __ ___ (_)_______ +;~ | |/ _` | | |_ / _ \| '__| '_ ` _ \| |_ / _ \| __/ _ \___ \ / _ \| '__| __| \| |/ _ \ | | | |\/| |/ _` \ \/ / | '_ ` _ \| |_ / _ \ +;~ | | (_| | | _| (_) | | | | | | | | _| (_) | || (_) |__) | (_) | | | |_| |\ | __/ |_| | | | | (_| |> <| | | | | | | |/ / __/ +;~ |_|\__,_|___|_| \___/|_| |_| |_| |_|_| \___/ \__\___/____/ \___/|_| \__|_| \_|\___|\__,_|_| |_|\__,_/_/\_\_|_| |_| |_|_/___\___| +;~ |_____| +; Wird aufgerufen wenn die GUI maximiert wird. Nach irgendeiner Änderung von mir aber bevor die Controls ihre neue Größe haben +Func id_FormFotoSort2017Maximize() + $b_FormIsMaximized = True + _SettingsWrite("$b_FormIsMaximized", $b_FormIsMaximized) ; Merken wir uns für den nächsten Programmstart + _SelectCurrentPictureTimer() + ; Ggf den + Button deaktivieren: + Local $a_GroupSize = ControlGetPos($h_FormFotoSort2017, "", $id_GroupTargetDirectories) + If (($a_id_TargetDirectories[0][0] + 1) * $i_Distance) >= ($a_GroupSize[3] - $i_Distance) Then + GUICtrlSetState($id_ButtonAddTargetDirectory, $GUI_DISABLE) + Else + GUICtrlSetState($id_ButtonAddTargetDirectory, $GUI_ENABLE) + EndIf + +EndFunc +; ############################################################################################################################################################################################### +;~ _ _ _____ _____ _ ____ _ _ _ ____ _ +;~ (_) __| | | ___|__ _ __ _ __ ___ | ___|__ | |_ ___/ ___| ___ _ __| |_| \ | | ___ _ _| _ \ ___ ___| |_ ___ _ __ ___ +;~ | |/ _` | | |_ / _ \| '__| '_ ` _ \| |_ / _ \| __/ _ \___ \ / _ \| '__| __| \| |/ _ \ | | | |_) / _ \/ __| __/ _ \| '__/ _ \ +;~ | | (_| | | _| (_) | | | | | | | | _| (_) | || (_) |__) | (_) | | | |_| |\ | __/ |_| | _ < __/\__ \ || (_) | | | __/ +;~ |_|\__,_|___|_| \___/|_| |_| |_| |_|_| \___/ \__\___/____/ \___/|_| \__|_| \_|\___|\__,_|_| \_\___||___/\__\___/|_| \___| +;~ |_____| +; Wird aufgerufen wenn die GUI nach dem minimieren wieder sichtbar gemacht wird. Aber nach einer Änderung auch wieder bevor die Controls ihr neue Größe haben +Func id_FormFotoSort2017Restore() + _SelectCurrentPictureTimer() + $b_FormIsMaximized = False + _SettingsWrite("$b_FormIsMaximized", $b_FormIsMaximized) + ; Ggf den + Button deaktivieren: + Local $a_GroupSize = ControlGetPos($h_FormFotoSort2017, "", $id_GroupTargetDirectories) + If (($a_id_TargetDirectories[0][0] + 1) * $i_Distance) >= ($a_GroupSize[3] - $i_Distance) Then + GUICtrlSetState($id_ButtonAddTargetDirectory, $GUI_DISABLE) + Else + GUICtrlSetState($id_ButtonAddTargetDirectory, $GUI_ENABLE) + EndIf + While (($a_id_TargetDirectories[0][0] + 1) * $i_Distance) >= $a_GroupSize[3] + _Folder_Remove() + WEnd + $a_FormFotoSortNew_Size = WinGetPos($h_FormFotoSort2017) + _SettingsWrite("$a_FormFotoSortNew_Size[2]", $a_FormFotoSortNew_Size[2]) + _SettingsWrite("$a_FormFotoSortNew_Size[3]", $a_FormFotoSortNew_Size[3]) +EndFunc +; ############################################################################################################################################################################################### +;~ ____ _ _ ___ _______ _______ _ _ _____ ____ ____ ___ ____ ____ _____ ____ +;~ / ___| | | |_ _| | ____\ \ / / ____| \ | |_ _| | _ \| _ \ / _ \| _ \| _ \| ____| _ \ +;~ | | _| | | || | | _| \ \ / /| _| | \| | | | | | | | |_) | | | | |_) | |_) | _| | | | | +;~ | |_| | |_| || | | |___ \ V / | |___| |\ | | | | |_| | _ <| |_| | __/| __/| |___| |_| | +;~ \____|\___/|___|___|_____| \_/ |_____|_| \_| |_|___|____/|_| \_\\___/|_| |_| |_____|____/ +;~ |_____| |_____| +; Das erste mal gemacht: Statt die Pfade mühsam über einzelne Dialog einzustellen kann man diese einfach aus dem Explorer auf die Felder oder die Vorschau ziehen +; Funktioniert bei Quellpfad, Zielpfad, Vorschau +Func GUI_EVENT_DROPPED() + Local $_s_empty = "", $_a_PathSplit[4] + ; Wenn man mehr als einmal eine Datei/Ordner auf die Inputfelder zieht so wird der Text angehängt. Das verhindert folgende Zeile + If @GUI_DropId <> $id_Picture And @GUI_DropId <> $id_Background Then + ; Es war nicht die Vorschau, also den Dateinamen in das entsprechende Input-Control + GUICtrlSetData(@GUI_DropId, @GUI_DragFile) + Else + ; Es war die Vorschau. Dateinamen umlenken in das Feld für den Quellordner (in diesem Moment ggf noch mit Dateinamen) + GUICtrlSetData($id_InputSourceDirectory, @GUI_DragFile) + EndIf + ; Jetzt können wir prüfen was es da gab + If @GUI_DROPID = $id_InputSourceDirectory Or @GUI_DROPID = $id_Picture Or @GUI_DropId = $id_Background Then + ; Auseinander bauen was es gab und schauen ob es Datei oder Ordner war + $_a_PathSplit = _PathSplit(GUICtrlRead($id_InputSourceDirectory), $_s_empty, $_s_empty, $_s_empty, $_s_empty) + If $_a_PathSplit[4] <> "" Then + ; Es eine Datei! Der Dateiname steht zu diesem Zeitpunkt noch im Input-Feld. + ; Den ersetzen wir durch den reinen Pfad + GUICtrlSetData($id_InputSourceDirectory, StringTrimRight($_a_PathSplit[1] & $_a_PathSplit[2], 1)) + EndIf + _SettingsWrite("$id_InputSourceDirectory", GUICtrlRead($id_InputSourceDirectory)) ; Und den Pfad merken wir uns als Startordner für das nächste mal + _ReadFileList() + ; Jetzt suchen wir noch die Nummer des Bildes das es per Drag'n Drop gab um es darzustellen. _ArraySearch war mir zu umständlich + For $i = 1 To $a_s_PictureFilenames[0] Step 1 + If $a_s_PictureFilenames[$i] = @GUI_DragFile Then + _SelectCurrentPicture($i) + ExitLoop + EndIf + Next + Else + ; Ok, einer der Zielordner, erst einmal suchen welcher es war + For $i = 1 To $a_id_TargetDirectories[0][0] Step 1 + If $a_id_TargetDirectories[$i][3] = @GUI_DROPID Then + ; Dieser hier. Wieder den Text nehmen und Prüfen ob das ein Ordner oder eine Datei ist + $_a_PathSplit = _PathSplit(GUICtrlRead($a_id_TargetDirectories[$i][3]), $_s_empty, $_s_empty, $_s_empty, $_s_empty) + If $_a_PathSplit[4] <> "" Then + ; Es war eine Datei! Wir nehmen nur den Ordnerteil, der Rest wird ignoriert + GUICtrlSetData($a_id_TargetDirectories[$i][3], StringTrimRight($_a_PathSplit[1] & $_a_PathSplit[2], 1)) + EndIf + _SettingsWrite("$a_id_TargetDirectories[0][0]" & "-" & $s_ProfileActive, $a_id_TargetDirectories[0][0]) ; Anzahl der Zielverzeichnisse + _SettingsWrite("$a_id_TargetDirectories[" & $i & "][3]" & "-" & $s_ProfileActive, GUICtrlRead($a_id_TargetDirectories[$i][3])) ; und wohin es zeigt + _SettingsWrite("$i_ProfileActive", $i_ProfileActive) + _SettingsWrite("$s_ProfileActive", $s_ProfileActive) + ExitLoop + EndIf + Next + EndIf +EndFunc +; ############################################################################################################################################################################################### +;~ __ ____ __ ____ ___ __ __ __ __ _ _ _ ____ +;~ \ \ / / \/ | / ___/ _ \| \/ | \/ | / \ | \ | | _ \ +;~ \ \ /\ / /| |\/| | | | | | | | |\/| | |\/| | / _ \ | \| | | | | +;~ \ V V / | | | | | |__| |_| | | | | | | |/ ___ \| |\ | |_| | +;~ \_/\_/ |_| |_|___\____\___/|_| |_|_| |_/_/ \_\_| \_|____/ +;~ |_____| +; Wird aufgerufen sobald ein Control den Focus erhält. Oder verliert. Nutzen wir für das Input der Bildnummern und des Suffix, +; in der Zeit wo der Cursor in diesen steht müssen alle Tastenaufrufe deaktiviert sein +Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam) + #forceref $hWnd, $iMsg + Local $_i_Code = BitShift($wParam, 16) + Switch $lParam + Case GUICtrlGetHandle($id_InputPicNumber), GUICtrlGetHandle($id_InputSuffix) + Switch $_i_Code + Case $EN_SETFOCUS + ; Aha, der Focus ist also in einem der beiden Inputs, Tasten aus! + GUISetAccelerators("dummy", $a_FormFotoSortNew_Size) + Case $EN_KILLFOCUS + ; Focus ist wieder raus, Tasten wieder an + GUISetAccelerators($a_AcceleratorKeys, $h_FormFotoSort2017) + EndSwitch + EndSwitch + Return $GUI_RUNDEFMSG +EndFunc ;==>ED_WM_COMMAND +; ############################################################################################################################################################################################### +;~ __ ____ __ ____ _____ _____ __ __ ___ _ _ __ __ _ __ _____ _ _ _____ ___ +;~ \ \ / / \/ | / ___| ____|_ _| \/ |_ _| \ | | \/ | / \ \ \/ /_ _| \ | | ___/ _ \ +;~ \ \ /\ / /| |\/| | | | _| _| | | | |\/| || || \| | |\/| | / _ \ \ / | || \| | |_ | | | | +;~ \ V V / | | | | | |_| | |___ | | | | | || || |\ | | | |/ ___ \ / \ | || |\ | _|| |_| | +;~ \_/\_/ |_| |_|___\____|_____| |_| |_| |_|___|_| \_|_| |_/_/ \_\/_/\_\___|_| \_|_| \___/ +;~ |_____| +; Dient dazu eine minimale und maximale Größe der GUI durchzusetzen. +; gefunden unter: https://www.autoitscript.com/forum/topic/124195-gui-minimum-size/ +Func WM_GETMINMAXINFO($hwnd, $Msg, $wParam, $lParam) + Local $tagMaxinfo = DllStructCreate("int;int;int;int;int;int;int;int;int;int", $lParam) + DllStructSetData($tagMaxinfo, 7, $i_FormFotoSortNew_SizeMinWidth) ; min X + DllStructSetData($tagMaxinfo, 8, $i_FormFotoSortNew_SizeMinHeight) ; min Y + DllStructSetData($tagMaxinfo, 9, $i_FormFotoSortNew_SizeMaxWidth ); max X + DllStructSetData($tagMaxinfo, 10, $i_FormFotoSortNew_SizeMaxHeight ) ; max Y + Return 0 +EndFunc ;==>WM_GETMINMAXINFO + +; ############################################################################################################################################################################################### +;~ __ ____ __ __ __ ___ _ _ ____ _______ ___ _ _____ _____ _ +;~ \ \ / / \/ | | \/ |/ _ \| | | / ___|| ____\ \ / / | | | ____| ____| | +;~ \ \ /\ / /| |\/| | | |\/| | | | | | | \___ \| _| \ \ /\ / /| |_| | _| | _| | | +;~ \ V V / | | | | | | | | |_| | |_| |___) | |___ \ V V / | _ | |___| |___| |___ +;~ \_/\_/ |_| |_|___|_| |_|\___/ \___/|____/|_____| \_/\_/ |_| |_|_____|_____|_____| +;~ |_____| +; Unter https://autoit.de/index.php/Thread/83596-MouseWheel-auswerten/ +; steht wie man gezielt das Control findet über dem die Maus gerade ist - brauchen wir hier aber nicht, einfach Bild rauf oder runter +Func WM_MOUSEWHEEL($hWnd, $iMsg, $wParam, $lParam) + GUIRegisterMsg($WM_MOUSEWHEEL, '') + Local $_i_PicNumber = GUICtrlRead($id_InputPicNumber) + Local $_i_Wheel = _WinAPI_HiWord($wParam) / 120 ; down = -1, up = 1 + Local $_a_ButtonPos + If $_i_Wheel = 1 Then + $_a_ButtonPos = ControlGetPos($h_FormFotoSort2017, "", $id_ButtonPicBack1) + ControlFocus($h_FormFotoSort2017, "", $id_ButtonPicBack1) + $_i_PicNumber = $_i_PicNumber - 1 + Else + $_a_ButtonPos = ControlGetPos($h_FormFotoSort2017, "", $id_ButtonPicForward1) + ControlFocus($h_FormFotoSort2017, "", $id_ButtonPicForward1) + $_i_PicNumber = $_i_PicNumber + 1 + EndIf + GUICtrlSetPos($id_ButtonSelected1, $_a_ButtonPos[0] - 1, $_a_ButtonPos[1] - 1) + GUICtrlSetPos($id_ButtonSelected2, $_a_ButtonPos[0] - 2, $_a_ButtonPos[1] - 2) + GUICtrlSetColor($id_ButtonSelected1, $hex_SignalColor) + GUICtrlSetColor($id_ButtonSelected2, $hex_SignalColor) + _SelectCurrentPicture($_i_PicNumber) + $i_Timeout = 250 + _ThisOne() + GUIRegisterMsg($WM_MOUSEWHEEL, 'WM_MOUSEWHEEL') + Return $GUI_RUNDEFMSG +EndFunc +; ############################################################################################################################################################################################### +;~ __ ____ __ ____ ___ __________ +;~ \ \ / / \/ | / ___|_ _|__ / ____| +;~ \ \ /\ / /| |\/| | \___ \| | / /| _| +;~ \ V V / | | | | ___) | | / /_| |___ +;~ \_/\_/ |_| |_|___|____/___/____|_____| +;~ |_____| +; Wird bei jeder Größenänderung aufgerufen. +; Die Statusbar muss jedesmal angepasst werden +; Und die Vorschau auch, falls es die GDIPlus Version ist +Func WM_SIZE($hWnd, $iMsg, $iwParam, $ilParam) +;~ $b_WM_SIZE = True + ; Statusbar unten muss von Hand angestoßen werden + _GUICtrlStatusBar_Resize($id_StatusBar) + ; Vorschaubild wieder anpassen + If $b_Use_GuiCtrlSetImageEx = True Then +;~ _SelectCurrentPicture(GUICtrlRead($id_InputPicNumber)) ; Warum hatte ich das statt der direkten Funktion genommen? + _SelectCurrentPictureTimer() +;~ If $a_CurrentPictureFilename[1] = ".gif" Then +;~ _GUICtrlSetGIF_Mod($id_Picture, $d_CurrentPicture, $b_Upscale) +;~ Else +;~ _GuiCtrlSetImageEx($id_Picture, $d_CurrentPicture, $b_Upscale, $d_BackgroundColor_ARGB, False) +;~ EndIf + EndIf + ; Ggf den + Button deaktivieren: + Local $a_GroupSize = ControlGetPos($h_FormFotoSort2017, "", $id_GroupTargetDirectories) + If (($a_id_TargetDirectories[0][0] + 1) * $i_Distance) >= ($a_GroupSize[3] - $i_Distance) Then + GUICtrlSetState($id_ButtonAddTargetDirectory, $GUI_DISABLE) + Else + GUICtrlSetState($id_ButtonAddTargetDirectory, $GUI_ENABLE) + EndIf + ; Wenn wir zuviele Zielordner haben und die GUI zu klein dafür ist ... löschen wir solange Ordner bis es wieder passt + While (($a_id_TargetDirectories[0][0] + 1) * $i_Distance) >= $a_GroupSize[3] + _Folder_Remove() + WEnd + If BitAND(WinGetState($h_FormFotoSort2017), $WIN_STATE_MAXIMIZED) <> $WIN_STATE_MAXIMIZED Then ; prüfen ob das Fenster maximiert ist + ; Nur wenn nicht wird die aktuelle Größe gesichert. Würden wir den Wert sichern während das Fenster maximiert ist + ; so wären es eben diese maximierten Daten. Schließt dann einer das Programm und startet es neu, + ; ist es wieder maximiert. Klickt er auf verkleinern gibt es dann nicht die vorherige Größe sondern eben diese maximale + $a_FormFotoSortNew_Size = WinGetPos($h_FormFotoSort2017) + _SettingsWrite("$a_FormFotoSortNew_Size[2]", $a_FormFotoSortNew_Size[2]) + _SettingsWrite("$a_FormFotoSortNew_Size[3]", $a_FormFotoSortNew_Size[3]) + EndIf + Return $GUI_RUNDEFMSG +EndFunc ;==>MY_WM_SIZE +;~ ############################################################################################################################################################################################### +#EndRegion Funktionen + + + + +#Region GUI-FormFotoSort2017 +; ############################################################################################################################################################################################### +; ###### ## ## #### +; ## ## ## ## ## +; ## ## ## ## +; ## #### ## ## ## +; ## ## ## ## ## +; ## ## ## ## ## +; ###### ####### #### +; ############################################################################################################################################################################################### +; Um GDIPlus nutzen zu können müssen wir es starten: +_GDIPlus_Startup() + +; Das Fenster an sich erstellen. Die Größenwerte 1009 und 730 ist die nutzbare Innenfläche ohne Ränder und Titelleiste (deren Größe von der Windowsversion abhängt) +; Als Styles wurden folgende gewählt: +; $GUI_SS_DEFAULT_GUI: beinhaltet die Styles $WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP und $WS_SYSMENU +; $WS_MINIMIZEBOX : Fenster hat eine Minimieren-Schaltfläche +; $WS_CAPTION : Es gibt eine Titelzeile oben (Steht oft der Programmname drin) +; $WS_POPUP : Macht ein Popup-Fenster (keine Ahnung wazu das hier drin ist) +; $WS_SYSMENU : Erlaubt das Menü das kommt wenn man oben links auf das Programsymbol in der Titelleiste klickt +; $WS_MAXIMIZEBOX : Fenster hat eine Maximieren-Schaltfläche +; $WS_SIZEBOX : Fenster hat einen Rahmen zur Größenänderung +; $WS_TABSTOP : Die Controls im Fenster können per Tabulator-Taste durchgeschaltet werden +; Als Extended Styles wurden folgende gewählt: +; $WS_EX_ACCEPTFILES : Man darf Dateien auf Edit-Controls ziehen, die bekommen dann den Dateinamen +$h_FormFotoSort2017 = GUICreate("FotoSort2017", 1009, 730, -1, -1, BitOR($GUI_SS_DEFAULT_GUI,$WS_MAXIMIZEBOX,$WS_SIZEBOX,$WS_TABSTOP), $WS_EX_ACCEPTFILES) +; Schriftart setzen - diese wird von allen Controls verwendet sofern nicht etwas anderes an diesen angegeben werden +GUISetFont($s_FontSizeForm * $i_AppliedDPI, 400, 0, $s_FontNameForm) +GUISetBkColor(0xC8C8C8) +GUISetOnEvent($GUI_EVENT_CLOSE, "id_FormFotoSort2017Close") +GUISetOnEvent($GUI_EVENT_RESTORE, "id_FormFotoSort2017Restore") +GUISetOnEvent($GUI_EVENT_MAXIMIZE, "id_FormFotoSort2017Maximize") + + +; Die Statusbar unten erstellen +$id_StatusBar = _GUICtrlStatusBar_Create($h_FormFotoSort2017, -1, "", BitOR($WS_VISIBLE,$WS_CHILD,$WS_BORDER)) +_GUICtrlStatusBar_SetMinHeight($id_StatusBar, 22) +; Die Größe der 3 Abschnitte, -1 = bis zum Ende +;~ Local $id_StatusBar_PartsWidth[3] = [300, 600, -1] +Local $id_StatusBar_PartsWidth[4] = [500, 630, 780, -1] +_GUICtrlStatusBar_SetParts($id_StatusBar, $id_StatusBar_PartsWidth) +;Anfangstext in die einzelnen Abschnitte der Statusbar setzen +_GUICtrlStatusBar_SetText($id_StatusBar, "Status", 0) +_GUICtrlStatusBar_SetText($id_StatusBar, "Bild 0 von 0", 1) +_GUICtrlStatusBar_SetText($id_StatusBar, "Bildinfos", 3) + + + + +$_Resources_Warningico = _GDIPlus_BitmapCreateFromMemory(_Resources_Warningico(), False) +$h_IconWarning = _GDIPlus_HICONCreateFromBitmap($_Resources_Warningico) +$_Resources_Pictureico = _GDIPlus_BitmapCreateFromMemory(_Resources_Pictureico(), False) +$h_IconPicture = _GDIPlus_HICONCreateFromBitmap($_Resources_Pictureico) +$_Resources_CheckOffico = _GDIPlus_BitmapCreateFromMemory(_Resources_CheckOffico(), False) +$_Resources_CheckOffico2 = _GDIPlus_BitmapCreateFromMemory(_Resources_CheckOffico(), True) +$h_IconCheckOff = _GDIPlus_HICONCreateFromBitmap($_Resources_CheckOffico) +$_Resources_Infoico = _GDIPlus_BitmapCreateFromMemory(_Resources_Infoico(), False) +$h_IconInfo = _GDIPlus_HICONCreateFromBitmap($_Resources_Infoico) +$_Resources_Cancelico = _GDIPlus_BitmapCreateFromMemory(_Resources_Cancelico(), True) +;~ $h_IconCancel = _GDIPlus_HICONCreateFromBitmap($_Resources_Cancelico) +$_Resources_Overwriteico = _GDIPlus_BitmapCreateFromMemory(_Resources_Overwriteico(), True) +$_Resources_Profilesico = _GDIPlus_BitmapCreateFromMemory(_Resources_Profilesico(), False) +$h_IconProfiles = _GDIPlus_HICONCreateFromBitmap($_Resources_Profilesico) +;~ $h_IconOverwrite = _GDIPlus_HICONCreateFromBitmap($_Resources_Overwriteico) + +; Die Gruppen oben links mit dem Pfad zum aktuellen Ordner erstellen +$id_GroupQuellverzeichnis = GUICtrlCreateGroup(" Quellverzeichnis: ", 5, 8, 514, 68) +; Die Gruppe - und alle Controls in dieser - heften wir an den linken + oberen + rechten Rand - damit die bei Größenänderungen oben bleibt, sich aber in die Breite zieht. Die Höhe ist gesperrt +GUICtrlSetResizing($id_GroupQuellverzeichnis, $GUI_DOCKLEFT+$GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKHEIGHT) +; Das Input-Feld, ist Readonly, aktzeptiert Drag'n Drop +$id_InputSourceDirectory = GUICtrlCreateInput("", 13, 28, 462, 25, BitOR($ES_READONLY,$ES_LEFT, $ES_AUTOHSCROLL), BitOR($WS_EX_CLIENTEDGE, $WS_EX_ACCEPTFILES)) +GUICtrlSetFont($id_InputSourceDirectory, $s_FontSizeInputs * $i_AppliedDPI, 400, 0, $s_FontNameInputs) +GUICtrlSetBkColor($id_InputSourceDirectory, 0xFFFFE1) +; Das Edit heften wir links, rechts und oben fest - damit es sich nicht in der Höhe ändert aber in die Breite geht. Höhe ist wieder gesperrt +GUICtrlSetResizing($id_InputSourceDirectory, $GUI_DOCKLEFT+$GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKHEIGHT) +; Damit das Feld Drag'n Drop annimmt (muss zusätzlich zum Extended-Style gesetzt werden) +GUICtrlSetState($id_InputSourceDirectory, $GUI_DROPACCEPTED) +; Und wir wollen mitbekommen wenn der Inhalt sich ändern, z.B, durch Drag'n Drop +; Der Button für die Auswahl der Datei +$id_ButtonSelectSourceDirectory = GUICtrlCreateButton("...", 477, 28, 33, 25) +; Der Button bekommt den Buchstaben q (Ich bracuhte einen Startwert in dem Array - und hier ist er! +$a_AcceleratorKeys[0][0] = "q" +$a_AcceleratorKeys[0][1] = $id_ButtonSelectSourceDirectory + +; Den heften wir nur oben und rechts an - damit der mit nach rechts wandert wenn wir die GUI vergößern. Höhe und Breite ist gesperrt +GUICtrlSetResizing($id_ButtonSelectSourceDirectory, $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) +GUICtrlSetOnEvent($id_ButtonSelectSourceDirectory, "_Folder_Select") +; Und noch die Checkbox für die rekursive Suche +$id_CheckboxScanFolderRecursive = GUICtrlCreateCheckbox("inklusive Unterordner (Rekursiv)", 13, 56, 225, 17) +; Die heften wir oben und links an - so bleibt die einfach auf der Stelle stehen, Höhe und Breite gesperrt +GUICtrlSetResizing($id_CheckboxScanFolderRecursive, $GUI_DOCKLEFT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) +; Und wenn die Checkbox geändert wird, die Liste der Bilder neu einlesen: +GUICtrlSetOnEvent($id_CheckboxScanFolderRecursive, "_ReadFileList") +; Gruppe ist fertig, also schließen +GUICtrlCreateGroup("", -99, -99, 1, 1) + +; Nun die verfügbaren Bildformate. Wie bei Oscar keine feste Liste sondern alles das was GDIPlus so kann. +$id_GroupFileFormats = GUICtrlCreateGroup(" Dateiformate: ", 528, 8, 473, 68) +; Die Group ist fest in der Größe und oben sowie rechts angeheftet +GUICtrlSetResizing($id_GroupFileFormats, $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) +; und die verfügbaren Decoders abfragen. Hinweis: Den für GIF werden wir später nicht nutzen sondern einen anderen der mit animierten GIF umgehen kann. +$aGDIPlusDecoders = _GDIPlus_Decoders() +; $aGDIPlusDecoders sieht jetzt - gekürzt - wie folgt aus: +; $aGDIPlusDecoders[0][0] = Anzahl der verfügbaren Decoders +; $aGDIPlusDecoders[x][5] = Der Name des Dateiformates, z.B. BMP +; Die ControlIds der ganzen Checkboxen packen wir in ein Array. Das ist um 1 größer als nötig - wir packen noch eine Option "Alle" dazu. +; Oscar hat das als Popup/Rechtsklick Menü gemacht. Das hatte ich erst gefunden als ich es im Quellcode gesehen hatte. +ReDim $a_id_CheckboxFileformat[ $aGDIPlusDecoders[0][0] + 1 ] +; Die erste Checkbox mit "Alle" kommte oben links in die Group. Alle sind 65 lang und 17 hoch +$a_id_CheckboxFileformat[0] = GUICtrlCreateCheckbox("Alle", 536, 28, 65, 17) +GUICtrlSetOnEvent($a_id_CheckboxFileformat[0], "_CheckboxFileformat") +GUICtrlSetResizing($a_id_CheckboxFileformat[0], $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) +; Die erste Reihe kommt auf 28, die zweite Reihe auf 52 +; Abstand Horizontal sind 72 +For $i = 1 To $aGDIPlusDecoders[0][0] Step 1 + ; So die Formel habe ich mir bei Oscar abgeschaut - und musste erst einmal überlegen was er da macht + $a_id_CheckboxFileformat[$i] = GUICtrlCreateCheckbox($aGDIPlusDecoders[$i][5], 614 + Mod($i - 1, 5) * 78, 28 + Int(($i - 1) / 5) * 24, 65, 17) + ; X: 614 + Mod($i - 1, 5) * 72 + ; 614 Pixel von links fangen wir an, dazu addieren wir das Ergebnis der rechten Berechnung (Punkt vor Strichrechnung!) + ; Mod($i - 1, 5) ergibt - bei $i 1 bis 8 - die Zahlenfolge 0 1 2 3 4 0 1 2 + ; Und den Wert Multiplizieren wir immer mit 72, dem gewünschten Abstand der Spalten + ; Y: 28 + Int(($i - 1) / 5) * 24 + ; 28 Pixel von oben ist die erste Reihe + ; ($i - 1) / 5 liefert und die Zahlenfolge 0 0.2 0.4 0.8 1 1.2 1.4 usw. + ; Durch Int() bekommen wir nur den Teil vor dem . (ohne Runden) also 0 0 0 0 1 1 1, also 4 mal 0 und dann 1 (und 2, 3 je nach Größe von $i) + ; Und das dann mal 24, denn bei 28 + 24 = 52 soll die 2 Zeile hin + + ; Die Checkboxen haben alle eine feste Größe und werden oben und rechts angeheftet + GUICtrlSetResizing($a_id_CheckboxFileformat[$i], $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) + ; Und noch die Funktion die aufgerufen werden soll wenn sich ein Wert ändert: + GUICtrlSetOnEvent($a_id_CheckboxFileformat[$i], "_CheckboxFileformat") + ; und der Tooltip + GUICtrlSetTip($a_id_CheckboxFileformat[$i], "Alle Dateien mit Dateiendung: " & StringLower($aGDIPlusDecoders[$i][6])) +Next +; Und ersteinmal alle auswählen: + +;~ GUICtrlSetState($a_id_CheckboxFileformat[0], $GUI_CHECKED) +;~ _CheckboxFileformat() + +; Und die Gruppe ist komplett, also zumachen +GUICtrlCreateGroup("", -99, -99, 1, 1) + + +; Die Gruppe mit den Zielverzeichnissen. Ein Grund warum ich dieses Programm neu geschrieben habe. Ich brauchte mehr davon und der Platz des Bildschirmes sollte besser ausgenutzt werden +; Die Anzahl der Zielverzeichniss ist dynamisch +; Group anlegen +$id_GroupTargetDirectories = GUICtrlCreateGroup(" Zielverzeichnisse (1..1): ", 528, 176, 473, 441) +; Die Group rechts, oben und unten angeheftet. Die Breite ist fix, die Höhe nicht. Dadurch wird die Gruppe - als einzige - größer wenn das fenster vergrößert wird +GUICtrlSetResizing($id_GroupTargetDirectories, $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKBOTTOM+$GUI_DOCKWIDTH) + + +; So, nun brauchen wir pro Zielverzeichnis: 1x Button kopieren, 1x Button verschieben, 1x Input mit dem Pfad, 1x Input zur Pfadauswahl +; das machen wir natürlich mit einem Array das wie folgt aussieht: +; $a_id_TargetDirectories[2][5] ; [0][0] = Anzahl + ; [x][1] = Button kopieren + ; [x][2] = Butten verschieben + ; [x][3] = Input + ; [x][4] = Pfadauswahl +; Eine Zeile gibt es immer! +$a_id_TargetDirectories[0][0] = 1 + +; Den Button für kopieren +$a_id_TargetDirectories[1][1] = GUICtrlCreateButton("1", 536, 200, 33, 25) +GUICtrlSetOnEvent($a_id_TargetDirectories[1][1], "_Picture_Copy") +; Diesen und die nachfolgenden Buttons heften wir Rechts und oben an, Größe ist fix +GUICtrlSetResizing($a_id_TargetDirectories[1][1], $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) +GUICtrlSetTip($a_id_TargetDirectories[1][1], "Taste: [1]" & @CRLF & "Datei kopieren") +_AcceleratorKeyAdd("1", $a_id_TargetDirectories[1][1]) +_AcceleratorKeyAdd("{NUMPAD1}", $a_id_TargetDirectories[1][1]) + + +; Den Button für verschieben +$a_id_TargetDirectories[1][2] = GUICtrlCreateButton("»", 568, 200, 33, 25) +GUICtrlSetOnEvent($a_id_TargetDirectories[1][2], "_Picture_Move") +GUICtrlSetResizing($a_id_TargetDirectories[1][2], $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) +GUICtrlSetTip($a_id_TargetDirectories[1][2], "Taste: [Alt] + [1]" & @CRLF & "Datei verschieben") +_AcceleratorKeyAdd("!1", $a_id_TargetDirectories[1][2]) +_AcceleratorKeyAdd("!{NUMPAD1}", $a_id_TargetDirectories[1][2]) + +; Das Input mit dem Pfad +$a_id_TargetDirectories[1][3] = GUICtrlCreateInput("", 603, 200, 354, 25, BitOR($ES_READONLY,$ES_LEFT, $ES_AUTOHSCROLL), BitOR($WS_EX_CLIENTEDGE, $WS_EX_ACCEPTFILES)) +GUICtrlSetFont($a_id_TargetDirectories[1][3], $s_FontSizeInputs * $i_AppliedDPI, 400, 0, $s_FontNameInputs) +GUICtrlSetBkColor($a_id_TargetDirectories[1][3], 0xFFFFE1) +GUICtrlSetResizing($a_id_TargetDirectories[1][3], $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) +; Damit das Feld Drag'n Drop annimmt (muss zusätzlich zum Extended-Style gesetzt werden) +GUICtrlSetState($a_id_TargetDirectories[1][3], $GUI_DROPACCEPTED) + +; Und noch der Button für die Pfadauswahl +$a_id_TargetDirectories[1][4] = GUICtrlCreateButton("...", 960, 200, 33, 25) +GUICtrlSetOnEvent($a_id_TargetDirectories[1][4], "_Folder_Select") +GUICtrlSetResizing($a_id_TargetDirectories[1][4], $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) +GUICtrlSetTip($a_id_TargetDirectories[1][4], "Pfad wählen") + +; Rahmen um die gewählte Zeile hervorheben zu können +$_a_ButtonCopy = ControlGetPos($h_FormFotoSort2017, "", $a_id_TargetDirectories[1][1]) +$_a_ButtonSelectFolder = ControlGetPos($h_FormFotoSort2017, "", $a_id_TargetDirectories[1][4]) +$id_ThisOne1 = GUICtrlCreateGraphic($_a_ButtonCopy[0] - 2, $_a_ButtonCopy[1] - 2, $_a_ButtonSelectFolder[0] + $_a_ButtonSelectFolder[3] - $_a_ButtonCopy[0] + 12, $_a_ButtonCopy[3] + 4) +$id_ThisOne2 = GUICtrlCreateGraphic($_a_ButtonCopy[0] - 3, $_a_ButtonCopy[1] - 3, $_a_ButtonSelectFolder[0] + $_a_ButtonSelectFolder[3] - $_a_ButtonCopy[0] + 14, $_a_ButtonCopy[3] + 6) +GUICtrlSetColor($id_ThisOne1, 0xC8C8C8) +GUICtrlSetColor($id_ThisOne2, 0xC8C8C8) +GUICtrlSetResizing($id_ThisOne1, $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) +GUICtrlSetResizing($id_ThisOne2, $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) +GUICtrlSetState($id_ThisOne1, $GUI_DISABLE) +GUICtrlSetState($id_ThisOne2, $GUI_DISABLE) + + +; Unterhalb der Zeile kommen noch 2 Buttons für das Hinzufügen und Entfernen weiterer Zeilen hinzu +$id_ButtonAddTargetDirectory = GUICtrlCreateButton("+", 536, 232, 33, 25) +GUICtrlSetOnEvent($id_ButtonAddTargetDirectory, "_Folder_Add") +GUICtrlSetResizing($id_ButtonAddTargetDirectory, $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) +GUICtrlSetTip($id_ButtonAddTargetDirectory, "Einen Pfad hinzufügen") +$id_ButtonRemoveTargetDirectory = GUICtrlCreateButton("-", 568, 232, 33, 25) +GUICtrlSetOnEvent($id_ButtonRemoveTargetDirectory, "_Folder_Remove") +GUICtrlSetResizing($id_ButtonRemoveTargetDirectory, $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) +GUICtrlSetTip($id_ButtonRemoveTargetDirectory, "Den vorstehenden Pfad entfernen") +; "-" wird deaktiviert, haben im Moment ja nur eine Zeile +GUICtrlSetState($id_ButtonRemoveTargetDirectory, $GUI_DISABLE) +; Und auch diese Gruppe ist fertig +GUICtrlCreateGroup("", -99, -99, 1, 1) + + +; Die Gruppe mit den Optionen für doppelte / schon vorhandene Dateien +$id_GroupFileExists = GUICtrlCreateGroup(" Wenn Datei bereits vorhanden: ", 528, 80, 473, 90) +GUICtrlSetResizing($id_GroupFileExists, $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) +$id_RadioOverwrite = GUICtrlCreateRadio("vorhandene Datei überschreiben", 536, 100, 241, 17) +GUICtrlSetOnEvent($id_RadioOverwrite, "_RadioFileExists") +GUICtrlSetResizing($id_RadioOverwrite, $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) +$id_RadioAddSuffix = GUICtrlCreateRadio("Suffix anhängen:", 536, 124, 137, 17) +GUICtrlSetOnEvent($id_RadioAddSuffix, "_RadioFileExists") +;~ GUICtrlSetState($id_RadioAddSuffix, $GUI_CHECKED) +GUICtrlSetResizing($id_RadioAddSuffix, $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) +$id_InputSuffix = GUICtrlCreateInput("_####", 674, 120, 89, 25, BitOR($GUI_SS_DEFAULT_INPUT,$ES_CENTER)) +GUICtrlSetOnEvent($id_InputSuffix, "_RadioFileExists") +GUICtrlSetFont($id_InputSuffix, $s_FontSizeInputs * $i_AppliedDPI, 400, 0, $s_FontNameInputs) +GUICtrlSetResizing($id_InputSuffix, $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) +$id_RadioAskOverwrite = GUICtrlCreateRadio("Nachfragen", 536, 148, 241, 17) +GUICtrlSetOnEvent($id_RadioAskOverwrite, "_RadioFileExists") +GUICtrlSetResizing($id_RadioAskOverwrite, $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) +GUICtrlSetState($id_RadioAskOverwrite, $GUI_CHECKED) +; CheckBox Doppelte Dateien finden. Prüft beim kopieren/verschieben ob es die Datei schon gibt. +; Nicht am Dateinamen sondern im 1. Schritt an Größe und im 2. Schritt an Checksumme +$id_CheckboxDoubleFiles = GUICtrlCreateCheckbox("Prüfe auf identische Zieldatei", 784, 100, 209, 17) +GUICtrlSetOnEvent($id_CheckboxDoubleFiles, "_RadioFileExists") +GUICtrlSetState($id_CheckboxDoubleFiles, $GUI_CHECKED) +GUICtrlSetResizing($id_CheckboxDoubleFiles, $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) +GUICtrlSetTip($id_CheckboxDoubleFiles, "Prüft vor jedem Kopieren oder Verschieben ob die Datei" & @CRLF & "schon im Zielverzeichnis vorhanden ist." & @CRLF & "Zunächst werden Dateien gleicher Größe gesucht." & @CRLF & "Diese werden dann Bitweise verglichen") +;~ GUICtrlSetState($id_CheckboxDoubleFiles, $GUI_HIDE) + +$id_LabelCountingNumber = GUICtrlCreateLabel("# = laufende Nummer", 784, 124, 146, 20) +GUICtrlSetResizing($id_LabelCountingNumber, $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) +GUICtrlCreateGroup("", -99, -99, 1, 1) + + +; Die Gruppe mit den Werkzeugen +$id_GroupTools = GUICtrlCreateGroup(" Werkzeuge ", 528, 624, 473, 76) +GUICtrlSetResizing($id_GroupTools, $GUI_DOCKRIGHT+$GUI_DOCKBOTTOM+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) +; Und die Buttons selbst - als Array, So kann man durch Ändern der Reihenfolge im Array auch die Reihenfolge in der GUI ändern +For $i = 0 To (UBound($a_id_Tools) - 1) Step 1 + $a_id_Tools[$i][1] = GUICtrlCreateButton($a_id_Tools[$i][0], 536 + ($i * 58), 644, 48, 48, $BS_MULTILINE) + GUICtrlSetResizing($a_id_Tools[$i][1], $GUI_DOCKRIGHT+$GUI_DOCKBOTTOM+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) + GUICtrlSetOnEvent($a_id_Tools[$i][1], "_Tools") + Switch $a_id_Tools[$i][0] + Case "Filenames" + GUICtrlSetTip($a_id_Tools[$i][1], "Erstellt eine Textdatei mit gefundenen Dateien des Quellverzeichnisses") + GUICtrlSetStyle($a_id_Tools[$i][1], $BS_ICON) + $_Resources_CopyDocpng = _GDIPlus_BitmapCreateFromMemory(_Resources_CopyDocpng(), True) + _WinAPI_DeleteObject(_SendMessage(GUICtrlGetHandle($a_id_Tools[$i][1]), $BM_SETIMAGE, $IMAGE_BITMAP, $_Resources_CopyDocpng)) + Case "BKG" + GUICtrlSetTip($a_id_Tools[$i][1], "Ändert die Hintergrundfarbe der Vorschau") + GUICtrlSetStyle($a_id_Tools[$i][1], $BS_ICON) + $_Resources_Colorpng = _GDIPlus_BitmapCreateFromMemory(_Resources_Colorpng(), True) + _WinAPI_DeleteObject(_SendMessage(GUICtrlGetHandle($a_id_Tools[$i][1]), $BM_SETIMAGE, $IMAGE_BITMAP, $_Resources_Colorpng)) + Case "Reset" + GUICtrlSetTip($a_id_Tools[$i][1], "Löscht den Quellpfad und alle Zielpfade" & @CRLF & "sowie alle Registry-Einträge des Programmes") + GUICtrlSetStyle($a_id_Tools[$i][1], $BS_ICON) + $_Resources_Burnpng = _GDIPlus_BitmapCreateFromMemory(_Resources_Burnpng(), True) + _WinAPI_DeleteObject(_SendMessage(GUICtrlGetHandle($a_id_Tools[$i][1]), $BM_SETIMAGE, $IMAGE_BITMAP, $_Resources_Burnpng)) + Case "DEL" + GUICtrlSetTip($a_id_Tools[$i][1], "Verschiebt das aktuelle Bild in den Papierkorb" & @CRLF & "Taste [Entf]") + _AcceleratorKeyAdd("{DEL}", $a_id_Tools[$i][1]) + GUICtrlSetStyle($a_id_Tools[$i][1], $BS_ICON) + $_Resources_TrashFullpng = _GDIPlus_BitmapCreateFromMemory(_Resources_TrashFullpng(), True) + _WinAPI_DeleteObject(_SendMessage(GUICtrlGetHandle($a_id_Tools[$i][1]), $BM_SETIMAGE, $IMAGE_BITMAP, $_Resources_TrashFullpng)) + Case "Reload" + GUICtrlSetTip($a_id_Tools[$i][1], "Quellordner neu einlesen") + GUICtrlSetStyle($a_id_Tools[$i][1], $BS_ICON) + $_Resources_Refreshpng = _GDIPlus_BitmapCreateFromMemory(_Resources_Refreshpng(), True) + _WinAPI_DeleteObject(_SendMessage(GUICtrlGetHandle($a_id_Tools[$i][1]), $BM_SETIMAGE, $IMAGE_BITMAP, $_Resources_Refreshpng)) + Case "Rename" + GUICtrlSetTip($a_id_Tools[$i][1], "Aktuelles Bild umbenennen") + GUICtrlSetStyle($a_id_Tools[$i][1], $BS_ICON) + $_Resources_Editpng = _GDIPlus_BitmapCreateFromMemory(_Resources_Editpng(), True) + _WinAPI_DeleteObject(_SendMessage(GUICtrlGetHandle($a_id_Tools[$i][1]), $BM_SETIMAGE, $IMAGE_BITMAP, $_Resources_Editpng)) + Case "Hilfe" + GUICtrlSetTip($a_id_Tools[$i][1], "Blendet Hilfe zur Bedienung ein") + GUICtrlSetStyle($a_id_Tools[$i][1], $BS_ICON) + $_Resources_Helppng = _GDIPlus_BitmapCreateFromMemory(_Resources_Helppng(), True) + _WinAPI_DeleteObject(_SendMessage(GUICtrlGetHandle($a_id_Tools[$i][1]), $BM_SETIMAGE, $IMAGE_BITMAP, $_Resources_Helppng)) + Case "Profiles" + GUICtrlSetTip($a_id_Tools[$i][1], "Speichert oder Lädt eine Zielordnerliste" & @CRLF & "[P] schaltet Profile durch") + GUICtrlSetStyle($a_id_Tools[$i][1], $BS_ICON) + $_Resources_Profilespng = _GDIPlus_BitmapCreateFromMemory(_Resources_Profilespng(), True) + _WinAPI_DeleteObject(_SendMessage(GUICtrlGetHandle($a_id_Tools[$i][1]), $BM_SETIMAGE, $IMAGE_BITMAP, $_Resources_Profilespng)) + $id_ProfilesDummy = GUICtrlCreateDummy() + GUICtrlSetOnEvent($id_ProfilesDummy, "_Profiles_Switch2Next") + _AcceleratorKeyAdd("p", $id_ProfilesDummy) + Case Else + ; Noch ungenutzt, verstecken + GUICtrlSetState($a_id_Tools[$i][1],$GUI_HIDE) + EndSwitch +Next +; Auch bei den Tools soll man sehen was man gewählt hat, auch wieder die bunten Rahmen vorbereiten +$id_ToolSelected1 = GUICtrlCreateGraphic(535, 643 , 50, 50) +$id_ToolSelected2 = GUICtrlCreateGraphic(534, 642 , 52, 52) +GUICtrlSetColor($id_ToolSelected1, 0xC8C8C8) +GUICtrlSetColor($id_ToolSelected2, 0xC8C8C8) +GUICtrlSetResizing($id_ToolSelected1, $GUI_DOCKBOTTOM+$GUI_DOCKHCENTER+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) +GUICtrlSetResizing($id_ToolSelected2,$GUI_DOCKBOTTOM+$GUI_DOCKHCENTER+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) +GUICtrlSetState($id_ToolSelected1, $GUI_DISABLE) +GUICtrlSetState($id_ToolSelected2, $GUI_DISABLE) +; Und die Gruppe ist fertig +GUICtrlCreateGroup("", -99, -99, 1, 1) + +; Ab hier kommen die Navigation-Button unterhalb der Vorschau +; Hervorheben einer Schaltfläche bei Tastendruck oder Klick +$id_ButtonSelected1 = GUICtrlCreateGraphic(4, $i_ButtonPicYfromTop - 1, 52, 27) +$id_ButtonSelected2 = GUICtrlCreateGraphic(3, $i_ButtonPicYfromTop - 2, 54, 29) +GUICtrlSetColor($id_ButtonSelected1, 0xC8C8C8) +GUICtrlSetColor($id_ButtonSelected2, 0xC8C8C8) +GUICtrlSetResizing($id_ButtonSelected1, $GUI_DOCKBOTTOM+$GUI_DOCKHCENTER+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) +GUICtrlSetResizing($id_ButtonSelected2,$GUI_DOCKBOTTOM+$GUI_DOCKHCENTER+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) +GUICtrlSetState($id_ButtonSelected1, $GUI_DISABLE) +GUICtrlSetState($id_ButtonSelected2, $GUI_DISABLE) + +; Die Schaltflächen für vor / zurück etc. + das Input +$id_ButtonPicGoToFirst = GUICtrlCreateButton("Start", 5, $i_ButtonPicYfromTop, 50, 25) +GUICtrlSetResizing($id_ButtonPicGoToFirst, $GUI_DOCKBOTTOM+$GUI_DOCKHCENTER+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) +GUICtrlSetOnEvent($id_ButtonPicGoToFirst, "_ButtonPics") +_AcceleratorKeyAdd("{HOME}", $id_ButtonPicGoToFirst) +GUICtrlSetTip($id_ButtonPicGoToFirst, "[Pos1] ([Home])" & @CRLF & "Springt zum ersten Bild") + +$id_ButtonPicBack100 = GUICtrlCreateButton("-100", 60, $i_ButtonPicYfromTop, 50, 25) +GUICtrlSetResizing($id_ButtonPicBack100, $GUI_DOCKBOTTOM+$GUI_DOCKHCENTER+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) +GUICtrlSetOnEvent($id_ButtonPicBack100, "_ButtonPics") +_AcceleratorKeyAdd("{PGUP}", $id_ButtonPicBack100) +GUICtrlSetTip($id_ButtonPicBack100, "[Bild hoch]" & @CRLF & "Springt 100 Bilder zurück") + +$id_ButtonPicBack10 = GUICtrlCreateButton("-10", 115, $i_ButtonPicYfromTop, 50, 25) +GUICtrlSetResizing($id_ButtonPicBack10, $GUI_DOCKBOTTOM+$GUI_DOCKHCENTER+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) +GUICtrlSetOnEvent($id_ButtonPicBack10, "_ButtonPics") +_AcceleratorKeyAdd("{UP}", $id_ButtonPicBack10) +GUICtrlSetTip($id_ButtonPicBack10, "[Pfeil hoch]" & @CRLF & "Springt 10 Bilder zurück") + +$id_ButtonPicBack1 = GUICtrlCreateButton("<", 170, $i_ButtonPicYfromTop, 50, 25) +GUICtrlSetResizing($id_ButtonPicBack1, $GUI_DOCKBOTTOM+$GUI_DOCKHCENTER+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) +GUICtrlSetOnEvent($id_ButtonPicBack1, "_ButtonPics") +_AcceleratorKeyAdd("{LEFT}", $id_ButtonPicBack1) +GUICtrlSetTip($id_ButtonPicBack1, "[Pfeil links]" & @CRLF & "Springt 1 Bild zurück") + +$id_InputPicNumber = GUICtrlCreateInput("0", 225, $i_ButtonPicYfromTop, 75, 25, BitOR($GUI_SS_DEFAULT_INPUT,$ES_CENTER)) +GUICtrlSetFont($id_InputPicNumber, $s_FontSizeInputs * $i_AppliedDPI, 400, 0, $s_FontNameInputs) +GUICtrlSetResizing($id_InputPicNumber, $GUI_DOCKBOTTOM+$GUI_DOCKHCENTER+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) +GUICtrlSetOnEvent($id_InputPicNumber, "_ButtonPics") + +$id_ButtonPicForward1 = GUICtrlCreateButton(">", 305, $i_ButtonPicYfromTop, 50, 25) +GUICtrlSetResizing($id_ButtonPicForward1, $GUI_DOCKBOTTOM+$GUI_DOCKHCENTER+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) +GUICtrlSetOnEvent($id_ButtonPicForward1, "_ButtonPics") +_AcceleratorKeyAdd("{RIGHT}", $id_ButtonPicForward1) +GUICtrlSetTip($id_ButtonPicForward1, "[Pfeil rechts]" & @CRLF & "Springt 1 Bild vor") + +$id_ButtonPicForward10 = GUICtrlCreateButton("+10", 360, $i_ButtonPicYfromTop, 50, 25) +GUICtrlSetResizing($id_ButtonPicForward10, $GUI_DOCKBOTTOM+$GUI_DOCKHCENTER+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) +GUICtrlSetOnEvent($id_ButtonPicForward10, "_ButtonPics") +_AcceleratorKeyAdd("{DOWN}", $id_ButtonPicForward10) +GUICtrlSetTip($id_ButtonPicForward10, "[Pfeil runter]" & @CRLF & "Springt 10 Bilder vor") + +$id_ButtonPicForward100 = GUICtrlCreateButton("+100", 415, $i_ButtonPicYfromTop, 50, 25) +GUICtrlSetResizing($id_ButtonPicForward100, $GUI_DOCKBOTTOM+$GUI_DOCKHCENTER+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) +GUICtrlSetOnEvent($id_ButtonPicForward100, "_ButtonPics") +_AcceleratorKeyAdd("{PGDN}", $id_ButtonPicForward100) +GUICtrlSetTip($id_ButtonPicForward100, "[Bild runter]" & @CRLF & "Springt 100 Bilder vor") + +$id_ButtonPicGoToLast = GUICtrlCreateButton("Ende", 470, $i_ButtonPicYfromTop, 50, 25) +GUICtrlSetResizing($id_ButtonPicGoToLast, $GUI_DOCKBOTTOM+$GUI_DOCKHCENTER+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) +GUICtrlSetOnEvent($id_ButtonPicGoToLast, "_ButtonPics") +_AcceleratorKeyAdd("{END}", $id_ButtonPicGoToLast) +GUICtrlSetTip($id_ButtonPicGoToLast, "[Ende]" & @CRLF & "Springt zum letzten Bild") + +$id_CheckboxPictureFitSize = GUICtrlCreateCheckbox("Größe anpassen", 5, 685, 137, 17) +GUICtrlSetState($id_CheckboxPictureFitSize, $GUI_CHECKED) +GUICtrlSetResizing($id_CheckboxPictureFitSize, $GUI_DOCKLEFT+$GUI_DOCKBOTTOM+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) +GUICtrlSetOnEvent($id_CheckboxPictureFitSize, "_ButtonPics") + +; Ab hier die Vorschau. Ich wollte einen schwarzen Rand umzu. +; Label dahinter etc. hat nicht funktioniert. Also diese Version mit Linien aus Labels einmal umzu. +; Könnte auch mit GUICtrlCreateGraphic() gehen, jetzt bleibt das aber so + +; oben Horizontal +$id_LabelBehindPicture1 = GUICtrlCreateLabel("", 5, 88, 514, 2) +GUICtrlSetResizing($id_LabelBehindPicture1, $GUI_DOCKLEFT+$GUI_DOCKRIGHT+$GUI_DOCKTOP) +GUICtrlSetBkColor($id_LabelBehindPicture1, 0x000000) +GUICtrlSetState($id_LabelBehindPicture1, $GUI_DISABLE) + +; links +$id_LabelBehindPicture2 = GUICtrlCreateLabel("", 5, 88, 2, 530) +GUICtrlSetResizing($id_LabelBehindPicture2, $GUI_DOCKLEFT+$GUI_DOCKTOP+$GUI_DOCKBOTTOM) +GUICtrlSetBkColor($id_LabelBehindPicture2, 0x000000) +GUICtrlSetState($id_LabelBehindPicture2, $GUI_DISABLE) + +;rechts +$id_LabelBehindPicture3 = GUICtrlCreateLabel("", 517, 88, 2, 530) +GUICtrlSetResizing($id_LabelBehindPicture3, $GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKBOTTOM) +GUICtrlSetBkColor($id_LabelBehindPicture3, 0x000000) +GUICtrlSetState($id_LabelBehindPicture3, $GUI_DISABLE) + +;unten +;~ Global $id_LabelBehindPicture4 = GUICtrlCreateLabel("", 5, 616, 514, 2) +;~ GUICtrlSetResizing($id_LabelBehindPicture4, $GUI_DOCKLEFT+$GUI_DOCKRIGHT+$GUI_DOCKBOTTOM) +;~ GUICtrlSetBkColor($id_LabelBehindPicture4, 0x000000) +;~ GUICtrlSetState($id_LabelBehindPicture4, $GUI_DISABLE) + +; Labelmit dem aktuellen Bildnamen unterhalb der Vorschau: +;~ $id_LabelPictureName = GUICtrlCreateLabel("", 5, 616, 514, 20, BitOR($SS_CENTER,$SS_CENTERIMAGE)) +$id_LabelPictureName = GUICtrlCreateLabel("", 5, 616, 514, 20, BitOR($SS_CENTER,$SS_CENTERIMAGE)) +GUICtrlSetResizing($id_LabelPictureName, $GUI_DOCKLEFT+$GUI_DOCKRIGHT+$GUI_DOCKBOTTOM) +GUICtrlSetFont($id_LabelPictureName, $s_FontSizeForm * $i_AppliedDPI, 400, 0, $s_FontNameInputs) +GUICtrlSetColor($id_LabelPictureName, 0xDDDDDD) +GUICtrlSetBkColor($id_LabelPictureName, 0x000000) + + +; Zentrieren - ist leicht anders als -1 +$a_FormFotoSortNew_Size = WinGetPos($h_FormFotoSort2017) +$a_FormFotoSortNew_Size[0] = Int((@DesktopWidth - $a_FormFotoSortNew_Size[2]) / 2) ; Falls es 0 wäre - Null darf man teilen (durch 0 nicht) +$a_FormFotoSortNew_Size[1] = Int((@DesktopHeight - $a_FormFotoSortNew_Size[3]) / 2) +WinMove($h_FormFotoSort2017, "", $a_FormFotoSortNew_Size[0], $a_FormFotoSortNew_Size[1], $a_FormFotoSortNew_Size[2], $a_FormFotoSortNew_Size[3]) + +; GUI anzeigen: +GUISetState(@SW_SHOW, $h_FormFotoSort2017) + +; Und die Vorschau erstellen. Die GDIPlus Funktionen scheinen nur bei einer sichtbaren GUI zu funktionieren +$id_Picture = GUICtrlCreatePic("", 7, 90, 510, 526) +GUICtrlSetResizing($id_Picture, $GUI_DOCKLEFT+$GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKBOTTOM) +GUICtrlSetStyle($id_Picture, "", $WS_EX_TOPMOST) +GUICtrlSetState($id_Picture, $GUI_DROPACCEPTED) +; Leeres Bild "Transparent" als Binary laden +$h_Resources_PicTestBildpngGlobal = _GDIPlus_BitmapCreateFromMemory(_Resources_PicTestBildpng(), True) +$d_Resources_PicTestBildpngGlobal = _Resources_PicTestBildpng() +; und in das Pic-Control setzen +_WinAPI_DeleteObject(GUICtrlSendMsg($id_Picture, $STM_SETIMAGE, $IMAGE_BITMAP, $h_Resources_PicTestBildpngGlobal)) +$b_Use_GuiCtrlSetImageEx = False +#EndRegion GUI-FormFotoSort2017 + + +#Region Startup +; ############################################################################################################################################################################################### +; ###### ######## ### ######## ######## ## ## ######## +; ## ## ## ## ## ## ## ## ## ## ## ## +; ## ## ## ## ## ## ## ## ## ## ## +; ###### ## ## ## ######## ## ## ## ######## +; ## ## ######### ## ## ## ## ## ## +; ## ## ## ## ## ## ## ## ## ## ## +; ###### ## ## ## ## ## ## ####### ## +; ############################################################################################################################################################################################### +; Eigentlich ist alles nun soweit, alles nachfolgende dient zum wiederherstellen der Einstellungen der letzten Sitzung +; sowie um die Funktionen zu registrieren und sonstige Anpassungen + +; Das letzte zwischengespeicherte Bild laden. Gibt es den Key nicht so kommt nichts zurück. +; Dank Int() wird auch aus Nichts eine 0 = ein gültiger Wert +$i_CurrentPictureSavedFromregistry = Int(_SettingsRead("$id_InputPicNumber")) + +; Program-Icon setzen falls nicht kompiliert +If @Compiled = 0 Then + Local $_Resources_FotoSort2017ico = _GDIPlus_BitmapCreateFromMemory(_Resources_FotoSort2017ico(), False) + _WinAPI_SetWindowTitleIcon($_Resources_FotoSort2017ico, $h_FormFotoSort2017) +EndIf + +; Version in den Fenstertitel setzen: +WinSetTitle($h_FormFotoSort2017, "", $s_ProgramTitle & " " & $s_ProgramVersion) + +; Die Statusbar ist nicht wie die anderen Controls an den Rändern "angeklebt". +; Wir müssen nach jeder Größenanderung eine Funktion aufrufen welche die Statusbar wieder anpasst +; Inzwischen sort die Funktion auch für die Anpassung der Vorschau und die Anzahl der Zielordner etc. +GUIRegisterMsg($WM_SIZE, "WM_SIZE") + +; Wir wollen die Bilder auch mit dem Mausrad durchschalten - die Lösung ist wiederum von Oscar: https://autoit.de/index.php/Thread/83596-MouseWheel-auswerten/ +GUIRegisterMsg($WM_MOUSEWHEEL, 'WM_MOUSEWHEEL') + +; Da wir nicht mit Tastenkombinationen arbeiten (sondern auch direkt die Zahlen nutzen) müssen +; diese deaktiviert werden sobald das Input mit der Bildnummer oder dem Suffix den Focus erhält +; https://www.autoitscript.com/forum/topic/98963-can-i-set-an-event-click-on-an-input-textbox/ +GUIRegisterMsg($WM_COMMAND, "WM_COMMAND") + +; Die GUI soll einen minimale Größe von 1024 x 768 nicht unterschreiten. +; Die Lösung: +; 1. Wir holen uns die Anfangsgröße (sollte 1024 x 768 sein, Bei GUICreate steht die Größe der inneren Nutzfläche) +$a_FormFotoSortNew_Size = WinGetPos($h_FormFotoSort2017) +; 2. Wir setzen die erlaubten minimal und maximal Werte +$i_FormFotoSortNew_SizeMinWidth = $a_FormFotoSortNew_Size[2] +$i_FormFotoSortNew_SizeMinHeight = $a_FormFotoSortNew_Size[3] +; Als maximale Werte nehmen wir die des Desktops +$i_FormFotoSortNew_SizeMaxWidth = @DesktopWidth +$i_FormFotoSortNew_SizeMaxHeight = @DesktopHeight +; 3. Wir registrieren eine Funktion welche dafür sorgt das die Grenzwerte eingehalten werden, diese wird von Windows/AutoIt automatisch aufgerufen +GUIRegisterMsg($WM_GETMINMAXINFO, "WM_GETMINMAXINFO") + +; Funktion Registrieren die reagiert wenn per Drag'n Drop eine Datei auf die GUI gezogen wird +; Reagiert nur wenn die Maustaste über einem dafür vorbereiteten Control losgelassen wird +GUISetOnEvent($GUI_EVENT_DROPPED, "GUI_EVENT_DROPPED", $h_FormFotoSort2017) + +;Funktionien für Doppelklick auf das Bild +GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, '_PrimaryDown') + +; Weitere Einstellungen aus der Registry wiederherstellen: +; Größe der GUI / des Fensters +$a_FormFotoSortNew_Size[2] = _SettingsRead("$a_FormFotoSortNew_Size[2]") ; Gibt es den Wert nicht so kommt 0 zurück +$a_FormFotoSortNew_Size[3] = _SettingsRead("$a_FormFotoSortNew_Size[3]") +$a_FormFotoSortNew_Size[0] = Int((@DesktopWidth - $a_FormFotoSortNew_Size[2]) / 2) ; Falls es 0 wäre - Null darf man teilen (durch 0 nicht) +$a_FormFotoSortNew_Size[1] = Int((@DesktopHeight - $a_FormFotoSortNew_Size[3]) / 2) +If $a_FormFotoSortNew_Size[2] >= $i_FormFotoSortNew_SizeMinWidth And $a_FormFotoSortNew_Size[3] >= $i_FormFotoSortNew_SizeMinHeight Then + ; Alle vorgaben wurden eingehalten, neue Größe einstellen + WinMove($h_FormFotoSort2017, "", $a_FormFotoSortNew_Size[0], $a_FormFotoSortNew_Size[1], $a_FormFotoSortNew_Size[2], $a_FormFotoSortNew_Size[3]) +EndIf + +If _SettingsRead("$b_FormIsMaximized") = "True" Then + ; Und falls das Programm maximiert geschlossen wurden, maximieren wir es auch wieder + $b_FormIsMaximized = True +Else + $b_FormIsMaximized = False +EndIf +; Warum erst die Variable setzen und nicht gleich WinSetState() aufrufen? Weil wir einen Platzhalter brauchten um es in den Einstellungen zu speichern! +; Für alles andere gibt es eine Variable, also auch hier. +If $b_FormIsMaximized = True Then + WinSetState($h_FormFotoSort2017, "", @SW_MAXIMIZE) +EndIf + +; Optionen bei doppelten Dateinamen wiederherstellen +If Int(_SettingsRead("$id_RadioOverwrite")) <> 0 Then + GUICtrlSetState($id_RadioOverwrite, _SettingsRead("$id_RadioOverwrite")) + GUICtrlSetState($id_RadioAddSuffix, _SettingsRead("$id_RadioAddSuffix")) + GUICtrlSetState($id_RadioAskOverwrite, _SettingsRead("$id_RadioAskOverwrite")) + GUICtrlSetData($id_InputSuffix, _SettingsRead("$id_InputSuffix")) + GUICtrlSetState($id_CheckboxDoubleFiles, _SettingsRead("$id_CheckboxDoubleFiles")) +EndIf + + + +; Profile +$i_ProfileActive = Int(_SettingsRead("$i_ProfileActive")) +$s_ProfileActive = _SettingsRead("$s_ProfileActive") +$a_Profiles[0] = Int(_SettingsRead("$a_Profiles[0]")) + +If $s_ProfileActive = "" Or $a_Profiles[0] = 0 Then + ReDim $a_Profiles[2] + $a_Profiles[0] = 1 + $a_Profiles[1] = "Standard" + $i_ProfileActive = 1 + $s_ProfileActive = "Standard" +Else + ReDim $a_Profiles[ $a_Profiles[0] + 1 ] + For $i = 1 To $a_Profiles[0] Step 1 + $a_Profiles[$i] = _SettingsRead("$a_Profiles[" & $i &"]") + Next +EndIf +_GUICtrlStatusBar_SetText($id_StatusBar, $s_ProfileActive , 2) +_GUICtrlStatusBar_SetIcon($id_StatusBar, 2, $h_IconProfiles) + + +; Zielverzeichnisse +GUICtrlSetData($a_id_TargetDirectories[1][3], _SettingsRead("$a_id_TargetDirectories[1][3]" & "-" & $s_ProfileActive)) +For $i = 2 To Int(_SettingsRead("$a_id_TargetDirectories[0][0]" & "-" & $s_ProfileActive)) Step 1 ; gibt es den Wert nicht so ist er 0 - und die Schleife wird nie gestartet + _Folder_Add() + GUICtrlSetData($a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][3], _SettingsRead("$a_id_TargetDirectories[" & $i & "][3]" & "-" & $s_ProfileActive)) +Next + +; Manchmal - warum auch immer - sitzen nach einem Programmstart und einem WinMove die + und - Schaltflächen nicht richtig. Also Sicherheitshalber noch mal die Korrektur laufen lassen +Local $a_ControlPos = ControlGetPos($h_FormFotoSort2017, "", $a_id_TargetDirectories[ $a_id_TargetDirectories[0][0] ][1]) +GUICtrlSetPos($id_ButtonAddTargetDirectory, $a_ControlPos[0], 232 + (($a_id_TargetDirectories[0][0] - 1) * $i_Distance)) +GUICtrlSetPos($id_ButtonRemoveTargetDirectory, $a_ControlPos[0] + 32, 232 + (($a_id_TargetDirectories[0][0] - 1) * $i_Distance)) + +; Alle Dateiformate anhaken falls es noch keine Voreinstellungen gibt: +If Int(_SettingsRead("$a_id_CheckboxFileformat[0]")) = 0 Then ; Nein, 0 ist kein gültiger Wert für eine Checkbox + ; Wir klicken die Checkbox an damit die Funktion startet + ; Bei direkten Aufruf wäre @GUI_CtrlId nicht "vorhanden" und die ist an der Stelle wichtig + ; Hätte man auch anders lösen können. + ControlClick($h_FormFotoSort2017, "", $a_id_CheckboxFileformat[0]) +Else + ; Ansonsten Auswahl wieder herstellen + For $z = 0 To (UBound($a_id_CheckboxFileformat) - 1) Step 1 + GUICtrlSetState($a_id_CheckboxFileformat[$z], _SettingsRead("$a_id_CheckboxFileformat[" & $z & "]")) + Next + _CheckboxFileformatCreatePattern() ; Suchpattern auf Basis der Auswahl der Checkboxen erstellen +EndIf + +; Checkbox Bild anpassen (oder nicht) +If Int(_SettingsRead("$id_CheckboxPictureFitSize")) <> 0 Then + GUICtrlSetState($id_CheckboxPictureFitSize, _SettingsRead("$id_CheckboxPictureFitSize")) +EndIf + +; Hintergrundfarbe +If Int(_SettingsRead("$d_BackgroundColor_ARGB")) <> 0 Then + $d_BackgroundColor_ARGB = _SettingsRead("$d_BackgroundColor_ARGB") +EndIf + +; Quellverzeichnis +GUICtrlSetData($id_InputSourceDirectory, _SettingsRead("$id_InputSourceDirectory")) +If _SettingsRead("$_b_ScanFolderRecursive") = "True" Then + GUICtrlSetState($id_CheckboxScanFolderRecursive, $GUI_CHECKED) +Else + GUICtrlSetState($id_CheckboxScanFolderRecursive, $GUI_UNCHECKED) +EndIf +; Jetzt haben wir alles - die Dateien aus dem zuletzt genutzen Pfad auslesen +_ReadFileList() +; Das zuletzt angezeigte Bild anzeigen (sofern möglich) +_SelectCurrentPicture($i_CurrentPictureSavedFromregistry) +; Tastendrücke aktivieren +GUISetAccelerators($a_AcceleratorKeys, $h_FormFotoSort2017) + +; Und einmal Prüfen welche Buttons angezeigt werden dürfen (Ist nur notwendig wenn mit leeren Bild gestartet wird - schadet aber auch nicht +_ButtonPicsCheckEnableDisable() + +#EndRegion Startup +#Region Main +; ############################################################################################################################################################################################### +; ## ## ### ## ## ######## ######## ###### ###### ## ## ## ######## #### ######## ######## +; ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## +; ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## +; ######### ## ## ## ## ######## ## ###### ## ######### ## ###### ## ###### ###### +; ## ## ######### ## ## ## ## ## ## ## ## ## ## ## ## ## +; ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## +; ## ## ## ## ####### ## ## ###### ###### ## ## ######## ######## #### ## ######## +; ############################################################################################################################################################################################### +While 1 + Sleep(100) + If _IsPressed("04") = True Then ; Check ob die mittlere Maustaste gedrückt wurde (zum Profilwechsel) + _Profiles_Switch2Next() + Sleep(250) + EndIf +WEnd +#EndRegion Main \ No newline at end of file