找回密码
 加入
搜索
查看: 14074|回复: 19

[效率算法] 关于统计_GUICtrlListView_GetSelectedCount问题[已解决]

  [复制链接]
发表于 2012-11-17 08:26:34 | 显示全部楼层 |阅读模式
本帖最后由 blue_dvd 于 2012-11-18 22:50 编辑

想要效果
主要是统计用户点击选择了多少个项目?
代码如下
#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>
GUICreate("ListView Click Item", 400, 300)
$hListView = GUICtrlCreateListView("", 2, 2, 394, 268, "", $LVS_EX_FULLROWSELECT+$LVS_EX_CHECKBOXES)
        _GUICtrlListView_InsertColumn($hListView, 0, "Column 1", 200)
        _GUICtrlListView_InsertColumn($hListView, 0, "Column 2", 150)

$hLabel = GUICtrlCreateLabel("已选定0个item", 2, 275, 394, 15)

GUISetState()


For $i = 1 To 20
        GUICtrlCreateListViewItem("Row "&$i&": Col 1", $hListView)
Next

GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY') ;注册侦测用户是否选择


While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                Exit
   
                        
        EndSwitch
    WEnd

        GUIDelete()


Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
        #forceref $hWnd, $iMsg, $iwParam
        Local $tNMHDR, $hWndFrom, $iCode
   
        $hWndListView = $hListView
        If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($HListView)

        $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)  ; $tagNMHDR - Contains information about a notification message
        $hWndFrom = DllStructGetData($tNMHDR, 'hWndFrom')
        $iCode = DllStructGetData($tNMHDR, 'Code')

        Switch $hWndFrom
                Case $hWndListView
                        Switch $iCode
                              Case $NM_CLICK 
                       Local    $aHit = _GUICtrlListView_HitTest($hListView)  
                    If $aHit[0]<>-1 And _GUICtrlListView_GetItemChecked($hListView,$aHit[0])=True  Then               
                                  _GUICtrlListView_SetItemChecked($hListView,$aHit[0])
                                                                 _GUICtrlListView_SetItemSelected($hListView, $aHit[0],True)
                                                        
                                        ElseIf $aHit[0]<>-1 And _GUICtrlListView_GetItemChecked($hListView,$aHit[0])=False  Then           
                                    _GUICtrlListView_SetItemChecked($hListView,$aHit[0],False)
                                                          _GUICtrlListView_SetItemSelected($hListView, $aHit[0],False)
                                         EndIf         
                        
                                   GUICtrlSetData($hLabel, "共选定项目为"&_GUICtrlListView_GetSelectedCount($hListView))

                        EndSwitch
            EndSwitch


EndFunc
总会出错,不知道什原因?代码比较幼稚,请各位不要笑的太厉害!
解决方法在8楼!

本帖子中包含更多资源

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

×
发表于 2012-11-17 09:52:42 | 显示全部楼层
看不懂什么意思
发表于 2012-11-17 11:20:52 | 显示全部楼层
出错的地方原因是你48行后用的Id“$hListView”,而非句柄“$hWndListView”
处理这类问题,建议使用P版的“ListView UDF - ListView消息扩展”
http://www.autoitx.com/forum.php?mod=viewthread&tid=13175
发表于 2012-11-18 17:45:42 | 显示全部楼层
lz这个问题有点毛病,selectcount是获取选定项的计数,不是复选项的计数
发表于 2012-11-18 17:57:38 | 显示全部楼层
回复 1# blue_dvd
[au3]#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>
#include <ListviewConstants.au3>

GUICreate("ListView Click Item", 400, 300)
$hListView = GUICtrlCreateListView("", 2, 2, 394, 268, BitAND($GUI_SS_DEFAULT_LISTVIEW ,BitNOT($LVS_SINGLESEL)))
$hListView = GUICtrlGetHandle($hListView)
_GUICtrlListView_SetExtendedListViewStyle($hListView, $LVS_EX_FULLROWSELECT + $LVS_EX_CHECKBOXES )
_GUICtrlListView_InsertColumn($hListView, 0, "Column 2", 200)
_GUICtrlListView_InsertColumn($hListView, 0, "Column 1", 150)

$hLabel = GUICtrlCreateLabel("已选定0个item", 2, 275, 394, 15)

GUISetState()


For $i = 1 To 20
        _GUICtrlListView_addItem($hListView, "Row " & $i & ": Col 1")
Next

GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY') ;注册侦测用户是否选择


While 1
        Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                        Exit


        EndSwitch
WEnd

GUIDelete()


Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
        #forceref $hWnd, $iMsg, $iwParam
        Local $tNMHDR, $hWndFrom, $iCode, $countitem = ''

        $hWndListView = $hListView
        If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)

        $tNMHDR = DllStructCreate($tagNMHDR, $ilParam) ; $tagNMHDR - Contains information about a notification message
        $hWndFrom = DllStructGetData($tNMHDR, 'hWndFrom')
        $iCode = DllStructGetData($tNMHDR, 'Code')

        Switch $hWndFrom
                Case $hWndListView
                        Switch $iCode
                                Case $NM_CLICK
                                        Local $aHit = _GUICtrlListView_HitTest($hListView)
                                        If $aHit[4] Then
                                                If _GUICtrlListView_GetItemChecked($hListView, $aHit[0]) Then
                                                        _GUICtrlListView_SetItemSelected($hListView, $aHit[0], False)
                                                Else
                                                        _GUICtrlListView_SetItemSelected($hListView, $aHit[0])
                                                EndIf
                                        EndIf

                                        GUICtrlSetData($hLabel, "共选定项目为" & _GUICtrlListView_GetSelectedCount($hListView))

                        EndSwitch
        EndSwitch


EndFunc   ;==>WM_NOTIFY[/au3]
 楼主| 发表于 2012-11-18 17:57:49 | 显示全部楼层
回复 4# netegg
有没有统计复选项计数的函数?
发表于 2012-11-18 18:01:26 | 显示全部楼层
本帖最后由 netegg 于 2012-11-18 18:17 编辑

回复 6# blue_dvd
如果还是单选定(选定和复选不是一个意思)的话,不用函数,判断里设置个累加(累减)的变量就行了
发表于 2012-11-18 18:11:19 | 显示全部楼层
本帖最后由 netegg 于 2012-11-18 18:13 编辑

这是单选的例子
[au3]#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>
#include <ListviewConstants.au3>
Global  $count=0
GUICreate("ListView Click Item", 400, 300)
$hListView = GUICtrlCreateListView("", 2, 2, 394, 268)
$hListView = GUICtrlGetHandle($hListView)
_GUICtrlListView_SetExtendedListViewStyle($hListView, $LVS_EX_FULLROWSELECT + $LVS_EX_CHECKBOXES )
_GUICtrlListView_InsertColumn($hListView, 0, "Column 2", 200)
_GUICtrlListView_InsertColumn($hListView, 0, "Column 1", 150)

$hLabel = GUICtrlCreateLabel("已选定0个item", 2, 275, 394, 15)

GUISetState()


For $i = 1 To 20
        _GUICtrlListView_addItem($hListView, "Row " & $i & ": Col 1")
Next

For $i = 0 To _GUICtrlListView_GetItemCount($hListView)
    If _GUICtrlListView_GetItemChecked($hListView, $i) Then
      $count += 1
    EndIf
Next


GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY') ;注册侦测用户是否选择


While 1
        Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                        Exit


        EndSwitch
WEnd

GUIDelete()


Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
        #forceref $hWnd, $iMsg, $iwParam
        Local $tNMHDR, $hWndFrom, $iCode

        $hWndListView = $hListView
        If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)

        $tNMHDR = DllStructCreate($tagNMHDR, $ilParam) ; $tagNMHDR - Contains information about a notification message
        $hWndFrom = DllStructGetData($tNMHDR, 'hWndFrom')
        $iCode = DllStructGetData($tNMHDR, 'Code')
        Switch $hWndFrom
                Case $hWndListView
                        Switch $iCode
                                Case $NM_CLICK
                                        Local $aHit = _GUICtrlListView_HitTest($hListView)
                                        If $aHit[4] Then
                                                If _GUICtrlListView_GetItemChecked($hListView, $aHit[0]) Then
                                                        ;_GUICtrlListView_SetItemSelected($hListView, $aHit[0], False)
                                                        $count -= 1
                                                Else
                                                        ;_GUICtrlListView_SetItemSelected($hListView, $aHit[0])
                                                        $count += 1
                                                EndIf
                                        EndIf

                                        GUICtrlSetData($hLabel, "共选定项目为" & $count)

                        EndSwitch
        EndSwitch


EndFunc   ;==>WM_NOTIFY[/au3]
 楼主| 发表于 2012-11-18 22:03:13 | 显示全部楼层
回复 8# netegg
多谢了,此为正解也!不过我如果双击项目发现没有选中,但$count却累加了!
发表于 2012-11-18 22:09:40 | 显示全部楼层
本帖最后由 netegg 于 2012-11-18 22:20 编辑

回复 9# blue_dvd
双击的话,消息是不一样的,需要另加一个双击处理才能得到正确的结果
[au3]
.......
case $nm_dblclk
    return 1
.......
[/au3]
 楼主| 发表于 2012-11-18 22:21:28 | 显示全部楼层
回复 5# netegg
还有一个问题:变量$aHit[4]是放什么数据的?查看函数HitTest发现了一堆英文!
[0] - Zero based index of the item at the specified position, or -1
[1] - If True, position is in control's client window but not on an item
[2] - If True, position is over item icon
[3] - If True, position is over item text
[4] - If True, position is over item state image
[5] - If True, position is somewhere on the item
[6] - If True, position is above the control's client area
[7] - If True, position is below the control's client area
[8] - If True, position is to the left of the client area
[9] - If True, position is to the right of the client area
求解释!
 楼主| 发表于 2012-11-18 22:30:58 | 显示全部楼层
本帖最后由 blue_dvd 于 2012-11-18 22:33 编辑

回复 10# netegg
.......
case $nm_dblclk
    return 1
.......
    
这段代码加到case $nm_Click后面不行
是不是要在声明一个函数才行?
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
        #forceref $hWnd, $iMsg, $iwParam

        Local $tNMHDR, $hWndFrom, $iCode
        $hWndListView = $hListView


        If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)
        $tNMHDR = DllStructCreate($tagNMHDR, $ilParam) ; $tagNMHDR - Contains information about a notification message
        $hWndFrom = DllStructGetData($tNMHDR, 'hWndFrom')
        $iCode = DllStructGetData($tNMHDR, 'Code')


        Switch $hWndFrom
                Case $hWndListView
                        Switch $iCode
                                case $nm_dblclk
                                             return 1
                                              EndSwitch
        EndSwitch

EndFunc   ;==>WM_NOTIFY
发表于 2012-11-18 22:35:29 | 显示全部楼层
[4]是状态图像
case $nm_dbclk放到setdata下面
发表于 2012-11-18 22:40:53 | 显示全部楼层
回复 11# blue_dvd
http://www.autoitx.com/thread-7404-1-1.html英文的问题
 楼主| 发表于 2012-11-18 22:49:27 | 显示全部楼层
一切都解决了,再次感谢netegg大神!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-18 04:20 , Processed in 0.092517 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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