列表框如何单击某项选中(高亮),再单击该项取消选中[已解决]
本帖最后由 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键时可以实现如题效果。
怎样才能单纯通过鼠标单击实现呢?
另外还发现一个问题,鼠标单击列表框的空白处也会产生选中消息....
也就是:
怎样判断鼠标点击的位置在列表框的空白处(不在列表项上)?
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 谢谢A大,对Au3太精通了,这问题对你太小儿科.....
{:1_224:} 不错支持一下 一直记不住也看不懂消息函数,只知道机械性使用
{:1_201:}
还有个小问题,鼠标点击列表框的空白处,只要在列表框区域内,每点一次都会产生数据,如何过滤掉非列表项位置的点击返回值呢?光标位置判断?是不是有哪个我没看懂的自定义函数..... 本帖最后由 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
afan 发表于 2019-8-20 10:36
ListBox 比 ListView 简单很多,所以没有那么多丰富的消息、处理函数
跟我的猜的差不多,果然要用到光标函数和我看不懂的自定义函数....效果杠杠的,A大威武!感谢...
{:1_285:} afan 发表于 2019-8-19 23:02
不错支持一下
页:
[1]