cashiba 发表于 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键时可以实现如题效果。
怎样才能单纯通过鼠标单击实现呢?

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


afan 发表于 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

cashiba 发表于 2019-8-20 00:08:38

谢谢A大,对Au3太精通了,这问题对你太小儿科.....
{:1_224:}

tarcy118 发表于 2019-8-20 00:10:47

不错支持一下

cashiba 发表于 2019-8-20 00:16:54

一直记不住也看不懂消息函数,只知道机械性使用
{:1_201:}
还有个小问题,鼠标点击列表框的空白处,只要在列表框区域内,每点一次都会产生数据,如何过滤掉非列表项位置的点击返回值呢?光标位置判断?是不是有哪个我没看懂的自定义函数.....

afan 发表于 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 <> $iCTRL Then Return SetError(1, 0, -2)
      Local $aCPos = ControlGetPos('', '', $iCTRL)
                If @error Then Return SetError(2, 0, -2)
      If $aMs - $aCPos > $ap Then Return SetError(3, 0, -1)
      Return $iIndex
EndFunc   ;==>__GUICtrlListBox_GetClickItem

cashiba 发表于 2019-8-20 19:08:24

afan 发表于 2019-8-20 10:36
ListBox 比 ListView 简单很多,所以没有那么多丰富的消息、处理函数

跟我的猜的差不多,果然要用到光标函数和我看不懂的自定义函数....效果杠杠的,A大威武!感谢...
{:1_285:}

Dontang2018 发表于 2019-8-23 17:57:51

afan 发表于 2019-8-19 23:02


不错支持一下
页: [1]
查看完整版本: 列表框如何单击某项选中(高亮),再单击该项取消选中[已解决]