找回密码
 加入
搜索
查看: 1084|回复: 12

[AU3基础] [已解决]GuictrlcreateList选中的项目,能否在鼠标点击控件外其他地方后取消选...

[复制链接]
发表于 2022-3-30 21:08:06 | 显示全部楼层 |阅读模式
本帖最后由 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

发表于 2022-3-30 22:20:25 | 显示全部楼层
你说的的这些直接使用 ListView 就行了,干嘛舍近求远用 ListBox…
ListBox 取消可以 _GUICtrlListBox_SetCurSel($hMylist, -1),但你需要判断点击的位置
ListBox 右键菜单 GUICtrlCreateContextMenu($idMylist) 创建就行了
 楼主| 发表于 2022-3-30 22:22:58 | 显示全部楼层
afan 发表于 2022-3-30 22:20
你说的的这些直接使用 ListView 就行了,干嘛舍近求远用 ListBox…
ListBox 取消可以 _GUICtrlListBox_Set ...

我一开始就是用LISTVIEW的,但是LISTVIEW的列宽,不能随着项目的长度增加列宽,预设只能打空格增加25个字符,感觉不太好。
 楼主| 发表于 2022-3-31 14:46:30 | 显示全部楼层
本帖最后由 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等控件,点击都有消息出来。
发表于 2022-3-31 15:13:07 | 显示全部楼层
WM_COMMAND 当然会有ListBox消息,你可以看看帮助文档 _GUICtrlListBox_Create() 的例子。即便如此,仍需判断点击位置,因为在项目上点击和项目外点击都会有该消息,只要是在该控件客户区范围内。
0x201 是鼠标主按键按下消息,跟你的问题关系不大。
 楼主| 发表于 2022-3-31 18:23:52 | 显示全部楼层
afan 发表于 2022-3-30 22:20
你说的的这些直接使用 ListView 就行了,干嘛舍近求远用 ListBox…
ListBox 取消可以 _GUICtrlListBox_Set ...

A大,请教一下,我想从列表框中,把那些被选中的项目,通过点击右键的方式,然后复制出来。我找了一个下午,能检索选定项目的是_GUICtrlListBox_SetCurSel和_GUICtrlListBox_GetSel这两个函数,但是我发现,他们检索的所谓的选定状态,是通过_GUICtrlListBox_SetSel这个函数来设置的,不是鼠标选定的。这个怎么处理呢?
发表于 2022-3-31 18:41:57 | 显示全部楼层
smooth 发表于 2022-3-31 18:23
A大,请教一下,我想从列表框中,把那些被选中的项目,通过点击右键的方式,然后复制出来。我找了一个下 ...

_GUICtrlListBox_GetCurSel
 楼主| 发表于 2022-3-31 19:21:38 | 显示全部楼层
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
发表于 2022-3-31 19:55:48 | 显示全部楼层
smooth 发表于 2022-3-31 19:21
不好意思,我忘记上代码了。我今天搞了大半天都没搞成功。

你添加了多项选择的样式,_GUICtrlListBox_GetCurSe() 是不支持多项的,帮助里说明了。
发表于 2022-3-31 20:09:38 | 显示全部楼层
多项选择用 _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[0]
                                        $ListBox_GetText &= $aText[$i] & @CRLF
                                Next
;~                                 ClipPut($ListBox_GetText)
                                MsgBox(0, '', $ListBox_GetText)
                EndSwitch
        Until $msg = -3
EndFunc   ;==>Example
 楼主| 发表于 2022-3-31 20:10:50 | 显示全部楼层
afan 发表于 2022-3-31 19:55
你添加了多项选择的样式,_GUICtrlListBox_GetCurSe() 是不支持多项的,帮助里说明了。

不好意思,是我想当然了,以为是选择的都能复制。复制多个项目的,是不是搞不了。
发表于 2022-3-31 20:22:50 | 显示全部楼层
smooth 发表于 2022-3-31 20:10
不好意思,是我想当然了,以为是选择的都能复制。复制多个项目的,是不是搞不了。

你楼上不就是
 楼主| 发表于 2022-3-31 22:02:38 | 显示全部楼层

嗯,看到了。防止项目自动排序的样式是$GUI_DOCKAUTO,为了实现多项目选择,我增加了$LBS_STANDARD,和$LBS_EXTENDEDSEL样式,结果就导致$GUI_DOCKAUTO无效。我不想让项目自动排序,这样就搞不成多项目同时选择。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-4 13:36 , Processed in 0.073668 second(s), 19 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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