找回密码
 加入
搜索
查看: 4076|回复: 7

[GUI管理] (已解决)选择父选框时选择上对应下面的子选框问题之父选框都没有真正完全列举出来!

  [复制链接]
发表于 2010-12-29 11:10:36 | 显示全部楼层 |阅读模式
本帖最后由 yarsye 于 2011-1-4 13:05 编辑

想法:把遍历到的文件夹和文件的句柄全部写到ini文件里,然后通过读取ini文件里的句柄去执行选择父选框同时让子选框也选上,现在打开ini文件发现里面文件夹都没有全部列举完,换成句柄肯定也不对,所以问题还是在这里 !找了半天 又陷入了沉思。。。
#include <GuiConstantsEx.au3>
#include <GuiTreeView.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <file.au3>
#include <array.au3>

Local $iStyle = BitOR($TVS_EDITLABELS, $TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS, $TVS_CHECKBOXES)
Global $array1[2][2], $array2[2][2], $array3[2][2], $inipath, $inivalue, $readini
$inipath = @DesktopDir & '\test.ini'
$inivalue = ''

$GUI = GUICreate("(UDF Created) TreeView Create", 400, 640)
$hTreeView = GUICtrlCreateTreeView(2, 2, 396, 568, $iStyle, $WS_EX_CLIENTEDGE)
Recursion(@AppDataCommonDir', '')
GUISetState()

$readini = IniReadSection($inipath , 'section2');store folders
If @error Then 
        MsgBox(4096, "", "错误, 不是 INI 文静.")
Else
        For $k = 1 To $readini[0][0]
                Dim $newarray[UBound($readini)+1][2]
        Next
EndIf

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case - 3
                        Exit
                Case $readini[1][1] To $readini[UBound($readini) - 1 ][1] ;父项目
                        If BitAND(GUICtrlRead($nMsg), $GUI_CHECKED) Then ;如果父项目勾选,其下所有子项目全选。
                                                        MsgBox(0,1,1)
;~                                 $iSitemNumber = Number(_GUICtrlTreeView_GetChildCount($item1, $nMsg))
;~                                 For $i = $nMsg To $nMsg + $iSitemNumber
;~                                         GUICtrlSetState($i, $GUI_CHECKED)
;~                                 Next
;~                         Else
;~                                 $iSitemNumber = Number(_GUICtrlTreeView_GetChildCount($item1, $nMsg))
;~                                 For $i = $nMsg To $nMsg + $iSitemNumber
;~                                         GUICtrlSetState($i, $GUI_UNCHECKED)
;~                                 Next
                        EndIf
;~                         ContinueCase
;~                 Case $aSitem[0][0] To $aSitem[UBound($aSitem) - 1][0] ;子项目
;~                         If BitAND(GUICtrlRead($nMsg), $GUI_CHECKED) Then ;如果子项目勾选,其父项目也跟着勾选。
;~                                 $hFitemHandle = _GUICtrlTreeView_GetParentParam($TreeView1, $nMsg)
;~                                 GUICtrlSetState($hFitemHandle, $GUI_CHECKED)
;~                         Else ;父项目下的所有子项目全部取消勾选,父项目也跟着取消勾选。
;~                                 $hFitemHandle = _GUICtrlTreeView_GetParentParam($TreeView1, $nMsg)
;~                                 $iSitemNumber = Number(_GUICtrlTreeView_GetChildCount($TreeView1, $hFitemHandle))
;~                                 For $i = $hFitemHandle To $hFitemHandle + $iSitemNumber
;~                                         If GUICtrlRead($i) = $GUI_CHECKED Then ExitLoop
;~                                         If $i = $hFitemHandle + $iSitemNumber Then GUICtrlSetState($hFitemHandle, $GUI_UNCHECKED)
;~                                 Next
;~                         EndIf

;~                         $x = 1
;~                         $sItemText = ''
;~                         GUICtrlSetData($List1, '') ;清空List内所有数据
;~                         For $i = 0 To UBound($aSitem) - 1
;~                                 If _GUICtrlTreeView_GetChecked($TreeView1, $aSitem[$i][0]) Then
;~                                         GUICtrlSetData($List1, StringFormat("[%02d]", $x) & $aSitem[$i][1]) ;如果项目被勾选则写入List
;~                                         $sItemText &= $aSitem[$i][1] & '|'
;~                                         $x += 1
;~                                 EndIf
;~                         Next
;~                 Case $But1
;~                         $sText = ''
;~                         For $i = 0 To UBound($aSitem) - 1
;~                                 If _GUICtrlTreeView_GetChecked($TreeView1, $aSitem[$i][0]) Then
;~                                         $sText &= '被选项目句柄:' & $aSitem[$i][0] & '   ' & '项目文本:' & $aSitem[$i][1] & @CRLF
;~                                 EndIf
;~                         Next
;~                         If $sText <> '' Then MsgBox(0, '获取被选项目句柄+项目文本', $sText)
;~                 Case $But2
;~                         begin()
        EndSwitch
WEnd


Func Recursion($current, $flag)
        Local $i = 0, $j = 0
        If Not FileExists($inipath) Then
                IniWrite($inipath, 'section', 'key', 1)
                $inivalue = IniRead($inipath, 'section', 'key', '')
        Else
                $inivalue = IniRead($inipath, 'section', 'key', '')
                $inivalue += 1
                IniWrite($inipath, 'section', 'key', $inivalue)
                $inivalue = IniRead($inipath, 'section', 'key', '')
        EndIf
        If $flag = '' Then $item1 = GUICtrlCreateTreeViewItem($current, $hTreeView)
        Local $search = FileFindFirstFile($current & "\*.*")
        While 1
                Dim $file = FileFindNextFile($search)
                If @error Or StringLen($file) < 1 Then ExitLoop
                If StringInStr(FileGetAttrib($current & "" & $file), "D") And ($file <> "." Or $file <> "..") Then
                        If $flag <> '' Then $item1 = $flag
                        $item2 = GUICtrlCreateTreeViewItem($file, $item1)
                        $i +=1
                        IniWrite($inipath, 'section2', 'key' & $i, $file );$item2 );$array2[$i][0]);store folders
                        Recursion($current & "" & $file, $item2)
                Else
                        If $flag <> '' Then $item1 = $flag
                        $item3 = GUICtrlCreateTreeViewItem($file, $item1)
                        $j += 1
                        IniWrite($inipath, 'section1', 'key' & $j, $file ) ;$item3 ) ;$array3[$j][0]);store files
                EndIf
        WEnd
        Return
EndFunc   ;==>Recursion

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2010-12-29 12:30:39 | 显示全部楼层
在点击的那个条件里加上子项循环设置(不)选中状态
发表于 2010-12-29 15:56:47 | 显示全部楼层
自己写个点击后的判断
 楼主| 发表于 2010-12-29 16:10:13 | 显示全部楼层
回复 3# 飘云
这样可以加吗?
#include <GuiConstantsEx.au3>
#include <GuiTreeView.au3>
#include <GuiImageList.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <file.au3>
#include <array.au3>

Global  $iStyle = BitOR($TVS_EDITLABELS, $TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS, $TVS_CHECKBOXES)
;~ Global $item1 = ''
$GUI = GUICreate("(UDF Created) TreeView Create", 400, 640)

$hTreeView = _GUICtrlTreeView_Create($GUI, 2, 2, 396, 568,$iStyle, $WS_EX_CLIENTEDGE)
$hImage = _GUIImageList_Create(16, 16, 5, 3)
_GUIImageList_AddIcon($hImage, "shell32.dll", 4)
_GUICtrlTreeView_SetNormalImageList($hTreeView, $hImage)

_GUICtrlTreeView_BeginUpdate($hTreeView)

Recursion(@AppDataCommonDir,'')

_GUICtrlTreeView_EndUpdate($hTreeView)



GUISetState()
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
While 1 
        $msg = GUIGetMsg()
        If $msg = -3 Then ExitLoop
;~         If $msg = _GUICtrlTreeView_GetChecked($hTreeView,$item1) Then MsgBox(0,1,1)
WEnd
;~ _GUICtrlTreeView_SetChecked($hTreeView,$item1)
;~ Do
;~ Until GUIGetMsg() = -3

Func Recursion($current,$flag)

        If $flag = '' Then        $item1 = _GUICtrlTreeView_Add($hTreeView,0,$current,$hImage,$hImage)
        Local $search = FileFindFirstFile($current & "\*.*")
        
     While 1
               Dim $file = FileFindNextFile($search)
               If @error Or StringLen($file) < 1 Then ExitLoop
                           
               If StringInStr(FileGetAttrib($current & "" & $file), "D") And ($file <> "." Or $file <> "..") Then
                                   If $flag <> '' Then $item1 = $flag
                                   $item2 = _GUICtrlTreeView_AddChild($hTreeView,$item1,$file);,$hImage,$hImage)                
                                        Recursion($current & "" & $file,$item2)
                                Else
                                        If $flag <> '' Then $item1 = $flag
                                   $item3 = _GUICtrlTreeView_AddChild($hTreeView,$item1,$file,$hImage,$hImage)
                           EndIf
     WEnd
Return

EndFunc ;==>Search

Func MY_WM($hWnd, $Msg, $wParam, $lParam)
    Local $tNMHdr   = DllStructCreate($tagNMHDR, $lParam), $tNM_TREEVIEW
    Local $hWndFrom = DllStructGetData($tNMHdr, 'hWndFrom')
    Local $iIDFrom  = DllStructGetData($tNMHdr, 'IDFrom')
    Local $iCode    = DllStructGetData($tNMHdr, 'Code')
 
    If $iIDFrom = $hTreeView Then
        Switch $iCode
                        Case $TVN_SELCHANGEDA, $TVN_SELCHANGEDW
                                
;~                 If GUICtrlRead($hTreeView) > 0 Then _
                    MsgBox(0, 0, 'ID: ' & GUICtrlRead($hTreeView) & @CRLF & 'Text: ' & GUICtrlRead($hTreeView, 1))
        EndSwitch
    EndIf
    
    Return $GUI_RUNDEFMSG
EndFunc   ;==>_OnNotify

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_CLICK ; 控件失去输入焦点
;~                         MsgBox(0,1, 1);_GUICtrlTreeView_GetChecked($hTreeView,$item1))
;~       memowrite("$NM_CLICK" & @LF)
;~       memowrite("-->hWndFrom:" & @TAB & $hWndFrom & @LF)
;~       memowrite("-->IDFrom:" & @TAB & $iIDFrom & @LF)
;~       memowrite("-->Code:" & @TAB & $iCode)
      ; 无返回值
;~      Return 1 ; 非0为不允许默认操作
      Return 0 ; 0 为允许默认操作
    Case $NM_DBLCLK ; 用户在控件内双击鼠标左键
;~       memowrite("$NM_DBLCLK" & @LF)
;~       memowrite("-->hWndFrom:" & @TAB & $hWndFrom & @LF)
;~       memowrite("-->IDFrom:" & @TAB & $iIDFrom & @LF)
;~       memowrite("-->Code:" & @TAB & $iCode)
;~      Return 1 ; 非0为不允许默认操作
      Return 0 ; 0 为允许默认操作
    Case $NM_RCLICK ; 用户在控件内点击鼠标右键
;~       memowrite("$NM_RCLICK" & @LF)
;~       memowrite("-->hWndFrom:" & @TAB & $hWndFrom & @LF)
;~       memowrite("-->IDFrom:" & @TAB & $iIDFrom & @LF)
;~       memowrite("-->Code:" & @TAB & $iCode)
;~      Return 1 ; 非0为不允许默认操作
      Return 0 ; 0 为允许默认操作
    EndSwitch
  EndSwitch
  Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Func memowrite($s_text)
;~   GUICtrlSetData($edit, $s_text & @CRLF, 1)
MsgBox(0,123,$s_text & @CRLF ,5)
EndFunc   ;==>memowrite
发表于 2011-1-1 11:37:48 | 显示全部楼层
遍历所有子选项并勾上
 楼主| 发表于 2011-1-2 11:32:00 | 显示全部楼层
回复 5# auto


    悲剧的是我连父文件夹句柄都搞不定了
发表于 2011-1-2 12:24:23 | 显示全部楼层
楼主,可以参考下我的帖子.
http://www.autoitx.com/thread-20199-1-1.html
 楼主| 发表于 2011-1-2 14:02:35 | 显示全部楼层
回复 7# mo_shaojie


    学习了 谢谢
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-6-8 20:33 , Processed in 0.086558 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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