Jump to content

Recommended Posts

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
Edited by JakeJohnson74
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
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By ahha
      Under program control is there an easy way to move a slider (thumb) to the top or bottom?
      I am aware of Melba23's GUIScrollbars_Ex UDF (https://www.autoitscript.com/forum/topic/113723-scrollbars-made-easy-bugfix-version-2-may-21/) but I believe it's overkill for my simple needs.
      In a listview with a vertical scrollbar when the window is active one can hit Ctrl+Home to move the scrollbar slider (thumb) to the top and Ctrl+End to the bottom.
      One can also right click the slider and choose Scroll Here, Top, Bottom, Page UP, Page Down, Scroll Up, and Scroll Down.
      I must be doing something basically wrong but am stuck.  Move the thumb to the middle before clicking the Top button to test the code below (Bottom is not coded).  I've commented out other trys.  try #3 is a strange fail.
      Any comments on what I'm missing greatly appreciated as I'm stuck
      #AutoIt3Wrapper_run_debug_mode=Y #include <Debug.au3> #include <GUIConstantsEx.au3> #include <GuiListView.au3> #include <GuiScrollBars.au3> AutoItSetOption("MustDeclareVars", 1) ;v1b - cut out extraneous code Example() Exit Func Example() Local $i, $j, $x, $hGUI, $idListView, $bTop, $bBottom $hGUI = GUICreate("Scrollbar Question", 300, 400) ;get handle in case we need it later $idListView = GUICtrlCreateListView("Col 0", 10, 10, 280, 300) $bTop = GUICtrlCreateButton("Top", 10, 350, 60, 25) $bBottom = GUICtrlCreateButton("Bottom", 120, 350, 60, 25) ;Pause("$hGUI = '" & $hGUI &"'"& @CRLF & "$idListView = '" & $idListView &"'") For $i = 1 to 100 _GUICtrlListView_AddItem($idListView, $i) Next GUISetState(@SW_SHOW) While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop Case $bTop ;drag thumb to middle of scrollbar before clicking Top button ;try #1 - FAILS Opt("WinTitleMatchMode", 2) ;2 = Match any substring in the title $x = WinActivate("Scrollbar Question") ;not $idListview but main GUI $hGUI - neither working If $x <> $hGUI Then Pause("WinActivate FAILED") Send("^{HOME}") ;Ctrl+home ;try#2 - FAILS ;~ $x = WinActivate($hGUI) ;try Main GUI ;~ If $x <> $hGUI Then Pause("WinActivate FAILED") ;~ Send("^{HOME}") ;Ctrl+home ;try#3 - strange FAILS ;~ $x = WinActivate($idListview) ;try $idListview ;~ If $x <> $idListview Then Pause("WinActivate FAILED") ;strange it works BUT if I comment out this line it fails ;~ ;Sleep(1000) ;it's not a time delay issue ;~ Send("^{HOME}") ;Ctrl+home ;try#4 - same strange fail as #3 ;~ $x = WinActivate($idListview) ;try $idListview ;~ If $x <> $idListview Then Pause("WinActivate FAILED") ;~ Send("{UP 100}") ;try#5 - what the heck is going on? same strange fail as #3 ;$x = WinActivate($idListview) ;try $idListview ;~ $x = WinActivate($hGUI) ;try Main GUI ;~ If $x <> $idListview Then Pause("WinActivate FAILED") ;~ MouseWheel($MOUSE_WHEEL_UP, 100) ;_GUIScrollBars_ScrollWindow($hGUI, 0, 100) ;NO - moves the ListView window in the $hGUI ;_GUIScrollBars_ScrollWindow($idListview, 0, 100) ;does not seem to work ;_GUIScrollBars_SetScrollInfoPos($hGUI, $SB_VERT, 30) ;does not work ;_GUIScrollBars_SetScrollInfoPos($idListview, $SB_VERT, 30) ;does not work ;I'm doing something very basic wrong. I need help. Pause("Scrollbar thumb should be at Top") Case $bBottom Pause("In: Case $bBottom") Pause("Scroll bar should be at BOttom") EndSwitch WEnd GUIDelete($idListView) EndFunc ;Func Example() Func Pause($text="") MsgBox(262144, "DEBUG", "Paused: " & $text) EndFunc  
    • By ahha
      Newbie to _GUICtrlListView_RegisterSortCallBack and can't get it to sort properly on date in format MM/DD/YYYY.
      Example code below.  Q - How do I get the date to sort properly?
      ;#AutoIt3Wrapper_run_debug_mode=Y #include <GUIConstantsEx.au3> #include <GuiListView.au3> Global $g_id_ListView Example() Exit Func Example() Local $idRow1, $idRow2, $idRow3 GUICreate("ListView Sort Question", 300, 200) $g_id_ListView = GUICtrlCreateListView("Row#|Name|Date", 10, 10, 280, 180) $id_Row1 = GUICtrlCreateListViewItem("#1|Alice|01/15/2022", $g_id_ListView) $id_Row2 = GUICtrlCreateListViewItem("#2|Bob|02/22/2021", $g_id_ListView) $id_Row3 = GUICtrlCreateListViewItem("#3|Carol|03/13/2021", $g_id_ListView) $id_Row10 = GUICtrlCreateListViewItem("#10|Dave|10/09/2021", $g_id_ListView) $id_Row11 = GUICtrlCreateListViewItem("#11|Eve|11/21/2021", $g_id_ListView) GUISetState(@SW_SHOW) ;$vCompareType = 0 ;not ok as Row# sort #1, #10, and want #1, #2, ;$vCompareType = 1 ;not ok as Row# sort #1, #10, and want #1, #2, $vCompareType = 2 ;Row# okay but Date messed up _GUICtrlListView_RegisterSortCallBack($g_id_ListView, $vCompareType) While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop Case $g_id_ListView ;MsgBox(0,"","col="&GUICtrlGetState($g_id_ListView)) _GUICtrlListView_SortItems($g_id_ListView, GUICtrlGetState($g_id_ListView)) EndSwitch WEnd _GUICtrlListView_UnRegisterSortCallBack($g_id_ListView) GUIDelete($g_id_ListView) EndFunc ;Func Example()  
    • By UEZ
      This project has been discontinued!
       
      Here a small tool I wrote to update my Sysinternal tools collection without the need to download always the whole package or visiting the site to check for updates. I know that there are several tools available (also some tools written in AutoIt) but here another one for the collection. It was good exercise for me to code it.
       
       
        
       
       
      Some files from the live web site cannot be downloaded although they are visible!
       
      Here the download link of the source code only: AutoIt Sysinternal Tools Synchronizer v0.99.6 build 2020-09-23 beta.7z  (1557 downloads previously)
      -=> Requires AutoIt version 3.3.13.20 or higher / tested on Win8.1 real machine and some VMs: Win7 / Vista / Win10
       
      Compiled exe only: @MediaFire
       
      Just select the Sysinternal Tools folder or create one and press the synchronize button to download the selected items. Click on AutoIt label (near to left upper corner) to open menu.
       
      Special thanks to LarsJ, Melba23 and mesale0077 for their help. 
       
      I've still some ideas to implement which are more gimmick related, so it is not finished yet...
      If you want to add your language please check out #Region Language. Thanks. 
       
      Please report any bug or if you have any suggestions.
       
      The language of the tool tip from each of the executable in the left list view were automatically created using Google translator and weren't checked for correctness.
       
      Br,
      UEZ
    • By jcpetu
      Hi people, I'm trying to dynamically populate a TreeView based on a script from Water that I modified for my needs. but I can't figured it out how to make it work.
      Here what I have in case anyone can help me, thanks in advance:
      #include <array.au3> #include <GUIConstantsEx.au3> #include <GuiTreeView.au3> Local $aTV1[14][3] = [ _ ['1', 'Text 1', -1], _ ;-1 idicates it's an index item ['2', 'Text 2',-1], _ ['3', 'Text 3',-1], _ ['1-1', 'Text 1-1',0], _ ['1-2', 'Text 1-2',0], _ ['2-1', 'Text 2-1',0], _ ['2-2', 'Text 2-2',0], _ ['2-1-1', 'Text 2-1-1',0], _ ['2-1-2', 'Text 2-1-2',0], _ ['2-1-2-1', 'Text 2-1-2-1',0], _ ['2-1-2-1-1', 'Text 2-1-2-1-1',0], _ ['3-1', 'Text 3-1',0], _ ['3-1-1', 'Text 3-1-1',0], _ ['3-1-1-1', 'Text 3-1-1-1',0]] ;_ArrayDisplay($aTV1) Local $Gui = GUICreate('TreeView Example', 500, 600) Local $tv = GUICtrlCreateTreeView(10, 30, 450, 550) GUISetState() _pop_treeview($tv, $aTV1) While 1 Switch GUIGetMsg() Case $gui_event_close Exit EndSwitch WEnd Func _pop_treeview($hTV, $array) Local $TimeInitial = TimerInit(), $Hours, $Mins, $Secs, $item _ArraySort($array, 0, 0, 0, 0) ;------------------------- sort Ascending on column 0 ;_ArrayDisplay($array) $idxroot = _GUICtrlTreeView_Add($hTV, 0, "index") For $i = 0 To UBound($array) - 1 ConsoleWrite("$array[" & $i & "][" & 0 & "] = " & $array[$i][0] & @CRLF) If $array[$i][0] = '' Then ExitLoop ;--------------- Exit at first empty element $item = '' If $array[$i][2] = -1 Then ;------------------------ Add root element _GUICtrlTreeView_AddChild($hTV, $idxroot, $array[$i][1]) Else $item = StringLeft($array[$i][0], StringInStr($array[$i][0], "-", 1, -1) - 1) ConsoleWrite("$item = " & $item & @CRLF) $Found = _ArrayBinarySearch($array, $item, 0, 0, 0) ;search on column 0 Switch $Found Case 0 ;----------------------------------- Value wasn't found in array ConsoleWrite("Item NOT found @error= " & @error & @CRLF) Case Else ConsoleWrite("Item found " & @CRLF) _GUICtrlTreeView_AddChild($hTV, $Found, $array[$i][1]) EndSwitch EndIf Next _GUICtrlTreeView_Expand($hTV) EndFunc ;==>_pop_treeview  
    • By Cengokill
      Hi everyone,
      I have created a ListView that is in a tab, and I want to display an image in that tab, with the ListView on top.
      However, the image still appears on top of my ListView.
      If I remove the tabs everything works. 
      I looked at the autoit documentation and the <GuiListView.au3> documentation , I can't figure out how to display a background image, and put on top a ListView, inside a tab. 😥
      Here is the code:
      Opt("GUIOnEventMode", 1) $Form1 = GUICreate($Titre, 700, 627, $Form1Width, $Form1Height); main window $tabulation = GUICtrlCreateTab(148,0,700,580); creating tabs $tab1=GUICtrlCreateTabItem("Tab 1"); first tab GUICtrlSetState(-1, $GUI_SHOW); this tab is selected by default $Pic1 = GUICtrlCreatePic("image.jpg", 0, 30, 700, 627) GUICtrlSetState(-1, $GUI_DISABLE). $idListview = GUICtrlCreateListView("list 1|list 2|list 3", 200, 50, 390, 200) GUISetState(@SW_SHOW) While 1     Sleep(100) WEnd Thank you in advance.

×
×
  • Create New...