想右键删除TreeView里面的某一个子项(已解决)
本帖最后由 qsy666888 于 2020-5-11 16:40 编辑达到目的:在不用左键的情况下,鼠标指针移动到想要删除TreeView里面的某一个子项时,直接右键就可以删除想要删除的那个子项,大侠们 ! 兄弟伙们!该如何操作呢?求指教。
现在我这里只能先左键点击子项 ,然后再右键删除,但是不能删除自己指定的子项
#include <GUIConstantsEx.au3>
#include <GuiTreeView.au3>
#include <GuiImageList.au3>
#include <WindowsConstants.au3>
$Debug_TV = False ; 检查传递给函数的类名, 设置为True并输出到一个控件的句柄,用于检查它是否工作
Global $hTreeView
_Main()
Func _Main()
Local $hItem, $hImage, $iImage
Local $iStyle = BitOR($TVS_EDITLABELS, $TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS)
GUICreate("TreeView Click Item", 400, 300)
$hTreeView = GUICtrlCreateTreeView(2, 2, 396, 268, $WS_BORDER+$iStyle)
GUISetState()
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
$a = StringSplit('a|b|c|d|e|f|g','|',1)
_GUICtrlTreeView_BeginUpdate($hTreeView)
For $x = 1 To 10
$hItem = GUICtrlCreateTreeViewItem(StringFormat("[%02d] text", $x), $hTreeView)
For $y = 1 To 7
GUICtrlCreateTreeViewItem(StringFormat($a[$y]&'_text', $y), $hItem)
Next
Next
_GUICtrlTreeView_EndUpdate($hTreeView)
; 循环直到用户退出
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
GUIDelete()
EndFunc ;==>_Main
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
#forceref $hWnd, $iMsg, $iwParam
Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndTreeview
$hWndTreeview = $hTreeView
If Not IsHWnd($hTreeView) Then $hWndTreeview = GUICtrlGetHandle($hTreeView)
$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $hWndTreeview
Switch $iCode
Case $NM_RCLICK ; The user has clicked the right mouse button within the control
$iPos_X = _WinAPI_GetMousePosX(True, $hTreeView)
$iPos_Y = _WinAPI_GetMousePosY(True, $hTreeView)
$uFlags = _GUICtrlTreeView_HitTest($hTreeView, $iPos_X, $iPos_Y)
Local $hItem, $hParent, $sText_I
$hItem = _GUICtrlTreeView_HitTestItem($hTreeView, $iPos_X, $iPos_Y)
$id_hItem = BinaryLen($hItem)
Local $Id_P = _GUICtrlTreeView_GetParentParam($hTreeView, $hItem)
_GUICtrlTreeView_Delete($hTreeView, $Id_P)
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY
句柄用错了,那是ID
Case $NM_RCLICK ; The user has clicked the right mouse button within the control
Local $iPos_X = _WinAPI_GetMousePosX(True, $hWndTreeview)
Local $iPos_Y = _WinAPI_GetMousePosY(True, $hWndTreeview)
Local $hItem = _GUICtrlTreeView_HitTestItem($hWndTreeview, $iPos_X, $iPos_Y)
If $hItem Then _GUICtrlTreeView_Delete($hWndTreeview, $hItem) afan 发表于 2020-5-11 11:15
句柄用错了,那是ID
感谢感谢,非常感谢A大 本帖最后由 qsy666888 于 2020-5-11 15:56 编辑
afan 发表于 2020-5-11 11:15
句柄用错了,那是ID
a大 你好!我想再问一下,如果不用 id 的话 (id好像需要左键点击后才能获取id地址),那么我如果移动到某一个父项上,按右键(不使用左键),就能添加一项子项在那父项里面去。
(如果使用左键的话,就能实现,但如果使用右键的话,就获取不了id),感谢a大!
#include <GUIConstantsEx.au3>
#include <GuiTreeView.au3>
#include <GuiImageList.au3>
#include <WindowsConstants.au3>
$Debug_TV = False ; 检查传递给函数的类名, 设置为True并输出到一个控件的句柄,用于检查它是否工作
Global $hTreeView,$hWndTreeview,$hItem
_Main()
Func _Main()
Local $hItem, $hImage, $iImage
Local $iStyle = BitOR($TVS_EDITLABELS, $TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS)
GUICreate("TreeView Click Item", 400, 300)
$hTreeView = GUICtrlCreateTreeView(2, 2, 396, 268)
GUISetState()
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
$a = StringSplit('a|b|c|d|e|f|g','|',1)
_GUICtrlTreeView_BeginUpdate($hTreeView)
For $x = 1 To 5
$hItem = GUICtrlCreateTreeViewItem(StringFormat("[%02d] text111", $x), $hTreeView)
For $y = 1 To 2
GUICtrlCreateTreeViewItem(StringFormat($a[$y]&'_text', $y), $hItem)
Next
Next
_GUICtrlTreeView_EndUpdate($hTreeView)
; 循环直到用户退出
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
GUIDelete()
EndFunc ;==>_Main
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
#forceref $hWnd, $iMsg, $iwParam
Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndTreeview
$hWndTreeview = $hTreeView
If Not IsHWnd($hTreeView) Then $hWndTreeview = GUICtrlGetHandle($hTreeView)
$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $hWndTreeview
Switch $iCode
Case $NM_RCLICK ; The user has clicked the right mouse button within the control
;Local $iPos_X = _WinAPI_GetMousePosX(True, $hWndTreeview)
;Local $iPos_Y = _WinAPI_GetMousePosY(True, $hWndTreeview)
$Id_P = _GUICtrlTreeView_HitTestItem($hTreeView)
If $hItem Then GUICtrlCreateTreeViewItem('tj_text', $Id_P)
_GUICtrlTreeView_Expand($hTreeView, $Id_P)
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY
Case $NM_RCLICK ; The user has clicked the right mouse button within the control
Local $iPos_X = _WinAPI_GetMousePosX(True, $hWndTreeview)
Local $iPos_Y = _WinAPI_GetMousePosY(True, $hWndTreeview)
Local $hItem = _GUICtrlTreeView_HitTestItem($hTreeView, $iPos_X, $iPos_Y)
_GUICtrlTreeView_SelectItem($hWndTreeview, $hItem)
Local $iID = GUICtrlRead($hTreeView)
GUICtrlCreateTreeViewItem('tj_text', $iID)
_GUICtrlTreeView_Expand($hTreeView, $iID) afan 发表于 2020-5-11 16:33
感谢感谢 a大好人哈 好人一生平安 qsy666888 发表于 2020-5-11 16:39
感谢感谢 a大好人哈 好人一生平安
下面能添加也能删除:
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
#forceref $hWnd, $iMsg, $iwParam
$a = StringSplit('a|b|c|d|e|f|g|tj', '|', 1)
Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndTreeview
$hWndTreeview = $hTreeView
If Not IsHWnd($hTreeView) Then $hWndTreeview = GUICtrlGetHandle($hTreeView)
$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $hWndTreeview
Switch $iCode
Case $NM_RCLICK ; The user has clicked the right mouse button within the control
Local $iPos_X = _WinAPI_GetMousePosX(True, $hWndTreeview)
Local $iPos_Y = _WinAPI_GetMousePosY(True, $hWndTreeview)
Local $hItem = _GUICtrlTreeView_HitTestItem($hTreeView, $iPos_X, $iPos_Y)
_GUICtrlTreeView_SelectItem($hWndTreeview, $hItem)
$Index = GUICtrlRead($hTreeView, 1)
For $x = 1 To 10
$Indexa = StringFormat("[%02d] text", $x)
If $Index = $Indexa Then
Local $iID = GUICtrlRead($hTreeView)
GUICtrlCreateTreeViewItem('tj_text', $iID)
_GUICtrlTreeView_Expand($hTreeView, $iID)
EndIf
Next
For $y = 1 To 8
$Indexb = StringFormat($a[$y] & '_text', $y)
If $Index = $Indexb Then
If $hItem Then _GUICtrlTreeView_Delete($hWndTreeview, $hItem)
EndIf
Next
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY
chzj589 发表于 2020-5-11 21:02
下面能添加也能删除:
你这代码也不错,非常棒
页:
[1]