perlabsrat

Need help with drag and drop onto mutiple form targets

1 post in this topic

#1 ·  Posted

 

Hello,

I found a good drag and drop example here: https://www.autoitscript.com/forum/topic/28062-drop-multiple-files-on-any-control/
I have been searching but not finding a way to do a variant of this example.

I want to have a form with 2 or more list box controls on the form that have $GUI_DROPACCEPTED enabled. I then want to be able to drop separate groups of files on each list box  so that I have 2 separate list of dropped items that I can act upon independently rather than this example which only has one target.

I have modified the example to add the 2nd list box but I am not sure how to determine which control hwnd got the drop event and then only add the files to that list box. In the current example both controls add the files to $hList1

 

Apparently $hWnd  in WM_DROPFILES_FUNC() is not the control that triggers the event as I compared its value to the hwnd of each control.

hwnd from $hList1 = 0x002F0BB8
hwnd from $hList2 = 0x003C06E0
hwnd from WM_DROPFILES_FUNC = 0x002F1180
hwnd from WM_DROPFILES_FUNC = 0x002F1180

 

Any ideas?


 

;Example from https://www.autoitscript.com/forum/topic/28062-drop-multiple-files-on-any-control/

#include <GUIConstants.au3>

;~ Global $WM_DROPFILES = 0x233
Global $gaDropFiles[1], $str = ""

### Koda GUI section start ###
;~ $hGUI = GUICreate("Test", 400, 200, 219, 178, -1, BitOR($WS_EX_ACCEPTFILES, $WS_EX_TOPMOST))
;~ $hList = GUICtrlCreateList("", 5, 5, 390, 190)
;~ GUICtrlSetState (-1, $GUI_DROPACCEPTED)


Global $hGUI = GUICreate("Test", 573, 419, 219, 178, -1, BitOR($WS_EX_ACCEPTFILES, $WS_EX_TOPMOST, $WS_EX_WINDOWEDGE))
Global $hList1 = GUICtrlCreateList("", 5, 5, 390, 188)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
GUICtrlSetData(-1, "List1")

Global $hList2 = GUICtrlCreateList("", 42, 205, 390, 188)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
GUICtrlSetData(-1, "List2")


ConsoleWrite("hwnd from $hList1 = " & GUICtrlGetHandle($hList1) & @CRLF)
ConsoleWrite("hwnd from $hList2 = " & GUICtrlGetHandle($hList2) & @CRLF)

GUISetState(@SW_SHOW)
### Koda GUI section end   ###

GUIRegisterMsg($WM_DROPFILES, "WM_DROPFILES_FUNC")

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $GUI_EVENT_DROPPED
            $str = ""
            For $i = 0 To UBound($gaDropFiles) - 1
                $str &= "|" & $gaDropFiles[$i]
            Next
            GUICtrlSetData($hList1, $str)
    EndSwitch
WEnd

Func WM_DROPFILES_FUNC($hWnd, $msgID, $wParam, $lParam)

    ConsoleWrite("hwnd from WM_DROPFILES_FUNC = " & $hGUI & @CRLF)

    Local $nSize, $pFileName
    Local $nAmt = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", 0xFFFFFFFF, "ptr", 0, "int", 255)
    For $i = 0 To $nAmt[0] - 1
        $nSize = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", 0, "int", 0)
        $nSize = $nSize[0] + 1
        $pFileName = DllStructCreate("char[" & $nSize & "]")
        DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", DllStructGetPtr($pFileName), "int", $nSize)
        ReDim $gaDropFiles[$i + 1]
        $gaDropFiles[$i] = DllStructGetData($pFileName, 1)
        $pFileName = 0
    Next
EndFunc   ;==>WM_DROPFILES_FUNC

 

 

Share this post


Link to post
Share on other sites



Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now

  • Similar Content

    • Mbee
      By Mbee
      (Nevermind, I solved it)
       
    • VIP
      By VIP
      #RequireAdmin #include <WinAPISys.au3> #include <WindowsConstants.au3> _WinAPI_ChangeWindowMessageFilterEx ( $hWnd, $iMsg, $iAction ) ;_WinAPI_ChangeWindowMessageFilterEx( $hWnd, $WM_DROPFILES, $MSGFLT_ALLOW) ;_WinAPI_ChangeWindowMessageFilterEx( $hWnd, $WM_COPYDATA, $MSGFLT_ALLOW) ;_WinAPI_ChangeWindowMessageFilterEx( $hWnd, $WM_COPYGLOBALDATA, $MSGFLT_ALLOW) ; $WM_COPYDATA = 0x004A - $WM_DROPFILES = 0x0233 - $WM_COPYGLOBALDATA = 0x0049 - $MSGFLT_ALLOW = 1 - $MSGFLT_DISALLOW = 2 Example:
      #RequireAdmin Opt("TrayAutoPause", 0) #include <WinAPISys.au3> #include <WindowsConstants.au3> #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <ButtonConstants.au3> Global $AppWindows = GUICreate("Dao Van Trong - Trong.CF", 320, 50, -1, -1, BitOR($WS_BORDER, $WS_POPUP), BitOR($WS_EX_ACCEPTFILES, $WS_EX_TOPMOST, $WS_EX_WINDOWEDGE)) Global $AppTitle = GUICtrlCreateLabel("=== Drag and drop UAC ===", 56, 0, 210, 25, $SS_CENTERIMAGE, $GUI_WS_EX_PARENTDRAG) GUICtrlSetState(-1, $GUI_DROPACCEPTED) GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT) GUICtrlSetFont(-1, 9, 800) Global $AppTask = GUICtrlCreateLabel("Drag and drop files here ", 56, 24, 220, 17, $SS_CENTERIMAGE, $GUI_WS_EX_PARENTDRAG) GUICtrlSetState(-1, $GUI_DROPACCEPTED) GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT) GUICtrlSetFont(-1, 9, 500) Global $xCLOSE = GUICtrlCreateButton("X", 308, 0, 12, 12, BitAND($BS_MULTILINE, $BS_VCENTER, $BS_FLAT)) GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT) GUICtrlSetState(-1, $GUI_DROPACCEPTED) GUISetState(@SW_SHOW) _WinAPI_ChangeWindowMessageFilterEx($AppWindows, $WM_DROPFILES, $MSGFLT_ALLOW) _WinAPI_ChangeWindowMessageFilterEx($AppWindows, $WM_COPYDATA, $MSGFLT_ALLOW) _WinAPI_ChangeWindowMessageFilterEx($AppWindows, $WM_COPYGLOBALDATA, $MSGFLT_ALLOW) Global $__aDropFiles GUIRegisterMsg($WM_DROPFILES, "WM_DROPFILES") Local $nMsg While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_DROPPED If $__aDropFiles[0] > 0 Then For $i = 1 To $__aDropFiles[0] ConsoleWrite($__aDropFiles[$i] & @CRLF) GUICtrlSetData($AppTask, $__aDropFiles[$i]) Next EndIf Case $GUI_EVENT_CLOSE, $xCLOSE Exit EndSwitch WEnd Func WM_DROPFILES($hWnd, $iMsg, $iwParam, $ilParam) #forceref $hWnd, $ilParam Switch $iMsg Case $WM_DROPFILES Local $aReturn = _WinAPI_DragQueryFileEx($iwParam) If IsArray($aReturn) Then $__aDropFiles = $aReturn Else Local $aError[1] = [0] $__aDropFiles = $aError EndIf EndSwitch Return $GUI_RUNDEFMSG EndFunc ;==>WM_DROPFILES  
    • JakeJohnson74
      By JakeJohnson74
      Ok, so I feel as though I am programming myself into a corner here. 
      The code is a mess currently (but it runs) 
      First problem: my _ScreenOffset() is basically being call in line: 189 once. This takes one of my many listviews and establishes its position relative to the client. I then use $aLV_Offset in the message loop on the $GUI_EVENT_MOUSEMOVE in an if statement. 
      This was the only way I could figure out how to make an imaginary boundary to capture the listview I was dragging from. (any advice here would be  much appreciated) 
      Fixed Second related issue: If the user drags the whole GUI I need to update my $aLV_Offset positions and since its called once at the top - that isn't happening. I need a little nudge on how I would do this? Im thinking about registering WM_MOVE? and if the GUI moves - call my function and refresh its location. Just need a confirmation on that I suppose
      Third Issue: I have the drag and drop working on the Listview to the Treeview - but if you look at my Drag and Drop functions (line:379  & 400) you'll see if VERY specific to dragging FROM a list view, TO a treeview. 
      This is the biggest hurdle right now as I need dynamic Source and Target code. 
      case 1: If source = listview  target = treeview
      case 2: if source = treeview  target = listview 
      There are 7 list views and 2 tree views. So its very important to me that I target the right listview and the right tree view while dragging and dropping both ways and the two controls don't handle drag and drop the same ways. 
      So upon getting a successful drag and drop from the listviews to a treeview, I was happy! Then I thought - hmm, now... the treeview to the list view... CRAP! This is NOT written to handle it at all! 
      I have used various examples to get this far. For example there is Treeview / Listview drag and drop code example here, but they are static. the example shows the drag and drop functions hard coded to look at one specific control and move data to another specific control. This is simple - I need something more complex. 
      In summary - I would like some advice on best practice as I feel like I am getting into a little longer code here and at this point i feel like I put some time into going the wrong direction! haha. 
       
      *Edit - Feel free to dump my include you don't have. LOL I removed the code - but didn't remove the include. DatabaseConnect.au3
      #Region Includes #include <winapi.au3> #include <WinAPIEx.au3> #include <GuiToolbar.au3> #include <GuiImageList.au3> #include <GUIConstants.au3> #include <GuiConstantsEx.au3> #include <WindowsConstants.au3> #include <GUITab.au3> #include <GuiTreeView.au3> #include <Constants.au3> #include <TabConstants.au3> #include <WinAPIEx.au3> #include <DatabaseConnect.au3> #include <TreeViewConstants.au3> #include <GuiListView.au3> #include <ListViewConstants.au3> #include <Misc.au3> ;todo - clean out includes no longer used / remove large includes i can just replace with Const values... #EndRegion GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY") #Region URL ref ;This is a site I used to trial and error finding the Id's for the Icons I wanted. ;http://diymediahome.org/windows-icons-reference-list-with-details-locations-images/ #EndRegion #Region Vars ;Only Tested on Win7 64 machine Local $fIconsLoc1 = "imageres.dll" Local $fIconsLoc2 = "Resources\Icons\Undo.ico" Global $aStrings[12] Local $iNew,$iBrowse,$iEdit,$iDelete,$iSave,$iPrint Global Enum $e_new =1000, $e_edit, $e_delete, $e_save, $e_print, $e_undo Global $iItem, $cTreeView1, $cTreeView2,$hDll, $pDll, $hProc Global $hTab1, $hTab2, $hTab3 Global $hItemHover Global $aHwndFrom, $aHwndTo Global $hTvItemHover,$hLvItemHover Global $Debugmode = True Global $aLV_Offset,$aForm_Offset,$aWin1,$aWin2 ; Icon Index from DLL $iNew = 2 ;$iBrowse = 202 $iEdit = 111 $iDelete = 84 $iSave = 23 $iPrint = 46 $iGuiWidth = 1024 $iGUIHeight = 768 $BkColor = 0xf0f0f0 #EndRegion Vars ;Create Form, Toobar and ImageList $hGui = GUICreate("EDM and CNC Schedule",$iGuiWidth,$iGUIHeight,-1,-1) GUISetState() Global $hToolbar1 = _GUICtrlToolbar_Create($hGui) $imgs = _GUIImageList_Create(32,32,5) ; change first 2 params to Size the icons accordingly. #Region Toolbar ;Populate Image List _GUIImageList_AddIcon($imgs, $fIconsLoc1,$iNew,True) _GUIImageList_AddIcon($imgs, $fIconsLoc1,$iEdit,True) _GUIImageList_AddIcon($imgs, $fIconsLoc1,$iDelete,True) _GUIImageList_AddIcon($imgs, $fIconsLoc1,$iSave,True) _GUIImageList_AddIcon($imgs, $fIconsLoc1,$iPrint,True) _GUIImageList_AddIcon($imgs, $fIconsLoc2,0,True) ;Add Text to Buttons in Toolbar $aStrings[0] = _GUICtrlToolbar_AddString($hToolbar1, "&New") $aStrings[1] = _GUICtrlToolbar_AddString($hToolbar1, "&Edit") $aStrings[2] = _GUICtrlToolbar_AddString($hToolbar1, "&Delete") $aStrings[3] = _GUICtrlToolbar_AddString($hToolbar1, "&Save") $aStrings[4] = _GUICtrlToolbar_AddString($hToolbar1, "&Print") $aStrings[5] = _GUICtrlToolbar_AddString($hToolbar1, "&Undo") ;Set Imagelist of Toolbar to my ImageList $t = _GUICtrlToolbar_SetImageList($hToolbar1, $imgs) ;Add buttons to toolbar $cBtn_New = _GUICtrlToolbar_AddButton($hToolbar1, $e_new, 0,$aStrings[0]) $cBtn_Edit =_GUICtrlToolbar_AddButton($hToolbar1, $e_edit, 1,$aStrings[1]) $cBtn_Delete =_GUICtrlToolbar_AddButton($hToolbar1, $e_delete, 2,$aStrings[2]) $cBtn_Save =_GUICtrlToolbar_AddButton($hToolbar1, $e_save, 3,$aStrings[3]) $cBtn_Print =_GUICtrlToolbar_AddButton($hToolbar1, $e_print, 4,$aStrings[4]) $cBtn_Undo =_GUICtrlToolbar_AddButton($hToolbar1, $e_undo, 5,$aStrings[5]) GUISetState() #EndRegion Toolbar #Region Create Tabs $hGui1 = GUICreate("",$iGuiWidth-8,$iGUIHeight-65,5,60, $WS_POPUP, $WS_EX_MDICHILD,$hgui) ;~ GUISetBkColor(0x00FF00,$hGui1) ; Create top level Tab Items $hTab1 = GUICtrlCreateTab(0,1,$iGuiWidth-8,$iGUIHeight-65) $hTab1_0 = GUICtrlCreateTabItem("EDM Schedule") ;cTreeView 1 $cTreeView1 = GUICtrlCreateTreeView(0, 25, 175, 678, BitOR($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_SHOWSELALWAYS), $WS_EX_CLIENTEDGE) GUICtrlSetState(-1, $GUI_DROPACCEPTED) ;Set TreeView Data $generalitem = GUICtrlCreateTreeViewItem("16012", $cTreeView1) GUICtrlSetColor(-1, 0x0000C0) $displayitem = GUICtrlCreateTreeViewItem("16187", $cTreeView1) GUICtrlSetColor(-1, 0x0000C0) GUICtrlCreateTreeViewItem("Stripper", $generalitem) GUICtrlCreateTreeViewItem("Die Plate", $generalitem) GUICtrlCreateTreeViewItem("Punch String", $generalitem) GUICtrlCreateTreeViewItem("Die Insert String", $displayitem) GUICtrlCreateTreeViewItem("Punch Plate", $displayitem) GUICtrlSetState($generalitem, BitOR($GUI_EXPAND, $GUI_DEFBUTTON)) ; Expand the "General"-item and paint in bold GUICtrlSetState($displayitem, BitOR($GUI_EXPAND, $GUI_DEFBUTTON)) ; Expand the "Display"-item and paint in bold ;~ GUISetState() $hTab1_1 = GUICtrlCreateTabItem("CNC Schedule ") ;cTreeView 2 $cTreeView2 = GUICtrlCreateTreeView(0, 25, 175, 678, BitOR($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_SHOWSELALWAYS),$WS_EX_CLIENTEDGE) GUICtrlSetState(-1, $GUI_DROPACCEPTED) $generalitem = GUICtrlCreateTreeViewItem("15874", $cTreeView2) GUICtrlSetColor(-1, 0x0000C0) $displayitem = GUICtrlCreateTreeViewItem("16183", $cTreeView2) GUICtrlSetColor(-1, 0x0000C0) GUICtrlCreateTreeViewItem("Punch Plate", $generalitem) GUICtrlCreateTreeViewItem("Die Plate", $generalitem) GUICtrlCreateTreeViewItem("Stripper", $generalitem) GUICtrlCreateTreeViewItem("Die Shoe", $displayitem) GUICtrlCreateTreeViewItem("Punch Holder", $displayitem) GUICtrlSetState($generalitem, BitOR($GUI_EXPAND, $GUI_DEFBUTTON)) ; Expand the "General"-item and paint in bold GUICtrlSetState($displayitem, BitOR($GUI_EXPAND, $GUI_DEFBUTTON)) ; Expand the "Display"-item and paint in bold. GUICtrlCreateTabItem("") GUISetState() ;Create Inner GUI to hold the listviews for first tab $hGuiInner1 = GUICreate("", 834,679, 182,28, $WS_POPUP,$WS_EX_MDICHILD, $hgui1) $hLabelMask1 = GUICtrlCreateLabel("",89 ,0, 760, 21, BitOR($SS_NOTIFY, $SS_CENTER)) GUICtrlsetBkColor ($hLabelMask1,0xffffff ) $hTab2 = GUICtrlCreateTab(0,0,834,679) $hTab2_0 = GUICtrlCreateTabItem("Fryer ") $ListView5 = GUICtrlCreateListView("col1|col2|col3", 0, 20, 833, 658) $ListView5_0 = GUICtrlCreateListViewItem("Item1", $ListView5) $ListView5_1 = GUICtrlCreateListViewItem("Item2", $ListView5) $ListView5_2 = GUICtrlCreateListViewItem("Item3", $ListView5) $ListView5_3 = GUICtrlCreateListViewItem("Item4", $ListView5) $hTab2_1 = GUICtrlCreateTabItem("Micron") $ListView6 = GUICtrlCreateListView("col1|col2|col3", 0, 20, 833, 658) $ListView6_0 = GUICtrlCreateListViewItem("Item1", $ListView6) $ListView6_1 = GUICtrlCreateListViewItem("Item2", $ListView6) $ListView6_2 = GUICtrlCreateListViewItem("Item3", $ListView6) $ListView6_3 = GUICtrlCreateListViewItem("Item4", $ListView6) GUICtrlCreateTabItem("") GUISetState() ;Create Inner GUI to hold the listviews for second tab $hGuiInner2 = GUICreate("", 834,679, 182,28, $WS_POPUP,$WS_EX_MDICHILD, $hgui1) $hLabelMask2 = GUICtrlCreateLabel("",264 , 0, 750, 21, BitOR($SS_NOTIFY, $SS_CENTER)) GUICtrlsetBkColor ($hLabelMask2,0xffffff ) $hTab3 = GUICtrlCreateTab(0,0,834,679) $hTab3_0 = GUICtrlCreateTabItem("Agie V3") $ListView7 = GUICtrlCreateListView("col1|col2|col3", 0, 20, 833, 658) $ListView7_0 = GUICtrlCreateListViewItem("Item1", $ListView7) $ListView7_1 = GUICtrlCreateListViewItem("Item2", $ListView7) $ListView7_2 = GUICtrlCreateListViewItem("Item3", $ListView7) $ListView7_3 = GUICtrlCreateListViewItem("Item4", $ListView7) $hTab3_1 = GUICtrlCreateTabItem("Agie V2") $ListView8 = GUICtrlCreateListView("col1|col2|col3", 0, 20, 833, 658) $hTab3_2 = GUICtrlCreateTabItem("Agie V22") $ListView9 = GUICtrlCreateListView("col1|col2|col3", 0, 20, 833, 658) $hTab3_3 = GUICtrlCreateTabItem("Agie VP2") $ListView10 = GUICtrlCreateListView("col1|col2|col3", 0, 20, 833, 658) $hTab3_4 = GUICtrlCreateTabItem("Progress") $ListView11 = GUICtrlCreateListView("col1|col2|col3", 0, 20, 833, 658) GUICtrlCreateTabItem("") GUISetState() $aLV_Offset= _ScreenOffset(ControlGetHandle($hGuiInner1,"",$ListView5)) ; just to get the location of all listview (left top width hieght) #EndRegion End tabs #Region GUI Message Loop While 1 $idMsg = GUIGetMsg() Switch $idMsg Case $GUI_EVENT_MOUSEMOVE if _IsPressed("01") Then $aHwndTo = DllCall("user32.dll", "hwnd", "WindowFromPoint", "uint", MouseGetPos(0), "uint", MouseGetPos(1)) _Drag($aHwndTo[0]) if MouseGetPos(0) > $aLV_Offset[0] and MouseGetPos(1) > $aLV_Offset[1] and MouseGetPos(0) < $aLV_Offset[2] and MouseGetPos(1) < $aLV_Offset[3] then $aHwndFrom = DllCall("user32.dll", "hwnd", "WindowFromPoint", "uint", MouseGetPos(0), "uint", MouseGetPos(1)) endif endif Case $GUI_EVENT_DROPPED $aHwndTo = DllCall("user32.dll", "hwnd", "WindowFromPoint", "uint", MouseGetPos(0), "uint", MouseGetPos(1)) _Drop($aHwndTo[0],$aHwndFrom[0]) Case $GUI_EVENT_CLOSE Exit Case $htab1 Switch GUICtrlRead($htab1) Case 0 ; Adjust child GUIs accordingly GUISetState(@SW_HIDE, $hGuiInner1) GUISetState(@SW_SHOW, $hGuiInner2) Case 1 GUISetState(@SW_HIDE, $hGuiInner2) GUISetState(@SW_SHOW, $hGuiInner1) EndSwitch EndSwitch WEnd #EndRegion GUI Message Loop #Region Functions ; WM_NOTIFY event handler Func _WM_NOTIFY($hWndGUI, $MsgID, $wParam, $lParam) #forceref $hWndGUI, $MsgID, $wParam Local $tNMHDR, $event, $hwndFrom, $icode, $i_idNew, $dwFlags, $lResult, $idFrom, $i_idOld, $sButtonName, $hTreeView1, $hTreeView2 Local $tNMTOOLBAR, $tNMTBHOTITEM $tNMHDR = DllStructCreate($tagNMHDR, $lParam) $hwndFrom = DllStructGetData($tNMHDR, "hWndFrom") $idFrom = DllStructGetData($tNMHDR, "IDFrom") $icode = DllStructGetData($tNMHDR, "Code") $hTreeview1 = $cTreeView1 $hTreeview2 = $cTreeView2 If Not IsHWnd($cTreeView1) Then $hTreeview1 = GUICtrlGetHandle($cTreeView1) If Not IsHWnd($cTreeView2) Then $hTreeview2 = GUICtrlGetHandle($cTreeView2) Switch $hwndFrom Case $hToolbar1 Switch $icode Case $NM_LDOWN ;case for which button was clicked Switch $iItem Case $e_new _button_Click($e_new) Case $e_edit _button_Click($e_edit) Case $e_save _button_Click($e_save) Case $e_delete _button_Click($e_delete) Case $e_print _button_Click($e_print) Case $e_undo _button_Click($e_undo) EndSwitch Case $TBN_HOTITEMCHANGE $tNMTBHOTITEM = DllStructCreate($tagNMTBHOTITEM, $lParam) $i_idOld = DllStructGetData($tNMTBHOTITEM, "idOld") $i_idNew = DllStructGetData($tNMTBHOTITEM, "idNew") $iItem = $i_idNew $dwFlags = DllStructGetData($tNMTBHOTITEM, "dwFlags") EndSwitch Case $hTreeView1, $hTreeView2 ;~ Switch $icode ;~ Case $NM_CLICK ; The user has clicked the left mouse button within the control ;~ _DebugPrint("$NM_CLICK" & @CRLF & "--> hWndFrom:" & @TAB & $hWndFrom & @CRLF & _ ;~ "-->IDFrom:" & @TAB & $iDFrom & @CRLF & _ ;~ "-->Code:" & @TAB & $iCode, $Debugmode) ;~ ; Return 1 ; nonzero to not allow the default processing ;~ Return 0 ; zero to allow the default processing ;~ Case $NM_DBLCLK ; The user has double-clicked the left mouse button within the control ;~ _DebugPrint("$NM_DBLCLK" & @CRLF & "--> hWndFrom:" & @TAB & $hWndFrom & @CRLF & _ ;~ "-->IDFrom:" & @TAB & $iDFrom & @CRLF & _ ;~ "-->Code:" & @TAB & $iCode, $Debugmode) ;~ ; Return 1 ; nonzero to not allow the default processing ;~ Return 0 ; zero to allow the default processing ;~ Case $NM_RCLICK ; The user has clicked the right mouse button within the control ;~ _DebugPrint("$NM_RCLICK" & @CRLF & "--> hWndFrom:" & @TAB & $hWndFrom & @CRLF & _ ;~ "-->IDFrom:" & @TAB & $iDFrom & @CRLF & _ ;~ "-->Code:" & @TAB & $iCode, $Debugmode) ;~ ; Return 1 ; nonzero to not allow the default processing ;~ Return 0 ; zero to allow the default processing ;~ Case $NM_RDBLCLK ; The user has double-clicked the right mouse button within the control ;~ _DebugPrint("$NM_RDBLCLK" & @CRLF & "--> hWndFrom:" & @TAB & $hWndFrom & @CRLF & _ ;~ "-->IDFrom:" & @TAB & $iDFrom & @CRLF & _ ;~ "-->Code:" & @TAB & $iCode, $Debugmode) ;~ ; Return 1 ; nonzero to not allow the default processing ;~ Return 0 ; zero to allow the default processing ;~ Case $NM_KILLFOCUS ; control has lost the input focus ;~ _DebugPrint("$NM_KILLFOCUS" & @CRLF & "--> hWndFrom:" & @TAB & $hWndFrom & @CRLF & _ ;~ "-->IDFrom:" & @TAB & $iDFrom & @CRLF & _ ;~ "-->Code:" & @TAB & $iCode, $Debugmode) ;~ ; No return value ;~ Case $NM_RETURN ; control has the input focus and that the user has pressed the key ;~ _DebugPrint("$NM_RETURN" & @CRLF & "--> hWndFrom:" & @TAB & $hWndFrom & @CRLF & _ ;~ "-->IDFrom:" & @TAB & $iDFrom & @CRLF & _ ;~ "-->Code:" & @TAB & $iCode, $Debugmode) ;~ ; Return 1 ; nonzero to not allow the default processing ;~ Return 0 ; zero to allow the default processing ;~ ; Case $NM_SETCURSOR ; control is setting the cursor in response to a WM_SETCURSOR message ;~ ; Local $tInfo = DllStructCreate($tagNMMOUSE, $lParam) ;~ ; $hWndFrom = HWnd(DllStructGetData($tInfo, "hWndFrom")) ;~ ; $iIDFrom = DllStructGetData($tInfo, "IDFrom") ;~ ; $iCode = DllStructGetData($tInfo, "Code") ;~ ; _DebugPrint("$NM_SETCURSOR" & @CRLF & "--> hWndFrom:" & @TAB & $hWndFrom & @CRLF & _ ;~ ; "-->IDFrom:" & @TAB & $iIDFrom & @CRLF & _ ;~ ; "-->Code:" & @TAB & $iCode & @CRLF & _ ;~ ; "-->ItemSpec:" & @TAB & DllStructGetData($tInfo, "ItemSpec") & @CRLF & _ ;~ ; "-->ItemData:" & @TAB & DllStructGetData($tInfo, "ItemData") & @CRLF & _ ;~ ; "-->X:" & @TAB & DllStructGetData($tInfo, "X") & @CRLF & _ ;~ ; "-->Y:" & @TAB & DllStructGetData($tInfo, "Y") & @CRLF & _ ;~ ; "-->HitInfo:" & @TAB & DllStructGetData($tInfo, "HitInfo")) ;~ ; Return 0 ; to enable the control to set the cursor ;~ ; Return 1 ; nonzero to prevent the control from setting the cursor ;~ Case $NM_SETFOCUS ; control has received the input focus ;~ _DebugPrint("$NM_SETFOCUS" & @CRLF & "--> hWndFrom:" & @TAB & $hWndFrom & @CRLF & _ ;~ "-->IDFrom:" & @TAB & $iDFrom & @CRLF & _ ;~ "-->Code:" & @TAB & $iCode, $Debugmode) ;~ ; No return value ;~ Case $TVN_BEGINDRAGA, $TVN_BEGINDRAGW ;~ _DebugPrint("$TVN_BEGINDRAG", $Debugmode) ;~ Case $TVN_BEGINLABELEDITA, $TVN_BEGINLABELEDITW ;~ _DebugPrint("$TVN_BEGINLABELEDIT", $Debugmode) ;~ Case $TVN_BEGINRDRAGA, $TVN_BEGINRDRAGW ;~ _DebugPrint("$TVN_BEGINRDRAG", $Debugmode) ;~ Case $TVN_DELETEITEMA, $TVN_DELETEITEMW ;~ _DebugPrint("$TVN_DELETEITEM", $Debugmode) ;~ Case $TVN_ENDLABELEDITA, $TVN_ENDLABELEDITW ;~ _DebugPrint("$TVN_ENDLABELEDIT", $Debugmode) ;~ Case $TVN_GETDISPINFOA, $TVN_GETDISPINFOW ;~ _DebugPrint("$TVN_GETDISPINFO", $Debugmode) ;~ Case $TVN_GETINFOTIPA, $TVN_GETINFOTIPW ;~ _DebugPrint("$TVN_GETINFOTIP", $Debugmode) ;~ Case $TVN_ITEMEXPANDEDA, $TVN_ITEMEXPANDEDW ;~ _DebugPrint("$TVN_ITEMEXPANDED", $Debugmode) ;~ Case $TVN_ITEMEXPANDINGA, $TVN_ITEMEXPANDINGW ;~ _DebugPrint("$TVN_ITEMEXPANDING", $Debugmode) ;~ Case $TVN_KEYDOWN ;~ _DebugPrint("$TVN_KEYDOWN", $Debugmode) ;~ Case $TVN_SELCHANGEDA, $TVN_SELCHANGEDW ;~ _DebugPrint("$TVN_SELCHANGED", $Debugmode) ;~ Case $TVN_SELCHANGINGA, $TVN_SELCHANGINGW ;~ _DebugPrint("$TVN_SELCHANGING", $Debugmode) ;~ Case $TVN_SETDISPINFOA, $TVN_SETDISPINFOW ;~ _DebugPrint("$TVN_SETDISPINFO", $Debugmode) ;~ Case $TVN_SINGLEEXPAND ;~ _DebugPrint("$TVN_SINGLEEXPAND", $Debugmode) ;~ EndSwitch EndSwitch Return $GUI_RUNDEFMSG EndFunc func _button_Click($btn_ID) Switch $btn_ID Case $e_new _DebugPrint("Clicked New button" & @LF, $Debugmode) case $e_edit _DebugPrint("Clicked Edit button" & @LF, $Debugmode) Case $e_save _DebugPrint("Clicked Save button" & @LF, $Debugmode) Case $e_delete _DebugPrint("Clicked Delete button" & @LF, $Debugmode) Case $e_print _DebugPrint("Clicked Print button" & @LF, $Debugmode) Case $e_undo _DebugPrint("Clicked Undo button" & @LF, $Debugmode) EndSwitch endfunc ;==>_button_Click Func _TreeItemFromPoint($hWnd) Local $tMPos = _WinAPI_GetMousePos(True, $hWnd) Return _GUICtrlTreeView_HitTestItem($hWnd, DllStructGetData($tMPos, 1), DllStructGetData($tMPos, 2)) EndFunc ;==>_TreeItemFromPoint Func _Drag($hWnd) $hTvItemHover = _TreeItemFromPoint($hWnd) If $hTvItemHover = 0 Then Else ;Entered the Treeview $aRect = _GUICtrlTreeView_DisplayRect($hWnd, $hTvItemHover) $iTreeY = _WinAPI_GetMousePosY(True, $hWnd) Switch $iTreeY Case $aRect[1] To $aRect[1]+Int(($aRect[3]-$aRect[1])/4) _SendMessage($hWnd, $TVM_SELECTITEM, $TVGN_DROPHILITE, 0) ;remove DropTarget $fWhere = -1 Case 1+$aRect[1]+Int(($aRect[3]-$aRect[1])/3) To $aRect[1]+Int(($aRect[3]-$aRect[1])*2/3) _SendMessage($hWnd, $TVM_SELECTITEM, $TVGN_DROPHILITE, $hTvItemHover) ;add DropTarget $fWhere = 0 Case 1+$aRect[1]+Int(($aRect[3]-$aRect[1])*2/3) To $aRect[3] _SendMessage($hWnd, $TVM_SELECTITEM, $TVGN_DROPHILITE, 0) ;remove DropTarget $fWhere = 1 EndSwitch EndIf EndFunc ;==>_Drag Func _Drop($hWndTo, $hWndFrom) If $hTvItemHover <> 0 Then if _WinAPI_GetClassName($hWndFrom) = "SysListView32" then ; Get selected item in the listview $tmpItemArr = _GUICtrlListView_GetSelectedIndices($hWndFrom, TRUE) $tmpItem = _GUICtrlListView_GetItemText($hWndFrom, $tmpItemArr[1]) ; Get the selected item in the treeview $hSelected_Item = _GUICtrlTreeView_GetSelection($hWndTo) $myMSG = "Dragged: " & $tmpItem & @CRLF _ & "Dropped On: " & _GUICtrlTreeView_GetText($hWndTo, $hTvItemHover) _DebugPrint(@CRLF & $myMsg,$Debugmode) ; Reset drop target _SendMessage(GUICtrlGetHandle($hWndTo), $TVM_SELECTITEM, $TVGN_DROPHILITE, 0) ;remove DropTarget EndIf Else MsgBox(0, "", "No drop target") EndIf EndFunc ;==>_Drop Func _ScreenOffset($hWnd) $aWin1 = WinGetPos($hGuiInner1) $aWin2 = WinGetPos($hWnd) Local $tPoint = DllStructCreate("int X;int Y") local $aCoords[4] DllStructSetData($tPoint, "X", 0) DllStructSetData($tPoint, "Y", 0) _WinAPI_ClientToScreen($hWnd, $tPoint) DllStructGetData($tPoint, "X") DllStructGetData($tPoint, "Y") $aCoords[0] = $awin2[0];Left $aCoords[1] = $awin2[1];Top $aCoords[2] = $awin2[2]+$aCoords[0];Width + left $aCoords[3] = $awin2[3]+$aCoords[1];Height + Top return $aCoords EndFunc ;==>_ScreenOffset Func _DebugPrint($sText, $isEnabled, $sLine = @ScriptLineNumber) if $isenabled then ConsoleWrite(">--------------------------------" & @CRLF & _ "-->Line(" & StringFormat("%04d", $sLine) & "):" & @TAB & $sText & @CRLF & _ ">--------------------------------" & @CRLF) EndIf EndFunc ;==>_DebugPrint #EndRegion functions
    • flashlab
      By flashlab
      Thanks to ProgAndy's udf it's really amazing. But here is the problem. When I drag an item from a listview and release the left mouse button within the listview control(or within the app's main window), a message says 'Copy'.
      Now I would like the progress cancel the dragdrop action if the drop location is the app itself,or just shield the COPY message since it's obviously wrong.
      I've tried to add a function ,which make sure the window under the cursor is not the app itself, before the message shows.


      Func _WindowGetHovered() Local $h_Struct = DllStructCreate($tagPoint) DllStructSetData($h_Struct, "x", MouseGetPos(0)) DllStructSetData($h_Struct, "y", MouseGetPos(1)) Local $h_wnd = _WinAPI_WindowFromPoint($h_Struct) Local $res=_WinAPI_GetParent($h_wnd) Return $res EndFunc
      But it doesn't work fine I even don't know why I can't get the right handle of currect cursor location. Anyone can help me