[..] Drag and drop et détection objet source
Posté : lun. 29 janv. 2018 16:48
Bonjour à tous,
Je vous ai fait quelques infidélités en essayant de développer sous Delphi pour mon boulot mais il n'y a pas à dire, on revient toujours à ses premières amours
Voici mon problème : j'ai une GUI avec plusieurs composants pour lesquels j'autorise le drag and drop (ici 2 labels) :
J'aimerai arriver à détecter quel est l'objet sur lequel à été déposé le drag and drop (label 1 ou label 2).
Dans mon code, ce sont des listviews.
Merci d'avance pour votre aide.
Cordialement.
BM
Je vous ai fait quelques infidélités en essayant de développer sous Delphi pour mon boulot mais il n'y a pas à dire, on revient toujours à ses premières amours

Voici mon problème : j'ai une GUI avec plusieurs composants pour lesquels j'autorise le drag and drop (ici 2 labels) :
#include <Array.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
Global $Form1 = GUICreate("Form1", 255, 215, 192, 124, BitOR($GUI_SS_DEFAULT_GUI,$WS_SIZEBOX,$WS_THICKFRAME), BitOR($WS_EX_ACCEPTFILES,$WS_EX_WINDOWEDGE))
Global $Label1 = GUICtrlCreateLabel("Label1", 40, 16, 180, 73)
GUICtrlSetBkColor(-1, 0x99B4D1)
Global $Label2 = GUICtrlCreateLabel("Label2", 40, 96, 180, 89)
GUICtrlSetBkColor(-1, 0x00FFFF)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
Global $gaDropFiles[1]
GUICtrlSetState($Label1, $GUI_DROPACCEPTED)
GUICtrlSetState($Label2, $GUI_DROPACCEPTED)
; Détection drag and drop
GUIRegisterMsg($WM_DROPFILES, "WM_DROPFILES_FUNC")
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $GUI_EVENT_DROPPED
_ArrayDisplay($gaDropFiles)
EndSwitch
WEnd
Func WM_DROPFILES_FUNC($hwnd, $msgID, $wParam, $lParam)
Local $nSize, $pFileName
Local $nAmt = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", 0xFFFFFFFF, "ptr", 0, "int", 255)
For $i = 0 To $nAmt[0] - 1
$nSize = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", 0, "int", 0)
$nSize = $nSize[0] + 1
$pFileName = DllStructCreate("char[" & $nSize & "]")
DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", DllStructGetPtr($pFileName), "int", $nSize)
ReDim $gaDropFiles[$i + 1]
$gaDropFiles[$i] = DllStructGetData($pFileName, 1)
$pFileName = 0
Next
EndFunc ;==>WM_DROPFILES_FUNC
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
Global $Form1 = GUICreate("Form1", 255, 215, 192, 124, BitOR($GUI_SS_DEFAULT_GUI,$WS_SIZEBOX,$WS_THICKFRAME), BitOR($WS_EX_ACCEPTFILES,$WS_EX_WINDOWEDGE))
Global $Label1 = GUICtrlCreateLabel("Label1", 40, 16, 180, 73)
GUICtrlSetBkColor(-1, 0x99B4D1)
Global $Label2 = GUICtrlCreateLabel("Label2", 40, 96, 180, 89)
GUICtrlSetBkColor(-1, 0x00FFFF)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
Global $gaDropFiles[1]
GUICtrlSetState($Label1, $GUI_DROPACCEPTED)
GUICtrlSetState($Label2, $GUI_DROPACCEPTED)
; Détection drag and drop
GUIRegisterMsg($WM_DROPFILES, "WM_DROPFILES_FUNC")
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $GUI_EVENT_DROPPED
_ArrayDisplay($gaDropFiles)
EndSwitch
WEnd
Func WM_DROPFILES_FUNC($hwnd, $msgID, $wParam, $lParam)
Local $nSize, $pFileName
Local $nAmt = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", 0xFFFFFFFF, "ptr", 0, "int", 255)
For $i = 0 To $nAmt[0] - 1
$nSize = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", 0, "int", 0)
$nSize = $nSize[0] + 1
$pFileName = DllStructCreate("char[" & $nSize & "]")
DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", DllStructGetPtr($pFileName), "int", $nSize)
ReDim $gaDropFiles[$i + 1]
$gaDropFiles[$i] = DllStructGetData($pFileName, 1)
$pFileName = 0
Next
EndFunc ;==>WM_DROPFILES_FUNC
J'aimerai arriver à détecter quel est l'objet sur lequel à été déposé le drag and drop (label 1 ou label 2).
Dans mon code, ce sont des listviews.
Merci d'avance pour votre aide.
Cordialement.
BM