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

[AU3基础] 列表框如何单击某项选中(高亮),再单击该项取消选中[已解决]

[复制链接]
发表于 2019-8-19 22:06:22 | 显示全部楼层 |阅读模式
本帖最后由 cashiba 于 2019-8-20 19:09 编辑

#include <GUIConstantsEx.au3>
#include "GUIConstants.au3"
#include <GuiListBox.au3>
Dim $Lastselected = ""
GUICreate("")
$test1 = GUICtrlCreateList("", 10, 10, 150, 350, BitOR($LBS_STANDARD, $LBS_EXTENDEDSEL))
GUICtrlSetData($test1, '11111' & @TAB & '22222|33333|44444|55555' & @TAB & '66666')
GUISetState()
While 1
 $Msg = GUIGetMsg()
 Select
  Case $Msg = $GUI_EVENT_CLOSE
   ExitLoop
  Case $Msg = $test1
   $Selected = GUICtrlRead($test1)
   ConsoleWrite("Currently selected: " & $Selected & @CRLF)
 EndSelect
WEnd
Exit

如上按住CTRL键时可以实现如题效果。
怎样才能单纯通过鼠标单击实现呢?

另外还发现一个问题,鼠标单击列表框的空白处也会产生选中消息....
也就是:
怎样判断鼠标点击的位置在列表框的空白处(不在列表项上)?


发表于 2019-8-19 23:02:05 | 显示全部楼层
GUICreate('')
Local $test1 = GUICtrlCreateList("", 10, 10, 150, 350, BitOR(0x00000003, 0x00000800))
GUICtrlSetData($test1, '11111' & @TAB & '22222|33333|44444|55555' & @TAB & '66666')

GUISetState()
Local $ix_now = -1
While 1
        $Msg = GUIGetMsg()
        Select
                Case $Msg = -3
                        ExitLoop

                Case $Msg = $test1
                        $Selected = GUICtrlRead($test1)
                        ConsoleWrite("Currently selected: " & $Selected & @CRLF)
                        $iIndex = GUICtrlSendMsg($test1, 0x0188, 0, 0) ;$LB_GETCURSEL = 0x0188
                        If GUICtrlSendMsg($test1, 0x0187, $iIndex, 0) Then ;$LB_GETSEL = 0x0187
                                If $ix_now <> $iIndex Then
                                        $ix_now = $iIndex
                                Else
                                        GUICtrlSendMsg($test1, 0x0185, False, $iIndex) ;$LB_SETSEL = 0x0185
                                        $ix_now = -1
                                EndIf
                        EndIf

        EndSelect
WEnd

Exit

评分

参与人数 1金钱 +20 收起 理由
cashiba + 20 很给力!

查看全部评分

 楼主| 发表于 2019-8-20 00:08:38 | 显示全部楼层
谢谢A大,对Au3太精通了,这问题对你太小儿科.....
发表于 2019-8-20 00:10:47 | 显示全部楼层
不错支持一下
 楼主| 发表于 2019-8-20 00:16:54 | 显示全部楼层
一直记不住也看不懂消息函数,只知道机械性使用

还有个小问题,鼠标点击列表框的空白处,只要在列表框区域内,每点一次都会产生数据,如何过滤掉非列表项位置的点击返回值呢?光标位置判断?是不是有哪个我没看懂的自定义函数.....
发表于 2019-8-20 10:36:46 | 显示全部楼层
本帖最后由 afan 于 2019-8-20 19:10 编辑
cashiba 发表于 2019-8-20 00:16
一直记不住也看不懂消息函数,只知道机械性使用

还有个小问题,鼠标点击列表框的空白处,只要 ...

ListBox 比 ListView 简单很多,所以没有那么多丰富的消息、处理函数
#include <GuiListBox.au3>

GUICreate('')
Local $test1 = GUICtrlCreateList("", 10, 10, 150, 350, BitOR(0x00000003, 0x00000800))
GUICtrlSetData($test1, '11111' & @TAB & '22222|33333|44444|55555' & @TAB & '66666')

GUISetState()
Local $ix_now = -1
While 1
        $Msg = GUIGetMsg()
        Select
                Case $Msg = -3
                        Exit
                Case $Msg = $test1
                        $iIndex = __GUICtrlListBox_GetClickItem($test1)        ;获取列表当前点击的项目(返回值<0即为非项目)
                        If $iIndex < 0 Then
                                ToolTip('无项目')
                                ContinueLoop
                        EndIf
                        If GUICtrlSendMsg($test1, 0x0187, $iIndex, 0) Then ;$LB_GETSEL = 0x0187
                                If $ix_now <> $iIndex Then
                                        $ix_now = $iIndex
                                        ToolTip('选中: ' & $ix_now)
                                Else
                                        GUICtrlSendMsg($test1, 0x0185, False, $iIndex) ;$LB_SETSEL = 0x0185
                                        $ix_now = -1
                                        ToolTip('取消选中')
                                EndIf
                        EndIf
        EndSelect
WEnd

Func __GUICtrlListBox_GetClickItem($iCTRL)        ;获取列表当前点击的项目(返回值<0即为非项目)
        ;$iCTRL - 控件ID,此函数未作出句柄情况下的处理
        Local $iIndex = _GUICtrlListBox_GetCaretIndex($iCTRL)
        Local $ap = _GUICtrlListBox_GetItemRect($iCTRL, $iIndex)
        Local $aMs = GUIGetCursorInfo()
                If @error Then Return SetError(1)
                If $aMs[4] <> $iCTRL Then Return SetError(1, 0, -2)
        Local $aCPos = ControlGetPos('', '', $iCTRL)
                If @error Then Return SetError(2, 0, -2)
        If $aMs[1] - $aCPos[1] > $ap[3] Then Return SetError(3, 0, -1)
        Return $iIndex
EndFunc   ;==>__GUICtrlListBox_GetClickItem

评分

参与人数 1金钱 +30 收起 理由
cashiba + 30 很给力!

查看全部评分

 楼主| 发表于 2019-8-20 19:08:24 | 显示全部楼层
afan 发表于 2019-8-20 10:36
ListBox 比 ListView 简单很多,所以没有那么多丰富的消息、处理函数

跟我的猜的差不多,果然要用到光标函数和我看不懂的自定义函数....效果杠杠的,A大威武!感谢...
发表于 2019-8-23 17:57:51 | 显示全部楼层

不错支持一下
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-16 09:47 , Processed in 0.076853 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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