[已解决]GuictrlcreateList选中的项目,能否在鼠标点击控件外其他地方后取消选...
本帖最后由 smooth 于 2022-4-7 15:52 编辑GuictrlcreateList选中的项目,能否在鼠标点击控件外其他地方后取消选中状态?能否点击右键出现复制选项?
我这几天把有关的的函数,自定义函数,样式、扩展样式都捋了几遍,然后每天在论坛、百度里查,就是没找到方法。
有懂的大神,麻烦提点一下,哪怕思路也行,谢谢了!
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
Example()
Func Example()
Local $sMESSAGE = "The following buttons have been clicked"
GUICreate("My GUI list") ; will create a dialog box that when displayed is centered
Local $idButton_Add = GUICtrlCreateButton("Add", 64, 32, 75, 25)
Local $idButton_Clear = GUICtrlCreateButton("Clear", 64, 72, 75, 25)
Local $idMylist = GUICtrlCreateList("buttons that have been clicked", 176, 32, 121, 97)
GUICtrlSetLimit(-1, 200) ; to limit horizontal scrolling
GUICtrlSetData(-1, $sMESSAGE)
Local $idButton_Close = GUICtrlCreateButton("my closing button", 64, 160, 175, 25)
GUISetState(@SW_SHOW)
; Loop until the user exits.
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop
Case $idButton_Add
GUICtrlSetData($idMylist, "You clicked button No1|")
Case $idButton_Clear
GUICtrlSetData($idMylist, "")
Case $idButton_Close
MsgBox($MB_SYSTEMMODAL, "", "the closing button has been clicked", 2)
Exit
EndSwitch
WEnd
EndFunc ;==>Example
你说的的这些直接使用 ListView 就行了,干嘛舍近求远用 ListBox…
ListBox 取消可以 _GUICtrlListBox_SetCurSel($hMylist, -1),但你需要判断点击的位置
ListBox 右键菜单 GUICtrlCreateContextMenu($idMylist) 创建就行了 afan 发表于 2022-3-30 22:20
你说的的这些直接使用 ListView 就行了,干嘛舍近求远用 ListBox…
ListBox 取消可以 _GUICtrlListBox_Set ...
我一开始就是用LISTVIEW的,但是LISTVIEW的列宽,不能随着项目的长度增加列宽,预设只能打空格增加25个字符,感觉不太好。 本帖最后由 smooth 于 2022-3-31 14:48 编辑
afan 发表于 2022-3-30 22:20
你说的的这些直接使用 ListView 就行了,干嘛舍近求远用 ListBox…
ListBox 取消可以 _GUICtrlListBox_Set ...
A大,好像不用判断点击位置,同时注册两个消息函数0x0201和0x0111,就可以了。其中:0x0201是点击客户区非控件区域的消息,0x0111是客户区控件的消息。但是我不明白的是,listbox也是一种控件吧,为什么点击它没有消息出来,别的像Button、Label等控件,点击都有消息出来。 WM_COMMAND 当然会有ListBox消息,你可以看看帮助文档 _GUICtrlListBox_Create() 的例子。即便如此,仍需判断点击位置,因为在项目上点击和项目外点击都会有该消息,只要是在该控件客户区范围内。
0x201 是鼠标主按键按下消息,跟你的问题关系不大。 afan 发表于 2022-3-30 22:20
你说的的这些直接使用 ListView 就行了,干嘛舍近求远用 ListBox…
ListBox 取消可以 _GUICtrlListBox_Set ...
A大,请教一下,我想从列表框中,把那些被选中的项目,通过点击右键的方式,然后复制出来。我找了一个下午,能检索选定项目的是_GUICtrlListBox_SetCurSel和_GUICtrlListBox_GetSel这两个函数,但是我发现,他们检索的所谓的选定状态,是通过_GUICtrlListBox_SetSel这个函数来设置的,不是鼠标选定的。这个怎么处理呢? smooth 发表于 2022-3-31 18:23
A大,请教一下,我想从列表框中,把那些被选中的项目,通过点击右键的方式,然后复制出来。我找了一个下 ...
_GUICtrlListBox_GetCurSel afan 发表于 2022-3-31 18:41
_GUICtrlListBox_GetCurSel
不好意思,我忘记上代码了。我今天搞了大半天都没搞成功。
#include <GUIConstantsEx.au3>
#include <GuiListBox.au3>
#include <MsgBoxConstants.au3>
Example()
Func Example()
; Create GUI
GUICreate("List Box Get/Set Sel (v" & @AutoItVersion & ")", 400, 296)
Local $idListBox = GUICtrlCreateList("", 2, 2, 396, 296, BitOR($LBS_STANDARD, $LBS_EXTENDEDSEL))
GUISetState(@SW_SHOW)
; Add strings
_GUICtrlListBox_BeginUpdate($idListBox)
For $iI = 0 To 9
_GUICtrlListBox_AddString($idListBox, StringFormat("%03d : string", $iI))
Next
_GUICtrlListBox_EndUpdate($idListBox)
$idButtoncontext = GUICtrlCreateContextMenu($idListBox)
$idMenuAbout = GUICtrlCreateMenuItem("复制", $idButtoncontext)
Do
$msg = GUIGetMsg()
Switch $msg
Case $idMenuAbout
Local $ListBox_GetText = ""
For $i = 0 To 8
If _GUICtrlListBox_GetCurSel($idListBox) Then
$ListBox_GetText &= _GUICtrlListBox_GetText($idListBox, $i) & @CRLF
EndIf
Next
ClipPut($ListBox_GetText)
EndSwitch
Until GUIGetMsg() = $GUI_EVENT_CLOSE
GUIDelete()
EndFunc ;==>Example
smooth 发表于 2022-3-31 19:21
不好意思,我忘记上代码了。我今天搞了大半天都没搞成功。
你添加了多项选择的样式,_GUICtrlListBox_GetCurSe() 是不支持多项的,帮助里说明了。 多项选择用 _GUICtrlListBox_GetSelItemsText
#include <GuiListBox.au3>
Example()
Func Example()
GUICreate("List Box Get/Set Sel (v" & @AutoItVersion & ")", 400, 296)
Local $idListBox = GUICtrlCreateList("", 2, 2, 396, 296, BitOR($LBS_STANDARD, $LBS_EXTENDEDSEL))
GUISetState(@SW_SHOW)
_GUICtrlListBox_BeginUpdate($idListBox)
For $iI = 0 To 9
_GUICtrlListBox_AddString($idListBox, StringFormat("%03d : string", $iI))
Next
_GUICtrlListBox_EndUpdate($idListBox)
Local $idButtoncontext = GUICtrlCreateContextMenu($idListBox)
Local $idMenuAbout = GUICtrlCreateMenuItem("复制", $idButtoncontext)
Local $msg, $ListBox_GetText, $aText
Do
$msg = GUIGetMsg()
Switch $msg
Case $idMenuAbout
Local $ListBox_GetText = ""
$aText = _GUICtrlListBox_GetSelItemsText($idListBox)
For $i = 1 To $aText
$ListBox_GetText &= $aText[$i] & @CRLF
Next
;~ ClipPut($ListBox_GetText)
MsgBox(0, '', $ListBox_GetText)
EndSwitch
Until $msg = -3
EndFunc ;==>Example afan 发表于 2022-3-31 19:55
你添加了多项选择的样式,_GUICtrlListBox_GetCurSe() 是不支持多项的,帮助里说明了。
不好意思,是我想当然了,以为是选择的都能复制。复制多个项目的,是不是搞不了。 smooth 发表于 2022-3-31 20:10
不好意思,是我想当然了,以为是选择的都能复制。复制多个项目的,是不是搞不了。
你楼上不就是 afan 发表于 2022-3-31 20:22
你楼上不就是
嗯,看到了。防止项目自动排序的样式是$GUI_DOCKAUTO,为了实现多项目选择,我增加了$LBS_STANDARD,和$LBS_EXTENDEDSEL样式,结果就导致$GUI_DOCKAUTO无效。我不想让项目自动排序,这样就搞不成多项目同时选择。
页:
[1]