找回密码
 加入
搜索
查看: 4953|回复: 8

[系统综合] treeview 文件复选框选中问题?[已解决]

  [复制链接]
发表于 2012-8-1 18:47:27 | 显示全部楼层 |阅读模式
本帖最后由 kinghu318 于 2012-8-2 15:38 编辑
#AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
#include <GuiConstantsEx.au3>
#include <GuiTreeView.au3>
#include <WindowsConstants.au3>

;Opt('MustDeclareVars', 1)

$Debug_TV = False ; Check ClassName being passed to functions, set to True and use a handle to another control to see it work

Global $hTreeView, $hItem[11]

_Main()

Func _Main()

        Local $GUI
        Local $iStyle = BitOR($GUI_SS_DEFAULT_TREEVIEW, $TVS_CHECKBOXES, $WS_HSCROLL, $TVS_NONEVENHEIGHT)
        $GUI = GUICreate("(UDF Created) TreeView Create", 400, 300)

        $hTreeView = _GUICtrlTreeView_Create($GUI, 2, 2, 396, 268, $iStyle, $WS_EX_CLIENTEDGE)
        GUISetState()

        GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

        _GUICtrlTreeView_BeginUpdate($hTreeView)
        For $x = 1 To Random(2, 10, 1)
                $hItem[$x] = _GUICtrlTreeView_Add($hTreeView, 0, StringFormat("[%02d] New Item", $x))
        Next
        _GUICtrlTreeView_EndUpdate($hTreeView)

        ; Loop until user exits
        Do
        Until GUIGetMsg() = $GUI_EVENT_CLOSE
        GUIDelete()
EndFunc   ;==>_Main

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
        #forceref $hWnd, $iMsg, $iwParam
        Local $hWndFrom, $iCode, $tNMHDR, $hWndTreeview;, $iIDFrom
        $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 $TVN_SELCHANGEDW
                                        ;MsgBox(0, "", "jr")
                                        For $x = 1 To 10
                                                If _GUICtrlTreeView_GetSelected($hTreeView, $hItem[$x]) Then
                                                        If _GUICtrlTreeView_GetChecked($hTreeView, $hItem[$x]) Then
                                                                _GUICtrlTreeView_SetChecked($hTreeView, $hItem[$x], False)
                                                        Else
                                                                _GUICtrlTreeView_SetChecked($hTreeView, $hItem[$x])
                                                        EndIf
                                                EndIf
                                        Next
                        EndSwitch
        EndSwitch
        Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
这是我在论坛找的,我也是想通过WM_NOTIFY这种方式进行treeview的操作,但是这个是判断_GUICtrlTreeView_GetSelected选中,发生改变的时候能进行正常选中和勾选复选框,但是点击同一个就无法进行修改,我想当点击文本或者复选框的时候进行修改,复选框进行改变,同时文本选中状态,请牛人帮忙修改修改,或者有什么好的方法,希望大家帮忙,非常感谢!!!!!
 楼主| 发表于 2012-8-2 09:27:53 | 显示全部楼层
大虾们帮忙看看,,,谢谢。。。。。
发表于 2012-8-2 13:39:27 | 显示全部楼层
没搞过这东东,貌似有些难度,昨天就搞了下,未果。直接点击项目可以做到勾选、反选,但点击复选框却又不行,再试试别的办法……
 楼主| 发表于 2012-8-2 14:01:20 | 显示全部楼层
回复 3# afan


    谢谢afan,我发现treeview的复选框的事件先于treeview的$TVN_SELCHANGEDW事件,就是复选框的事件发生了之后又重新发生了$TVN_SELCHANGEDW这个事件,导致$TVN_SELCHANGEDW这个中判断的选中状态就出现错误,不知道有什么办法,监视到复选框改变。。
发表于 2012-8-2 14:25:27 | 显示全部楼层
回复 4# kinghu318


    试下这样
#include <GuiConstantsEx.au3>
#include <GuiTreeView.au3>
#include <WindowsConstants.au3>

Local $hGUI = GUICreate('TreeView 单击项目操作复选框例子 @Afan', 400, 300)
Local $iStyle = BitOR($GUI_SS_DEFAULT_TREEVIEW, $TVS_CHECKBOXES, $WS_HSCROLL, $TVS_NONEVENHEIGHT)
Local $hTreeView = _GUICtrlTreeView_Create($hGUI, 2, 2, 396, 268, $iStyle, $WS_EX_CLIENTEDGE)
GUISetState()
Local $nItem = 10, $hItem[$nItem]
_GUICtrlTreeView_BeginUpdate($hTreeView)
For $x = 0 To $nItem - 1
        $hItem[$x] = _GUICtrlTreeView_Add($hTreeView, 0, ' 项目 - ' & $x + 1)
Next
_GUICtrlTreeView_EndUpdate($hTreeView)
GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')

Do
Until GUIGetMsg() = -3
GUIDelete()

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
        #forceref $hWnd, $iMsg, $iwParam
        Local $hWndFrom, $iCode, $tNMHDR, $hWndTreeview, $rPos, $rSel, $aRect
        $hWndTreeview = $hTreeView
        $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
        $hWndFrom = HWnd(DllStructGetData($tNMHDR, 'hWndFrom'))
        $iCode = DllStructGetData($tNMHDR, 'Code')
        Switch $hWndFrom
                Case $hWndTreeview
                        Switch $iCode
                                Case $NM_CLICK
                                        $rPos = GUIGetCursorInfo()
                                        $rSel = _GUICtrlTreeView_HitTestItem($hWndTreeview, $rPos[0], $rPos[1] - 4)
                                        If $rSel = 0 Then Return $GUI_RUNDEFMSG
                                        $aRect = _GUICtrlTreeView_DisplayRect($hTreeView, $rSel, 1)
                                        If $rPos[0] - 3 >= $aRect[0] Then _
                                                _GUICtrlTreeView_SetChecked($hTreeView, $rSel, Not _GUICtrlTreeView_GetChecked($hTreeView, $rSel))
                        EndSwitch
        EndSwitch
        Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

评分

参与人数 1金钱 +40 收起 理由
kinghu318 + 40 非常感谢afan的帮助

查看全部评分

 楼主| 发表于 2012-8-2 15:37:05 | 显示全部楼层
回复 5# afan


    非常感谢afan,这样做就OK了,按照你的方法实现了
 楼主| 发表于 2012-8-2 20:45:08 | 显示全部楼层
回复 5# afan


    afan If $rPos[0] - 3 >= $aRect[0] Then _
                                                _GUICtrlTreeView_SetChecked($hTreeView, $rSel, Not _GUICtrlTreeView_GetChecked($hTreeView, $rSel)) 这段代码的意思是当点击复选框的时候不做处理,要控件本身处理吗?但是这样的话,在$NM_CLICK事件中就无法去判断checkbox的选中状态,也就是说,和在$NM_CLICK中获取的状态是一个反的。。。。
发表于 2012-8-2 21:08:28 | 显示全部楼层
回复 7# kinghu318


    判断勾选状态不要在$NM_CLICK时判断,一般都是选完了之后再读取。
如果硬要在$NM_CLICK时判断也很简单:
If $rPos[0] - 3 >= $aRect[0] Then
取正
Else
取反
EndIf
 楼主| 发表于 2012-8-3 09:23:45 | 显示全部楼层
回复 8# afan

谢谢afan
    对的,是要选完之后才进行读取判断,如果在¥NM_Click中去判断,好像是一个反,如果是一个级联的树结构,通过父项选中,同事也进行子项的选中,因为,复选框本身点击勾选就会有一个事件吧,而$NM_Click这个事件,好像在复选框本身选择的事件之前。就比如,我在树结构中点击复选框,判断如果复选框是选中状态就设置成false,如果非选中就设置成true,但是在$NM_click事件判断设置后,checkbox本身的点击事件又会去判断,复选框的状态,重复设置操作,这样好像就有问题了,不知道我理解得对不对。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-6 13:57 , Processed in 0.088983 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表