[R] Aide concernant drag & drop

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
keving
Niveau 1
Niveau 1
Messages : 11
Enregistré le : mar. 01 juin 2021 16:00
Status : Hors ligne

[R] Aide concernant drag & drop

#1

Message par keving »

Bonjour,

J'écrit actuellement un petit script qui me sert de launcher. Jusque là tout fonctionne (ou presque), et je me suis dit qu'il serait pas mal d'ajouter du drag & drop :
  1. A la place d'ouvrir le FileOpenDialog pour sélectionner des fichiers (Dans la modification d'un bouton, via clic droit dessus)
  2. Pour pouvoir intervertir deux boutons (directement dans la fenêtre principale)
Image
Pour le petit 1:
J'ai ajouté sur mes Inputs GUICtrlSetState(-1, $GUI_DROPACCEPTED)
Si $GUI_DROPACCEPTED(8) est défini sur un contrôle visible un drag & drop peut être pris en compte. Le contrôle Edit ou Input sera défini avec le nom du fichier.
Pour d'autres contrôles à la réception de $GUI_EVENT_DROPPED, @GUI_DragId retournera le controlID d'où le drag a démarré (-1 si c'est un fichier, @GUI_DragFile contient le nom du fichier entrain de subir le 'drag') et @GUI_DropId retourne le controlID du contrôle entrain de subir le 'drop'.
C'est seulement lors du 'drag' d'un ListViewItem que démarrera le processus du drag & drop. @GUI_DragId sera le controlID du ListView.
Puis GUISetOnEvent($GUI_EVENT_DROPPED, "__onDrop")
Fin d'une action Drag&Drop. Les macros @GUI_DragId, @GUI_DragFile et @GUI_DropId seront utilisés pour obtenir l'ID/fichier du contrôle impliqué.
Donc, en ayant fait ça, je m'attendais à pouvoir récupérer un drag & drop d'un fichier depuis Windows dans mon input, mais non, je me retrouve avec le petit symbole qui me dit pas touche à ça et quand je drop il ne se passe absolument rien :(

PS: Je commence à regarder de ce côté , mais est ce que c'est là solution? Si oui, comment l'implémenter en mode Opt("GUIOnEventMode", 1)?

Pour le petit 2:
J'ai ajouté sur mes boutons GUICtrlSetState(-1, $GUI_DROPACCEPTED), ce qui pour moi aurait dû suffire vu que j'avais déjà ajouté le GUISetOnEvent($GUI_EVENT_DROPPED, "__onDrop")...
Je n'arrive pas trop à comprendre comment je peux débuter le drag avec mes boutons, car j'ai l'impression que ça ne fait absolument rien non plus...

Tout mon code est disponible ici (et sûrement plus à jour): https://github.com/kevingrillet/AutoIt- ... uncher.au3
Ou directement là:
#cs ----------------------------------------------------------------------------

 AutoIt Version: 3.3.14.5
 Author:         kevingrillet

 Script Function:
   Small launcher.

#ce ----------------------------------------------------------------------------

#RequireAdmin

#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=icons\launcher.ico
#AutoIt3Wrapper_Outfile=AutoIt_Launcher.exe
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_UseUpx=y
#AutoIt3Wrapper_Res_Description=Small launcher
#AutoIt3Wrapper_Res_Fileversion=0.0.0.1
#AutoIt3Wrapper_Res_LegalCopyright=Copyright (C) 2021
#AutoIt3Wrapper_Res_Language=1033
#AutoIt3Wrapper_Res_Field=Compiler Date|%date%
#AutoIt3Wrapper_Res_Field=Compiler Heure|%time%
#AutoIt3Wrapper_Res_Field=Compiler Version|AutoIt v%AutoItVer%
#AutoIt3Wrapper_Res_Field=Author|kevingrillet
#AutoIt3Wrapper_Res_Field=Github|https://github.com/kevingrillet/AutoIt-Launcher
#AutoIt3Wrapper_Add_Constants=n
#AutoIt3Wrapper_Run_Tidy=y
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

#Region ### INCLUDES ###
#include <Array.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <File.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <TrayConstants.au3>
#include <WindowsConstants.au3>
#EndRegion ### INCLUDES ###

#Region ### CONSTANTS ###
;~ Button struct
Const $CST_HINT = 0
Const $CST_ICON = $CST_HINT + 1
Const $CST_MODE = $CST_ICON + 1
Const $CST_RUN_PROGRAM = $CST_MODE + 1
Const $CST_RUN_WORKINGDIR = $CST_RUN_PROGRAM + 1
Const $CST_SHELL_FILENAME = $CST_RUN_WORKINGDIR + 1
Const $CST_SHELL_PARAMETERS = $CST_SHELL_FILENAME + 1
Const $CST_SHELL_WORKINGDIR = $CST_SHELL_PARAMETERS + 1
Const $CST_SCRIPT_PATH = $CST_SHELL_WORKINGDIR + 1
;~ Button mode
Const $CST_RUN = 0
Const $CST_SHELLEXECUTE = 1
Const $CST_SCRIPT = 2
#EndRegion ### CONSTANTS ###

#Region ### VARIABLES ###
Dim $aListButton[1][1]
Dim $aDataButton[1][$CST_SCRIPT_PATH + 1]
Local $bEdit = False
Local $iButtonIDEdit = -1
Local $sPathButtons = @ScriptDir & "\AutoIt_Launcher_buttons.data"
Local $sPathIni = @ScriptDir & "\AutoIt_Launcher.ini"
Local $sPathLog = @ScriptDir & "\AutoIt_Launcher.log"
#EndRegion ### VARIABLES ###

#Region ### OPT ###
Opt("GUIOnEventMode", 1) ;0=disabled, 1=OnEvent mode enabled
Opt("TrayAutoPause", 0) ;0=no pause, 1=Pause
Opt("TrayMenuMode", 3) ;0=append, 1=no default menu, 2=no automatic check, 4=menuitemID  not return
Opt("TrayOnEventMode", 1) ;0=disable, 1=enable
#EndRegion ### OPT ###

#Region ### START Koda GUI section ### Form=d:\users\kevin\documents\github\autoit-launcher\forms\fglobalsettings.kxf
$fGlobalSettings = GUICreate("Global Settings", 158, 157, -1, -1, $WS_SYSMENU)
GUISetOnEvent($GUI_EVENT_CLOSE, "fGlobalSettingsClose")
$lCols = GUICtrlCreateLabel("Columns", 8, 43, 44, 17)
$lRow = GUICtrlCreateLabel("Row", 8, 11, 26, 17)
$iRow = GUICtrlCreateInput("1", 56, 8, 89, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_RIGHT, $ES_NUMBER))
GUICtrlSetOnEvent(-1, "__onChange")
$iCol = GUICtrlCreateInput("1", 56, 40, 89, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_RIGHT, $ES_NUMBER))
GUICtrlSetOnEvent(-1, "__onChange")
$cbLog = GUICtrlCreateCheckbox("Save log", 8, 72, 97, 17)
GUICtrlSetOnEvent(-1, "__onChange")
$bSaveSettings = GUICtrlCreateButton("Save Global Settings", 8, 96, 139, 25)
GUICtrlSetOnEvent(-1, "bSaveSettingsClick")
;~ GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

#Region ### START Koda GUI section ### Form=d:\users\kevin\documents\github\autoit-launcher\forms\fbuttonsettings.kxf
$fButtonSettings = GUICreate("Button Settings", 498, 431, -1, -1, BitOR($WS_SYSMENU, $WS_EX_ACCEPTFILES))
GUISetOnEvent($GUI_EVENT_CLOSE, "fButtonSettingsClose")
$lButtonHint = GUICtrlCreateLabel("Button Hint", 16, 19, 57, 17)
$iButtonHint = GUICtrlCreateInput("", 104, 16, 369, 21)
GUICtrlSetOnEvent(-1, "__onChange")
$lButtonIcon = GUICtrlCreateLabel("Icon", 16, 51, 25, 17)
$iButtonIcon = GUICtrlCreateInput("", 104, 48, 289, 21)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
GUICtrlSetOnEvent(-1, "__onChange")
$bIcon = GUICtrlCreateButton("Open", 400, 47, 74, 23)
GUICtrlSetOnEvent(-1, "bIconClick")
$gGroupSettings = GUICtrlCreateGroup("", 8, 80, 473, 281)
$rRun = GUICtrlCreateRadio("Run", 16, 96, 113, 17)
GUICtrlSetState(-1, $GUI_CHECKED)
GUICtrlSetOnEvent(-1, "rClick")
$rCustomScript = GUICtrlCreateRadio("Custom Script", 16, 304, 113, 17)
GUICtrlSetOnEvent(-1, "rClick")
$lRunProgram = GUICtrlCreateLabel("Program", 32, 123, 43, 17)
$iRunProgram = GUICtrlCreateInput("", 104, 120, 369, 21)
GUICtrlSetOnEvent(-1, "__onChange")
$lRunWorkingdir = GUICtrlCreateLabel("Working Dir.", 32, 155, 63, 17)
$iRunWorkingdir = GUICtrlCreateInput("", 104, 152, 369, 21)
GUICtrlSetOnEvent(-1, "__onChange")
$rShellExecute = GUICtrlCreateRadio("ShellExecute", 16, 184, 113, 17)
GUICtrlSetOnEvent(-1, "rClick")
$lShellFilename = GUICtrlCreateLabel("Filename", 32, 211, 46, 17)
$iShellFilename = GUICtrlCreateInput("", 104, 208, 369, 21)
GUICtrlSetOnEvent(-1, "__onChange")
$lShellParameters = GUICtrlCreateLabel("Parameters", 32, 243, 57, 17)
$iShellWorkingdir = GUICtrlCreateInput("", 104, 272, 369, 21)
GUICtrlSetOnEvent(-1, "__onChange")
$lShellWorkingdir = GUICtrlCreateLabel("Working Dir.", 32, 275, 63, 17)
$iShellParameters = GUICtrlCreateInput("", 104, 240, 369, 21)
GUICtrlSetOnEvent(-1, "__onChange")
$lScriptPath = GUICtrlCreateLabel("Path", 32, 331, 26, 17)
$iScriptPath = GUICtrlCreateInput("", 104, 328, 289, 21)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
GUICtrlSetOnEvent(-1, "__onChange")
$bScriptPath = GUICtrlCreateButton("Open", 400, 327, 74, 23)
GUICtrlSetOnEvent(-1, "bScriptPathClick")
GUICtrlCreateGroup("", -99, -99, 1, 1)
$bSaveButton = GUICtrlCreateButton("Save", 7, 368, 475, 25)
GUICtrlSetOnEvent(-1, "bSaveButtonClick")
GUISetOnEvent($GUI_EVENT_DROPPED, "__onDrop")
;~ GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

#Region ### START Koda GUI section ### Form=d:\users\kevin\documents\github\autoit-launcher\forms\fautoitlauncher.kxf
$fAutoItLauncher = GUICreate("AutoIt Launcher", 615, 437, -1, -1, $WS_SYSMENU)
GUISetOnEvent($GUI_EVENT_CLOSE, "fAutoItLauncherClose")
GUISetOnEvent($GUI_EVENT_SECONDARYUP, "fAutoItLauncherSecondaryUp")
GUISetOnEvent($GUI_EVENT_DROPPED, "__onDrop")
;~ GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###


#Region ### TrayIcon ###
$miShow = TrayCreateItem("Show AutoIt Launcher")
TrayItemSetOnEvent(-1, "__Show")
$miShowSettings = TrayCreateItem("Show Global Settings")
TrayItemSetOnEvent(-1, "__ShowGlobalSettings")
$miShutDown = TrayCreateItem("Shut Down AutoIt Launcher")
TrayItemSetOnEvent(-1, "__Exit")
TraySetOnEvent($TRAY_EVENT_PRIMARYDOUBLE, "__Show")
TraySetToolTip("AutoIt Launcher")
#EndRegion ### TrayIcon ###

__Log("Starting")
__LoadIni()
If Not FileExists($sPathIni) Then
   __ShowGlobalSettings()
Else
   __LoadButtons()
   __Show()
EndIf

While 1
   Sleep(100)
WEnd

Func __BtnClick($CtrlId, $bPrimary = True)
   Local $buttonID = 0
   For $y = 0 To GUICtrlRead($iRow) - 1 Step 1
      For $x = 0 To GUICtrlRead($iCol) - 1 Step 1
         If $aListButton[$y][$x] = $CtrlId Then
            $buttonID = $y * GUICtrlRead($iCol) + $x
            If $bPrimary And $buttonID <= UBound($aDataButton) And $CST_MODE < UBound($aDataButton, 2) And $aDataButton[$buttonID][$CST_MODE] <> "" Then
               Switch $aDataButton[$buttonID][$CST_MODE]
                  Case $CST_RUN
                     Run($aDataButton[$buttonID][$CST_RUN_PROGRAM], $aDataButton[$buttonID][$CST_RUN_WORKINGDIR])
                  Case $CST_SHELLEXECUTE
                     ShellExecute($aDataButton[$buttonID][$CST_SHELL_FILENAME], $aDataButton[$buttonID][$CST_SHELL_PARAMETERS], $aDataButton[$buttonID][$CST_SHELL_WORKINGDIR])
                  Case $CST_SCRIPT
                     __RunAU3($aDataButton[$buttonID][$CST_SCRIPT_PATH])
               EndSwitch
            Else
               __LoadButtonSettings($buttonID)
            EndIf
            ExitLoop
         EndIf
      Next
   Next
EndFunc   ;==>__BtnClick
Func __Exit()
   __SaveIni()
   __Log("Exiting")
   Exit
EndFunc   ;==>__Exit
Func __GUIVisible()
   Local $res = False
   If WinGetState($fAutoItLauncher) = $WIN_STATE_VISIBLE Then $res = True
   If WinGetState($fGlobalSettings) = $WIN_STATE_VISIBLE Then $res = True
   If WinGetState($fButtonSettings) = $WIN_STATE_VISIBLE Then $res = True
   Return $res
EndFunc   ;==>__GUIVisible
Func __LoadButtonSettings($buttonID)
   $iButtonIDEdit = $buttonID
   GUISetState(@SW_HIDE, $fAutoItLauncher)
   If $iButtonIDEdit <= UBound($aDataButton, 1) And $CST_SCRIPT_PATH + 1 = UBound($aDataButton, 2) Then
      GUICtrlSetData($iButtonHint, $aDataButton[$iButtonIDEdit][$CST_HINT])
      GUICtrlSetData($iButtonIcon, $aDataButton[$iButtonIDEdit][$CST_ICON])
      Switch $aDataButton[$iButtonIDEdit][$CST_MODE]
         Case $CST_RUN
            GUICtrlSetState($rRun, $GUI_CHECKED)
         Case $CST_SHELLEXECUTE
            GUICtrlSetState($rShellExecute, $GUI_CHECKED)
         Case $CST_SCRIPT
            GUICtrlSetState($rCustomScript, $GUI_CHECKED)
      EndSwitch
      GUICtrlSetData($iRunProgram, $aDataButton[$iButtonIDEdit][$CST_RUN_PROGRAM])
      GUICtrlSetData($iRunWorkingdir, $aDataButton[$iButtonIDEdit][$CST_RUN_WORKINGDIR])
      GUICtrlSetData($iShellFilename, $aDataButton[$iButtonIDEdit][$CST_SHELL_FILENAME])
      GUICtrlSetData($iShellParameters, $aDataButton[$iButtonIDEdit][$CST_SHELL_PARAMETERS])
      GUICtrlSetData($iShellWorkingdir, $aDataButton[$iButtonIDEdit][$CST_SHELL_WORKINGDIR])
      GUICtrlSetData($iScriptPath, $aDataButton[$iButtonIDEdit][$CST_SCRIPT_PATH])
   Else
      GUICtrlSetData($iButtonHint, "")
      GUICtrlSetData($iButtonIcon, "")
      GUICtrlSetState($rRun, $GUI_CHECKED)
      GUICtrlSetData($iRunProgram, "")
      GUICtrlSetData($iRunWorkingdir, "")
      GUICtrlSetData($iShellFilename, "")
      GUICtrlSetData($iShellParameters, "")
      GUICtrlSetData($iShellWorkingdir, "")
      GUICtrlSetData($iScriptPath, "")
   EndIf
   rClick()
   GUISetState(@SW_SHOW, $fButtonSettings)
EndFunc   ;==>__LoadButtonSettings
Func __LoadButtons()
   If FileExists($sPathButtons) Then
      _FileReadToArray($sPathButtons, $aDataButton, $FRTA_NOCOUNT, "|")
   EndIf
   __ResizeArray()
   __RefreshButtons()
EndFunc   ;==>__LoadButtons
Func __LoadIni()
   __Log("LoadIni")
   GUICtrlSetData($iCol, IniRead($sPathIni, "AutoIt_Launcher_Global_Settings", "iCol", 1))
   GUICtrlSetData($iRow, IniRead($sPathIni, "AutoIt_Launcher_Global_Settings", "iRow", 1))
   GUICtrlSetState($cbLog, IniRead($sPathIni, "AutoIt_Launcher_Global_Settings", "cbLog", $GUI_UNCHECKED))
EndFunc   ;==>__LoadIni
Func __Log($sToLog)
   If GUICtrlRead($cbLog) = $GUI_CHECKED Then
      _FileWriteLog($sPathLog, $sToLog & @CRLF)
   EndIf
EndFunc   ;==>__Log
Func __onChange()
   $bEdit = True
EndFunc   ;==>__onChange
Func __onDrop()
   MsgBox($MB_SYSTEMMODAL, "Debug", "DragId: " & @GUI_DragId & @CRLF & "DropId: " & @GUI_DropId & @CRLF & "DragFile: " & @GUI_DragFile) ; TODO: Not working
   If @GUI_DragId = -1 Then
      If @GUI_DropId = $iButtonIcon Then
         GUICtrlSetData($iButtonIcon, StringReplace(@GUI_DragFile, @ScriptDir & "\", ""))
      ElseIf @GUI_DropId = $iScriptPath Then
         GUICtrlSetData($iScriptPath, StringReplace(@GUI_DragFile, @ScriptDir & "\", ""))
      EndIf
   Else
      Local $buttonDrag = -1
      Local $buttonDrop = -1
      Local $buttonID = 0
      For $y = 0 To GUICtrlRead($iRow) - 1 Step 1
         For $x = 0 To GUICtrlRead($iCol) - 1 Step 1
            $buttonID = $y * GUICtrlRead($iCol) + $x
            If @GUI_DragId = $aListButton[$y][$x] Then $buttonDrag = $buttonID
            If @GUI_DropId = $aListButton[$y][$x] Then $buttonDrop = $buttonID
            If $buttonDrag <> -1 And $buttonDrop <> -1 Then
               _ArraySwap($aDataButton, $buttonDrag, $buttonDrop, True)
               __RefreshButtons()
               ExitLoop
            EndIf
         Next
      Next
   EndIf
EndFunc   ;==>__onDrop
Func __RefreshButtons()
   __Resize()
   __RemoveAllButtons()
   Local $buttonID = 0
   For $y = 0 To GUICtrlRead($iRow) - 1 Step 1
      For $x = 0 To GUICtrlRead($iCol) - 1 Step 1
         $buttonID = $y * GUICtrlRead($iCol) + $x
         $aListButton[$y][$x] = GUICtrlCreateButton("", 8 + (48 + 4) * $x, 8 + (48 + 4) * $y, 48, 48, $BS_ICON)
         GUICtrlSetOnEvent(-1, "bClick")
         If $buttonID < UBound($aDataButton) And $CST_MODE < UBound($aDataButton, 2) And $aDataButton[$buttonID][$CST_MODE] <> "" Then
            GUICtrlSetState(-1, $GUI_DROPACCEPTED)
            GUICtrlSetTip(-1, $aDataButton[$buttonID][$CST_HINT])
            GUICtrlSetImage(-1, $aDataButton[$buttonID][$CST_ICON])
         Else
            GUICtrlSetTip(-1, "Right click to edit button")
         EndIf
      Next
   Next
EndFunc   ;==>__RefreshButtons
Func __RemoveAllButtons()
   For $y = 0 To UBound($aListButton, 1) - 1 Step 1
      For $x = 0 To UBound($aListButton, 2) - 1 Step 1
         GUICtrlDelete($aListButton[$y][$x])
      Next
   Next
EndFunc   ;==>__RemoveAllButtons
Func __Resize()
   Local $width = 16 + (48 + 4) * GUICtrlRead($iCol)
   Local $x = (@DesktopWidth / 2) - ($width / 2)
   Local $height = 25 + 16 + (48 + 4) * GUICtrlRead($iRow)
   Local $y = (@DesktopHeight / 2) - ($height / 2)
   Return WinMove($fAutoItLauncher, "AutoIt Launcher", $x, $y, $width, $height)
EndFunc   ;==>__Resize
Func __ResizeArray()
   ReDim $aListButton[GUICtrlRead($iRow) + 1][GUICtrlRead($iCol) + 1]
   Local $maxButtonID = GUICtrlRead($iRow) * GUICtrlRead($iCol)
   If $maxButtonID > UBound($aDataButton) Then
      ReDim $aDataButton[$maxButtonID][$CST_SCRIPT_PATH + 1]
   EndIf
EndFunc   ;==>__ResizeArray
;~ https://www.autoitscript.com/forum/topic/135203-call-another-script/?do=findComment&comment=943199
Func __RunAU3($sFilePath, $sWorkingDir = "", $iShowFlag = @SW_SHOW, $iOptFlag = 0)
   Return Run('"' & @AutoItExe & '" /AutoIt3ExecuteScript "' & $sFilePath & '"', $sWorkingDir, $iShowFlag, $iOptFlag)
EndFunc   ;==>__RunAU3
Func __SaveButtons()
   _FileWriteFromArray($sPathButtons, $aDataButton)
   __RefreshButtons()
EndFunc   ;==>__SaveButtons
Func __SaveIni()
   __Log("SaveIni")
   IniWrite($sPathIni, "AutoIt_Launcher_Global_Settings", "iCol", GUICtrlRead($iCol))
   IniWrite($sPathIni, "AutoIt_Launcher_Global_Settings", "iRow", GUICtrlRead($iRow))
   IniWrite($sPathIni, "AutoIt_Launcher_Global_Settings", "cbLog", GUICtrlRead($cbLog))
EndFunc   ;==>__SaveIni
Func __SetEnableButtonSettings($lbRun = $GUI_DISABLE, $lbShell = $GUI_DISABLE, $lbScript = $GUI_DISABLE)
;~    Run
   GUICtrlSetState($iRunProgram, $lbRun)
   GUICtrlSetState($iRunWorkingdir, $lbRun)
;~    ShellExecute
   GUICtrlSetState($iShellFilename, $lbShell)
   GUICtrlSetState($iShellParameters, $lbShell)
   GUICtrlSetState($iShellWorkingdir, $lbShell)
;~    Script
   GUICtrlSetState($iScriptPath, $lbScript)
   GUICtrlSetState($bScriptPath, $lbScript)
EndFunc   ;==>__SetEnableButtonSettings
Func __Show()
   If Not __GUIVisible() Then GUISetState(@SW_SHOW, $fAutoItLauncher)
EndFunc   ;==>__Show
Func __ShowGlobalSettings()
   If Not __GUIVisible() Then GUISetState(@SW_SHOW, $fGlobalSettings)
EndFunc   ;==>__ShowGlobalSettings

Func bClick()
   __BtnClick(@GUI_CtrlId)
EndFunc   ;==>bClick
Func bIconClick()
   Local $sFileOpenDialog = FileOpenDialog("Open File", @ScriptDir & "\icons\", "Images (*.png;*.jpg;*.ico;*.bmp)", $FD_FILEMUSTEXIST)
   If @error Then
      FileChangeDir(@ScriptDir)
   Else
      FileChangeDir(@ScriptDir)
      GUICtrlSetData($iButtonIcon, StringReplace($sFileOpenDialog, @ScriptDir & "\", ""))
   EndIf
EndFunc   ;==>bIconClick
Func bSaveButtonClick()
   $bEdit = False
   $aDataButton[$iButtonIDEdit][$CST_HINT] = GUICtrlRead($iButtonHint)
   $aDataButton[$iButtonIDEdit][$CST_ICON] = GUICtrlRead($iButtonIcon)
   If GUICtrlRead($rRun) = $GUI_CHECKED Then
      $aDataButton[$iButtonIDEdit][$CST_MODE] = $CST_RUN
   ElseIf GUICtrlRead($rShellExecute) = $GUI_CHECKED Then
      $aDataButton[$iButtonIDEdit][$CST_MODE] = $CST_SHELLEXECUTE
   ElseIf GUICtrlRead($rCustomScript) = $GUI_CHECKED Then
      $aDataButton[$iButtonIDEdit][$CST_MODE] = $CST_SCRIPT
   EndIf
   $aDataButton[$iButtonIDEdit][$CST_RUN_PROGRAM] = GUICtrlRead($iRunProgram)
   $aDataButton[$iButtonIDEdit][$CST_RUN_WORKINGDIR] = GUICtrlRead($iRunWorkingdir)
   $aDataButton[$iButtonIDEdit][$CST_SHELL_FILENAME] = GUICtrlRead($iShellFilename)
   $aDataButton[$iButtonIDEdit][$CST_SHELL_PARAMETERS] = GUICtrlRead($iShellParameters)
   $aDataButton[$iButtonIDEdit][$CST_SHELL_WORKINGDIR] = GUICtrlRead($iShellWorkingdir)
   $aDataButton[$iButtonIDEdit][$CST_SCRIPT_PATH] = GUICtrlRead($iScriptPath)
   __SaveButtons()
   $iButtonIDEdit = -1
   GUISetState(@SW_HIDE, $fButtonSettings)
   __Show()
   __RefreshButtons()
EndFunc   ;==>bSaveButtonClick
Func bSaveSettingsClick()
   $bEdit = False
   __SaveIni()
   GUISetState(@SW_HIDE, $fButtonSettings)
   __Show()
   __LoadButtons()
EndFunc   ;==>bSaveSettingsClick
Func bScriptPathClick()
   Local $sFileOpenDialog = FileOpenDialog("Open File", @ScriptDir & "\scripts\", "AutoIt (*.au3)", $FD_FILEMUSTEXIST)
   If @error Then
      FileChangeDir(@ScriptDir)
   Else
      FileChangeDir(@ScriptDir)
      GUICtrlSetData($iScriptPath, StringReplace($sFileOpenDialog, @ScriptDir & "\", ""))
   EndIf
EndFunc   ;==>bScriptPathClick
Func fAutoItLauncherClose()
   GUISetState(@SW_HIDE, $fAutoItLauncher)
EndFunc   ;==>fAutoItLauncherClose
;~ https://www.autoitscript.com/forum/topic/74079-check-for-right-click/?do=findComment&comment=1277537
Func fAutoItLauncherSecondaryUp()
   Local $cInfo = GUIGetCursorInfo($fAutoItLauncher)
   __BtnClick($cInfo[4], False)
EndFunc   ;==>fAutoItLauncherSecondaryUp
Func fGlobalSettingsClose()
   If $bEdit Then
      If MsgBox($MB_YESNO, "Save", "Save changes?") = $IDYES Then
         bSaveSettingsClick()
      Else
         __LoadIni()
      EndIf
   EndIf
   GUISetState(@SW_HIDE, $fGlobalSettings)
   __Show()
EndFunc   ;==>fGlobalSettingsClose
Func fButtonSettingsClose()
   If $bEdit Then
      If MsgBox($MB_YESNO, "Save", "Save changes?") = $IDYES Then
         bSaveButtonClick()
      EndIf
   EndIf
   GUISetState(@SW_HIDE, $fButtonSettings)
   __Show()
EndFunc   ;==>fButtonSettingsClose
Func rClick()
   If GUICtrlRead($rRun) = $GUI_CHECKED Then
      __SetEnableButtonSettings($GUI_ENABLE, $GUI_DISABLE, $GUI_DISABLE)
   ElseIf GUICtrlRead($rShellExecute) = $GUI_CHECKED Then
      __SetEnableButtonSettings($GUI_DISABLE, $GUI_ENABLE, $GUI_DISABLE)
   Else
      __SetEnableButtonSettings($GUI_DISABLE, $GUI_DISABLE, $GUI_ENABLE)
   EndIf
EndFunc   ;==>rClick
PS: Si vous avez des conseils pour rendre mon code plus robuste je suis preneur aussi :D
Modifié en dernier par keving le mer. 02 juin 2021 20:00, modifié 3 fois.
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2086
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [..] Aide concernant drag & drop

#2

Message par TommyDDR »

Tout d'abord, merci !
Vous expliquez bien votre problème, vous fournissez un code testable, c'est agréable :)

Le problème vient des styles que vous avez appliqué à votre fenêtre

GUICreate ( "title" [, width [, height [, left = -1 [, top = -1 [, style = -1 [, exStyle = -1 [, parent = 0]]]]]]] )

style et exStyle sont bien différenciés
style = $WS_xxxxx
exStyle = $WS_EX_xxxxx

donc :
$WS_SYSMENU = style
$WS_EX_ACCEPTFILES = exStyle

Votre ligne devient donc :
$fButtonSettings = GUICreate("Button Settings", 498, 431, -1, -1, $WS_SYSMENU, $WS_EX_ACCEPTFILES)
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Avatar du membre
keving
Niveau 1
Niveau 1
Messages : 11
Enregistré le : mar. 01 juin 2021 16:00
Status : Hors ligne

Re: [..] Aide concernant drag & drop

#3

Message par keving »

Oh, c'est pas faux, j'ai mal lu la doc :roll:

Code : Tout sélectionner

    ; Crée une GUI avec différents contrôles.
    Local $hGUI = GUICreate("Example", 420, 200, -1, -1, -1, $WS_EX_ACCEPTFILES)
Donc maintenant j'ai bien récupéré la bonne icone qui accepte le drop, mais je n'ai pas ma MsgBox qui apparait, donc il semblerait que cela ne suffise pas :(
Image
; ...
$fButtonSettings = GUICreate("Button Settings", 498, 431, -1, -1, $WS_SYSMENU, $WS_EX_ACCEPTFILES)
; ...
GUISetOnEvent($GUI_EVENT_DROPPED, "__onDrop")
; ...
Func __onDrop()
   MsgBox($MB_SYSTEMMODAL, "Debug", "DragId: " & @GUI_DragId & @CRLF & "DropId: " & @GUI_DropId & @CRLF & "DragFile: " & @GUI_DragFile)
   ; ...
EndFunc   ;==>__onDrop
; ...
Modifié en dernier par keving le mer. 02 juin 2021 09:39, modifié 1 fois.
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2086
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [..] Aide concernant drag & drop  

#4

Message par TommyDDR »

à savoir : on programme avec #RequiereAdmin ne pourra pas recevoir de drag&drop d'un programme n'ayant pas ces droits
si #RequiereAdmin n'est pas obligatoire, je vous suggère de le retirer.

Ce code fonctionne parfaitement chez moi :
(Faites un nouveau fichier .au3, collez ça dedans et dites moi votre résultat)
#cs ----------------------------------------------------------------------------

   AutoIt Version: 3.3.14.5
   Author:         kevingrillet

   Script Function:
   Small launcher.

#ce ----------------------------------------------------------------------------

;~ #RequireAdmin

#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=icons\launcher.ico
#AutoIt3Wrapper_Outfile=AutoIt_Launcher.exe
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_UseUpx=y
#AutoIt3Wrapper_Res_Description=Small launcher
#AutoIt3Wrapper_Res_Fileversion=0.0.0.1
#AutoIt3Wrapper_Res_LegalCopyright=Copyright (C) 2021
#AutoIt3Wrapper_Res_Language=1033
#AutoIt3Wrapper_Res_Field=Compiler Date|%date%
#AutoIt3Wrapper_Res_Field=Compiler Heure|%time%
#AutoIt3Wrapper_Res_Field=Compiler Version|AutoIt v%AutoItVer%
#AutoIt3Wrapper_Res_Field=Author|kevingrillet
#AutoIt3Wrapper_Res_Field=Github|https://github.com/kevingrillet/AutoIt-Launcher
#AutoIt3Wrapper_Add_Constants=n
#AutoIt3Wrapper_Run_Tidy=y
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

#Region ### INCLUDES ###
#include <Array.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <File.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <TrayConstants.au3>
#include <WindowsConstants.au3>
#EndRegion ### INCLUDES ###

#Region ### CONSTANTS ###
;~ Button struct
Const $CST_HINT = 0
Const $CST_ICON = $CST_HINT + 1
Const $CST_MODE = $CST_ICON + 1
Const $CST_RUN_PROGRAM = $CST_MODE + 1
Const $CST_RUN_WORKINGDIR = $CST_RUN_PROGRAM + 1
Const $CST_SHELL_FILENAME = $CST_RUN_WORKINGDIR + 1
Const $CST_SHELL_PARAMETERS = $CST_SHELL_FILENAME + 1
Const $CST_SHELL_WORKINGDIR = $CST_SHELL_PARAMETERS + 1
Const $CST_SCRIPT_PATH = $CST_SHELL_WORKINGDIR + 1
;~ Button mode
Const $CST_RUN = 0
Const $CST_SHELLEXECUTE = 1
Const $CST_SCRIPT = 2
#EndRegion ### CONSTANTS ###

#Region ### VARIABLES ###
Dim $aListButton[1][1]
Dim $aDataButton[1][$CST_SCRIPT_PATH + 1]
Local $bEdit = False
Local $iButtonIDEdit = -1
Local $sPathButtons = @ScriptDir & "\AutoIt_Launcher_buttons.data"
Local $sPathIni = @ScriptDir & "\AutoIt_Launcher.ini"
Local $sPathLog = @ScriptDir & "\AutoIt_Launcher.log"
#EndRegion ### VARIABLES ###

#Region ### OPT ###
Opt("GUIOnEventMode", 1) ;0=disabled, 1=OnEvent mode enabled
Opt("TrayAutoPause", 0) ;0=no pause, 1=Pause
Opt("TrayMenuMode", 3) ;0=append, 1=no default menu, 2=no automatic check, 4=menuitemID  not return
Opt("TrayOnEventMode", 1) ;0=disable, 1=enable
#EndRegion ### OPT ###

#Region ### START Koda GUI section ### Form=d:\users\kevin\documents\github\autoit-launcher\forms\fglobalsettings.kxf
$fGlobalSettings = GUICreate("Global Settings", 158, 157, -1, -1, $WS_SYSMENU)
GUISetOnEvent($GUI_EVENT_CLOSE, "fGlobalSettingsClose")
$lCols = GUICtrlCreateLabel("Columns", 8, 43, 44, 17)
$lRow = GUICtrlCreateLabel("Row", 8, 11, 26, 17)
$iRow = GUICtrlCreateInput("1", 56, 8, 89, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_RIGHT, $ES_NUMBER))
GUICtrlSetOnEvent(-1, "__onChange")
$iCol = GUICtrlCreateInput("1", 56, 40, 89, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_RIGHT, $ES_NUMBER))
GUICtrlSetOnEvent(-1, "__onChange")
$cbLog = GUICtrlCreateCheckbox("Save log", 8, 72, 97, 17)
GUICtrlSetOnEvent(-1, "__onChange")
$bSaveSettings = GUICtrlCreateButton("Save Global Settings", 8, 96, 139, 25)
GUICtrlSetOnEvent(-1, "bSaveSettingsClick")
;~ GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

#Region ### START Koda GUI section ### Form=d:\users\kevin\documents\github\autoit-launcher\forms\fbuttonsettings.kxf
$fButtonSettings = GUICreate("Button Settings", 498, 431, -1, -1, $WS_SYSMENU, $WS_EX_ACCEPTFILES)
GUISetOnEvent($GUI_EVENT_CLOSE, "fButtonSettingsClose")
$lButtonHint = GUICtrlCreateLabel("Button Hint", 16, 19, 57, 17)
$iButtonHint = GUICtrlCreateInput("", 104, 16, 369, 21)
GUICtrlSetOnEvent(-1, "__onChange")
$lButtonIcon = GUICtrlCreateLabel("Icon", 16, 51, 25, 17)
$iButtonIcon = GUICtrlCreateInput("", 104, 48, 289, 21)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
GUICtrlSetOnEvent(-1, "__onChange")
$bIcon = GUICtrlCreateButton("Open", 400, 47, 74, 23)
GUICtrlSetOnEvent(-1, "bIconClick")
$gGroupSettings = GUICtrlCreateGroup("", 8, 80, 473, 281)
$rRun = GUICtrlCreateRadio("Run", 16, 96, 113, 17)
GUICtrlSetState(-1, $GUI_CHECKED)
GUICtrlSetOnEvent(-1, "rClick")
$rCustomScript = GUICtrlCreateRadio("Custom Script", 16, 304, 113, 17)
GUICtrlSetOnEvent(-1, "rClick")
$lRunProgram = GUICtrlCreateLabel("Program", 32, 123, 43, 17)
$iRunProgram = GUICtrlCreateInput("", 104, 120, 369, 21)
GUICtrlSetOnEvent(-1, "__onChange")
$lRunWorkingdir = GUICtrlCreateLabel("Working Dir.", 32, 155, 63, 17)
$iRunWorkingdir = GUICtrlCreateInput("", 104, 152, 369, 21)
GUICtrlSetOnEvent(-1, "__onChange")
$rShellExecute = GUICtrlCreateRadio("ShellExecute", 16, 184, 113, 17)
GUICtrlSetOnEvent(-1, "rClick")
$lShellFilename = GUICtrlCreateLabel("Filename", 32, 211, 46, 17)
$iShellFilename = GUICtrlCreateInput("", 104, 208, 369, 21)
GUICtrlSetOnEvent(-1, "__onChange")
$lShellParameters = GUICtrlCreateLabel("Parameters", 32, 243, 57, 17)
$iShellWorkingdir = GUICtrlCreateInput("", 104, 272, 369, 21)
GUICtrlSetOnEvent(-1, "__onChange")
$lShellWorkingdir = GUICtrlCreateLabel("Working Dir.", 32, 275, 63, 17)
$iShellParameters = GUICtrlCreateInput("", 104, 240, 369, 21)
GUICtrlSetOnEvent(-1, "__onChange")
$lScriptPath = GUICtrlCreateLabel("Path", 32, 331, 26, 17)
$iScriptPath = GUICtrlCreateInput("", 104, 328, 289, 21)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
GUICtrlSetOnEvent(-1, "__onChange")
$bScriptPath = GUICtrlCreateButton("Open", 400, 327, 74, 23)
GUICtrlSetOnEvent(-1, "bScriptPathClick")
GUICtrlCreateGroup("", -99, -99, 1, 1)
$bSaveButton = GUICtrlCreateButton("Save", 7, 368, 475, 25)
GUICtrlSetOnEvent(-1, "bSaveButtonClick")
GUISetOnEvent($GUI_EVENT_DROPPED, "__onDrop")
;~ GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

#Region ### START Koda GUI section ### Form=d:\users\kevin\documents\github\autoit-launcher\forms\fautoitlauncher.kxf
$fAutoItLauncher = GUICreate("AutoIt Launcher", 615, 437, -1, -1, $WS_SYSMENU)
GUISetOnEvent($GUI_EVENT_CLOSE, "fAutoItLauncherClose")
GUISetOnEvent($GUI_EVENT_SECONDARYUP, "fAutoItLauncherSecondaryUp")
GUISetOnEvent($GUI_EVENT_DROPPED, "__onDrop")
;~ GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###


#Region ### TrayIcon ###
$miShow = TrayCreateItem("Show AutoIt Launcher")
TrayItemSetOnEvent(-1, "__Show")
$miShowSettings = TrayCreateItem("Show Global Settings")
TrayItemSetOnEvent(-1, "__ShowGlobalSettings")
$miShutDown = TrayCreateItem("Shut Down AutoIt Launcher")
TrayItemSetOnEvent(-1, "__Exit")
TraySetOnEvent($TRAY_EVENT_PRIMARYDOUBLE, "__Show")
TraySetToolTip("AutoIt Launcher")
#EndRegion ### TrayIcon ###

__Log("Starting")
__LoadIni()
If Not FileExists($sPathIni) Then
   __ShowGlobalSettings()
Else
   __LoadButtons()
   __Show()
EndIf

While 1
   Sleep(100)
WEnd

Func __BtnClick($CtrlId, $bPrimary = True)
   Local $buttonID = 0
   For $y = 0 To GUICtrlRead($iRow) - 1 Step 1
      For $x = 0 To GUICtrlRead($iCol) - 1 Step 1
         If $aListButton[$y][$x] = $CtrlId Then
            $buttonID = $y * GUICtrlRead($iCol) + $x
            If $bPrimary And $buttonID <= UBound($aDataButton) And $CST_MODE < UBound($aDataButton, 2) And $aDataButton[$buttonID][$CST_MODE] <> "" Then
               Switch $aDataButton[$buttonID][$CST_MODE]
                  Case $CST_RUN
                     Run($aDataButton[$buttonID][$CST_RUN_PROGRAM], $aDataButton[$buttonID][$CST_RUN_WORKINGDIR])
                  Case $CST_SHELLEXECUTE
                     ShellExecute($aDataButton[$buttonID][$CST_SHELL_FILENAME], $aDataButton[$buttonID][$CST_SHELL_PARAMETERS], $aDataButton[$buttonID][$CST_SHELL_WORKINGDIR])
                  Case $CST_SCRIPT
                     __RunAU3($aDataButton[$buttonID][$CST_SCRIPT_PATH])
               EndSwitch
            Else
               __LoadButtonSettings($buttonID)
            EndIf
            ExitLoop
         EndIf
      Next
   Next
EndFunc   ;==>__BtnClick
Func __Exit()
   __SaveIni()
   __Log("Exiting")
   Exit
EndFunc   ;==>__Exit
Func __GUIVisible()
   Local $res = False
   If WinGetState($fAutoItLauncher) = $WIN_STATE_VISIBLE Then $res = True
   If WinGetState($fGlobalSettings) = $WIN_STATE_VISIBLE Then $res = True
   If WinGetState($fButtonSettings) = $WIN_STATE_VISIBLE Then $res = True
   Return $res
EndFunc   ;==>__GUIVisible
Func __LoadButtonSettings($buttonID)
   $iButtonIDEdit = $buttonID
   GUISetState(@SW_HIDE, $fAutoItLauncher)
   If $iButtonIDEdit <= UBound($aDataButton, 1) And $CST_SCRIPT_PATH + 1 = UBound($aDataButton, 2) Then
      GUICtrlSetData($iButtonHint, $aDataButton[$iButtonIDEdit][$CST_HINT])
      GUICtrlSetData($iButtonIcon, $aDataButton[$iButtonIDEdit][$CST_ICON])
      Switch $aDataButton[$iButtonIDEdit][$CST_MODE]
         Case $CST_RUN
            GUICtrlSetState($rRun, $GUI_CHECKED)
         Case $CST_SHELLEXECUTE
            GUICtrlSetState($rShellExecute, $GUI_CHECKED)
         Case $CST_SCRIPT
            GUICtrlSetState($rCustomScript, $GUI_CHECKED)
      EndSwitch
      GUICtrlSetData($iRunProgram, $aDataButton[$iButtonIDEdit][$CST_RUN_PROGRAM])
      GUICtrlSetData($iRunWorkingdir, $aDataButton[$iButtonIDEdit][$CST_RUN_WORKINGDIR])
      GUICtrlSetData($iShellFilename, $aDataButton[$iButtonIDEdit][$CST_SHELL_FILENAME])
      GUICtrlSetData($iShellParameters, $aDataButton[$iButtonIDEdit][$CST_SHELL_PARAMETERS])
      GUICtrlSetData($iShellWorkingdir, $aDataButton[$iButtonIDEdit][$CST_SHELL_WORKINGDIR])
      GUICtrlSetData($iScriptPath, $aDataButton[$iButtonIDEdit][$CST_SCRIPT_PATH])
   Else
      GUICtrlSetData($iButtonHint, "")
      GUICtrlSetData($iButtonIcon, "")
      GUICtrlSetState($rRun, $GUI_CHECKED)
      GUICtrlSetData($iRunProgram, "")
      GUICtrlSetData($iRunWorkingdir, "")
      GUICtrlSetData($iShellFilename, "")
      GUICtrlSetData($iShellParameters, "")
      GUICtrlSetData($iShellWorkingdir, "")
      GUICtrlSetData($iScriptPath, "")
   EndIf
   rClick()
   GUISetState(@SW_SHOW, $fButtonSettings)
EndFunc   ;==>__LoadButtonSettings
Func __LoadButtons()
   If FileExists($sPathButtons) Then
      _FileReadToArray($sPathButtons, $aDataButton, $FRTA_NOCOUNT, "|")
   EndIf
   __ResizeArray()
   __RefreshButtons()
EndFunc   ;==>__LoadButtons
Func __LoadIni()
   __Log("LoadIni")
   GUICtrlSetData($iCol, IniRead($sPathIni, "AutoIt_Launcher_Global_Settings", "iCol", 1))
   GUICtrlSetData($iRow, IniRead($sPathIni, "AutoIt_Launcher_Global_Settings", "iRow", 1))
   GUICtrlSetState($cbLog, IniRead($sPathIni, "AutoIt_Launcher_Global_Settings", "cbLog", $GUI_UNCHECKED))
EndFunc   ;==>__LoadIni
Func __Log($sToLog)
   If GUICtrlRead($cbLog) = $GUI_CHECKED Then
      _FileWriteLog($sPathLog, $sToLog & @CRLF)
   EndIf
EndFunc   ;==>__Log
Func __onChange()
   $bEdit = True
EndFunc   ;==>__onChange
Func __onDrop()
   MsgBox($MB_SYSTEMMODAL, "Debug", "DragId: " & @GUI_DragId & @CRLF & "DropId: " & @GUI_DropId & @CRLF & "DragFile: " & @GUI_DragFile) ; TODO: Not working
   If @GUI_DragId = -1 Then
      If @GUI_DropId = $iButtonIcon Then
         GUICtrlSetData($iButtonIcon, StringReplace(@GUI_DragFile, @ScriptDir & "\", ""))
      ElseIf @GUI_DropId = $iScriptPath Then
         GUICtrlSetData($iScriptPath, StringReplace(@GUI_DragFile, @ScriptDir & "\", ""))
      EndIf
   Else
      Local $buttonDrag = -1
      Local $buttonDrop = -1
      Local $buttonID = 0
      For $y = 0 To GUICtrlRead($iRow) - 1 Step 1
         For $x = 0 To GUICtrlRead($iCol) - 1 Step 1
            $buttonID = $y * GUICtrlRead($iCol) + $x
            If @GUI_DragId = $aListButton[$y][$x] Then $buttonDrag = $buttonID
            If @GUI_DropId = $aListButton[$y][$x] Then $buttonDrop = $buttonID
            If $buttonDrag <> -1 And $buttonDrop <> -1 Then
               _ArraySwap($aDataButton, $buttonDrag, $buttonDrop, True)
               __RefreshButtons()
               ExitLoop
            EndIf
         Next
      Next
   EndIf
EndFunc   ;==>__onDrop
Func __RefreshButtons()
   __Resize()
   __RemoveAllButtons()
   Local $buttonID = 0
   For $y = 0 To GUICtrlRead($iRow) - 1 Step 1
      For $x = 0 To GUICtrlRead($iCol) - 1 Step 1
         $buttonID = $y * GUICtrlRead($iCol) + $x
         $aListButton[$y][$x] = GUICtrlCreateButton("", 8 + (48 + 4) * $x, 8 + (48 + 4) * $y, 48, 48, $BS_ICON)
         GUICtrlSetOnEvent(-1, "bClick")
         If $buttonID < UBound($aDataButton) And $CST_MODE < UBound($aDataButton, 2) And $aDataButton[$buttonID][$CST_MODE] <> "" Then
            GUICtrlSetState(-1, $GUI_DROPACCEPTED)
            GUICtrlSetTip(-1, $aDataButton[$buttonID][$CST_HINT])
            GUICtrlSetImage(-1, $aDataButton[$buttonID][$CST_ICON])
         Else
            GUICtrlSetTip(-1, "Right click to edit button")
         EndIf
      Next
   Next
EndFunc   ;==>__RefreshButtons
Func __RemoveAllButtons()
   For $y = 0 To UBound($aListButton, 1) - 1 Step 1
      For $x = 0 To UBound($aListButton, 2) - 1 Step 1
         GUICtrlDelete($aListButton[$y][$x])
      Next
   Next
EndFunc   ;==>__RemoveAllButtons
Func __Resize()
   Local $width = 16 + (48 + 4) * GUICtrlRead($iCol)
   Local $x = (@DesktopWidth / 2) - ($width / 2)
   Local $height = 25 + 16 + (48 + 4) * GUICtrlRead($iRow)
   Local $y = (@DesktopHeight / 2) - ($height / 2)
   Return WinMove($fAutoItLauncher, "AutoIt Launcher", $x, $y, $width, $height)
EndFunc   ;==>__Resize
Func __ResizeArray()
   ReDim $aListButton[GUICtrlRead($iRow) + 1][GUICtrlRead($iCol) + 1]
   Local $maxButtonID = GUICtrlRead($iRow) * GUICtrlRead($iCol)
   If $maxButtonID > UBound($aDataButton) Then
      ReDim $aDataButton[$maxButtonID][$CST_SCRIPT_PATH + 1]
   EndIf
EndFunc   ;==>__ResizeArray
;~ https://www.autoitscript.com/forum/topic/135203-call-another-script/?do=findComment&comment=943199
Func __RunAU3($sFilePath, $sWorkingDir = "", $iShowFlag = @SW_SHOW, $iOptFlag = 0)
   Return Run('"' & @AutoItExe & '" /AutoIt3ExecuteScript "' & $sFilePath & '"', $sWorkingDir, $iShowFlag, $iOptFlag)
EndFunc   ;==>__RunAU3
Func __SaveButtons()
   _FileWriteFromArray($sPathButtons, $aDataButton)
   __RefreshButtons()
EndFunc   ;==>__SaveButtons
Func __SaveIni()
   __Log("SaveIni")
   IniWrite($sPathIni, "AutoIt_Launcher_Global_Settings", "iCol", GUICtrlRead($iCol))
   IniWrite($sPathIni, "AutoIt_Launcher_Global_Settings", "iRow", GUICtrlRead($iRow))
   IniWrite($sPathIni, "AutoIt_Launcher_Global_Settings", "cbLog", GUICtrlRead($cbLog))
EndFunc   ;==>__SaveIni
Func __SetEnableButtonSettings($lbRun = $GUI_DISABLE, $lbShell = $GUI_DISABLE, $lbScript = $GUI_DISABLE)
;~    Run
   GUICtrlSetState($iRunProgram, $lbRun)
   GUICtrlSetState($iRunWorkingdir, $lbRun)
;~    ShellExecute
   GUICtrlSetState($iShellFilename, $lbShell)
   GUICtrlSetState($iShellParameters, $lbShell)
   GUICtrlSetState($iShellWorkingdir, $lbShell)
;~    Script
   GUICtrlSetState($iScriptPath, $lbScript)
   GUICtrlSetState($bScriptPath, $lbScript)
EndFunc   ;==>__SetEnableButtonSettings
Func __Show()
   If Not __GUIVisible() Then GUISetState(@SW_SHOW, $fAutoItLauncher)
EndFunc   ;==>__Show
Func __ShowGlobalSettings()
   If Not __GUIVisible() Then GUISetState(@SW_SHOW, $fGlobalSettings)
EndFunc   ;==>__ShowGlobalSettings

Func bClick()
   __BtnClick(@GUI_CtrlId)
EndFunc   ;==>bClick
Func bIconClick()
   Local $sFileOpenDialog = FileOpenDialog("Open File", @ScriptDir & "\icons\", "Images (*.png;*.jpg;*.ico;*.bmp)", $FD_FILEMUSTEXIST)
   If @error Then
      FileChangeDir(@ScriptDir)
   Else
      FileChangeDir(@ScriptDir)
      GUICtrlSetData($iButtonIcon, StringReplace($sFileOpenDialog, @ScriptDir & "\", ""))
   EndIf
EndFunc   ;==>bIconClick
Func bSaveButtonClick()
   $bEdit = False
   $aDataButton[$iButtonIDEdit][$CST_HINT] = GUICtrlRead($iButtonHint)
   $aDataButton[$iButtonIDEdit][$CST_ICON] = GUICtrlRead($iButtonIcon)
   If GUICtrlRead($rRun) = $GUI_CHECKED Then
      $aDataButton[$iButtonIDEdit][$CST_MODE] = $CST_RUN
   ElseIf GUICtrlRead($rShellExecute) = $GUI_CHECKED Then
      $aDataButton[$iButtonIDEdit][$CST_MODE] = $CST_SHELLEXECUTE
   ElseIf GUICtrlRead($rCustomScript) = $GUI_CHECKED Then
      $aDataButton[$iButtonIDEdit][$CST_MODE] = $CST_SCRIPT
   EndIf
   $aDataButton[$iButtonIDEdit][$CST_RUN_PROGRAM] = GUICtrlRead($iRunProgram)
   $aDataButton[$iButtonIDEdit][$CST_RUN_WORKINGDIR] = GUICtrlRead($iRunWorkingdir)
   $aDataButton[$iButtonIDEdit][$CST_SHELL_FILENAME] = GUICtrlRead($iShellFilename)
   $aDataButton[$iButtonIDEdit][$CST_SHELL_PARAMETERS] = GUICtrlRead($iShellParameters)
   $aDataButton[$iButtonIDEdit][$CST_SHELL_WORKINGDIR] = GUICtrlRead($iShellWorkingdir)
   $aDataButton[$iButtonIDEdit][$CST_SCRIPT_PATH] = GUICtrlRead($iScriptPath)
   __SaveButtons()
   $iButtonIDEdit = -1
   GUISetState(@SW_HIDE, $fButtonSettings)
   __Show()
   __RefreshButtons()
EndFunc   ;==>bSaveButtonClick
Func bSaveSettingsClick()
   $bEdit = False
   __SaveIni()
   GUISetState(@SW_HIDE, $fButtonSettings)
   __Show()
   __LoadButtons()
EndFunc   ;==>bSaveSettingsClick
Func bScriptPathClick()
   Local $sFileOpenDialog = FileOpenDialog("Open File", @ScriptDir & "\scripts\", "AutoIt (*.au3)", $FD_FILEMUSTEXIST)
   If @error Then
      FileChangeDir(@ScriptDir)
   Else
      FileChangeDir(@ScriptDir)
      GUICtrlSetData($iScriptPath, StringReplace($sFileOpenDialog, @ScriptDir & "\", ""))
   EndIf
EndFunc   ;==>bScriptPathClick
Func fAutoItLauncherClose()
   GUISetState(@SW_HIDE, $fAutoItLauncher)
EndFunc   ;==>fAutoItLauncherClose
;~ https://www.autoitscript.com/forum/topic/74079-check-for-right-click/?do=findComment&comment=1277537
Func fAutoItLauncherSecondaryUp()
   Local $cInfo = GUIGetCursorInfo($fAutoItLauncher)
   __BtnClick($cInfo[4], False)
EndFunc   ;==>fAutoItLauncherSecondaryUp
Func fGlobalSettingsClose()
   If $bEdit Then
      If MsgBox($MB_YESNO, "Save", "Save changes?") = $IDYES Then
         bSaveSettingsClick()
      Else
         __LoadIni()
      EndIf
   EndIf
   GUISetState(@SW_HIDE, $fGlobalSettings)
   __Show()
EndFunc   ;==>fGlobalSettingsClose
Func fButtonSettingsClose()
   If $bEdit Then
      If MsgBox($MB_YESNO, "Save", "Save changes?") = $IDYES Then
         bSaveButtonClick()
      EndIf
   EndIf
   GUISetState(@SW_HIDE, $fButtonSettings)
   __Show()
EndFunc   ;==>fButtonSettingsClose
Func rClick()
   If GUICtrlRead($rRun) = $GUI_CHECKED Then
      __SetEnableButtonSettings($GUI_ENABLE, $GUI_DISABLE, $GUI_DISABLE)
   ElseIf GUICtrlRead($rShellExecute) = $GUI_CHECKED Then
      __SetEnableButtonSettings($GUI_DISABLE, $GUI_ENABLE, $GUI_DISABLE)
   Else
      __SetEnableButtonSettings($GUI_DISABLE, $GUI_DISABLE, $GUI_ENABLE)
   EndIf
EndFunc   ;==>rClick
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Avatar du membre
keving
Niveau 1
Niveau 1
Messages : 11
Enregistré le : mar. 01 juin 2021 16:00
Status : Hors ligne

Re: [..] Aide concernant drag & drop

#5

Message par keving »

Oh, c'était juste ça le problème... En lisant votre réponse, je me suis souvenu que j'avais déjà croisé ce problème sur le forum anglais...
J'avais aussi Scite en admin vu que j'utilisais #RequiereAdmin, en retirant sur les deux ça fonctionne maintenant :)
Merci beaucoup, le point 1 fonctionne :)

Maintenant c'est la bataille du 2nd point...
Je veux pouvoir faire un drag & drop d'un bouton vers un autre bouton (pour les intervertir), normalement j'ai déjà ajouté tout le code, mais je n'ai pas ma MsgBox qui apparait...

Code : Tout sélectionner

Func __onDrop()
	MsgBox($MB_SYSTEMMODAL, "Debug", "DragId: " & @GUI_DragId & @CRLF & "DropId: " & @GUI_DropId & @CRLF & "DragFile: " & @GUI_DragFile)
	If @GUI_DragId = -1 Then
		If @GUI_DropId = $iButtonIcon Then
			GUICtrlSetData($iButtonIcon, StringReplace(@GUI_DragFile, @ScriptDir & "\", ""))
			__onChange()
		ElseIf @GUI_DropId = $iScriptPath Then
			GUICtrlSetData($iScriptPath, StringReplace(@GUI_DragFile, @ScriptDir & "\", ""))
			__onChange()
		EndIf
	Else
		Local $buttonDrag = -1
		Local $buttonDrop = -1
		Local $buttonID = 0
		For $y = 0 To GUICtrlRead($iRow) - 1 Step 1
			For $x = 0 To GUICtrlRead($iCol) - 1 Step 1
				$buttonID = $y * GUICtrlRead($iCol) + $x
				If @GUI_DragId = $aListButton[$y][$x] Then $buttonDrag = $buttonID
				If @GUI_DropId = $aListButton[$y][$x] Then $buttonDrop = $buttonID
				If $buttonDrag <> -1 And $buttonDrop <> -1 Then
					_ArraySwap($aDataButton, $buttonDrag, $buttonDrop, True)
					__RefreshButtons()
					ExitLoop
				EndIf
			Next
		Next
	EndIf
EndFunc   ;==>__onDrop
Par exemple ici j'ai drag & drop du bouton 1 (télécharger) vers le bouton 0 (jeux).
Image
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2086
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [..] Aide concernant drag & drop

#6

Message par TommyDDR »

Il me semble qu'il n'est pas possible de faire un drag&drop d'un bouton vers un bouton (pas de cette façon en tout cas).
En effet l'aide stipule bien :
Only dragging a ListviewItem will start the drag & drop process
Vous devez donc faire un drag&drop depuis une listview vers un autre control.

Il me semble déjà m'être penché sur le sujet, je regarderai ce qui est faisable quand j'aurais un peu plus de temps
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Avatar du membre
keving
Niveau 1
Niveau 1
Messages : 11
Enregistré le : mar. 01 juin 2021 16:00
Status : Hors ligne

Re: [..] Aide concernant drag & drop

#7

Message par keving »

Arf, c'est dommage quand même :(

Je suis tombé sur cette solution qu'il faudrait que je convertisse en mode Opt("GUIOnEventMode", 1) avec un petit GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "__onDrag").

#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>

; Mouse coords relative to GUI client area
Opt("MouseCoordMode", 2)

; Set target coords
Global $iTgt_Left = 10, $iTgt_Right = 210, $iTgt_Top = 10, $iTgt_Bot = 110

; Create GUI
$hGUI = GUICreate("Test", 300, 200)

$cTarget = GUICtrlCreateLabel("", $iTgt_Left, $iTgt_Top, $iTgt_Right - $iTgt_Left, $iTgt_Bot - $iTgt_Top, $SS_BLACKFRAME)
GUICtrlSetState(-1, $GUI_DISABLE)

$cLabel = GUICtrlCreateLabel("Move me", 10, 150, 60, 20)
GUICtrlSetBkColor(-1, 0x00FF00)

$cButton = GUICtrlCreateButton("Me too", 110, 150, 80, 23)

GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $GUI_EVENT_PRIMARYDOWN
            ; If the mouse button is pressed - get info about where
            $cInfo = GUIGetCursorInfo($hGUI)
            ; Is it over a control
            $iControl = $cInfo[4]
            Switch $iControl
                ; If it is a control we want to move
                Case $cLabel, $cButton
                    ; Work out offset of mouse on control
                    $aPos = ControlGetPos($hGUI, "", $iControl)
                    $iSubtractX = $cInfo[0] - $aPos[0]
                    $iSubtractY = $cInfo[1] - $aPos[1]
                    ; And then move the control until the mouse button is released
                    Do
                        $cInfo = GUIGetCursorInfo($hGUI)
                        ControlMove($hGUI, "", $iControl, $cInfo[0] - $iSubtractX, $cInfo[1] - $iSubtractY)
                    Until Not $cInfo[2]
                    ; See if the mouse was released over the target
                    $aMPos = MouseGetPos()
                    If $aMPos[0] > $iTgt_Left And $aMPos[0] < $iTgt_Right Then
                        If $aMPos[1] > $iTgt_Top And $aMPos[1] < $iTgt_Bot Then
                            Switch $iControl
                                Case $cLabel
                                    $sItem = "label"
                                Case $cButton
                                    $sItem = "button"
                            EndSwitch
                            MsgBox(0, "Info", "Over target with " & $sItem)
                        EndIf
                    EndIf

            EndSwitch
    EndSwitch
WEnd
Modifié en dernier par keving le mer. 02 juin 2021 20:06, modifié 1 fois.
Avatar du membre
keving
Niveau 1
Niveau 1
Messages : 11
Enregistré le : mar. 01 juin 2021 16:00
Status : Hors ligne

Re: [..] Aide concernant drag & drop

#8

Message par keving »

Je me réponds à moi-même, bah ça a fonctionné
; ...
GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "__onDrag")
; ...

Func __OnDrag()
   Local $buttonDrag = -1
   Local $buttonDrop = -1
   Local $buttonID = 0
   ; If the mouse button is pressed - get info about where
   Local $cInfo = GUIGetCursorInfo($fAutoItLauncher)
   ; Is it over a button
   For $y = 0 To GUICtrlRead($iRow) - 1 Step 1
      For $x = 0 To GUICtrlRead($iCol) - 1 Step 1
         $buttonID = $y * GUICtrlRead($iCol) + $x
         If $cInfo[4] = $aListButton[$y][$x] Then
            $buttonDrag = $buttonID
            ExitLoop
         EndIf
      Next
   Next
   If $buttonDrag <> -1 Then
      ; And then until the mouse button is released
      Do
         $cInfo = GUIGetCursorInfo($fAutoItLauncher)
      Until Not $cInfo[2]
      ; See if the mouse was released over another button
      For $y = 0 To GUICtrlRead($iRow) - 1 Step 1
         For $x = 0 To GUICtrlRead($iCol) - 1 Step 1
            $buttonID = $y * GUICtrlRead($iCol) + $x
            If $cInfo[4] = $aListButton[$y][$x] Then
               $buttonDrop = $buttonID
               ExitLoop
            EndIf
         Next
      Next
   EndIf
   If $buttonDrop <> -1 And $buttonDrag <> $buttonDrop Then
      _ArraySwap($aDataButton, $buttonDrag, $buttonDrop)
      __SaveButtons()
      __RefreshButtons()
   EndIf
EndFunc   ;==>__OnDrag
Tout semble fonctionner, et c'est à jour sur mon GitHub si jamais ça intéresse quelqu'un ;)
Répondre