smooth 发表于 2022-3-30 21:08:06

[已解决]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


afan 发表于 2022-3-30 22:20:25

你说的的这些直接使用 ListView 就行了,干嘛舍近求远用 ListBox…
ListBox 取消可以 _GUICtrlListBox_SetCurSel($hMylist, -1),但你需要判断点击的位置
ListBox 右键菜单 GUICtrlCreateContextMenu($idMylist) 创建就行了

smooth 发表于 2022-3-30 22:22:58

afan 发表于 2022-3-30 22:20
你说的的这些直接使用 ListView 就行了,干嘛舍近求远用 ListBox…
ListBox 取消可以 _GUICtrlListBox_Set ...

我一开始就是用LISTVIEW的,但是LISTVIEW的列宽,不能随着项目的长度增加列宽,预设只能打空格增加25个字符,感觉不太好。

smooth 发表于 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等控件,点击都有消息出来。

afan 发表于 2022-3-31 15:13:07

WM_COMMAND 当然会有ListBox消息,你可以看看帮助文档 _GUICtrlListBox_Create() 的例子。即便如此,仍需判断点击位置,因为在项目上点击和项目外点击都会有该消息,只要是在该控件客户区范围内。
0x201 是鼠标主按键按下消息,跟你的问题关系不大。

smooth 发表于 2022-3-31 18:23:52

afan 发表于 2022-3-30 22:20
你说的的这些直接使用 ListView 就行了,干嘛舍近求远用 ListBox…
ListBox 取消可以 _GUICtrlListBox_Set ...
A大,请教一下,我想从列表框中,把那些被选中的项目,通过点击右键的方式,然后复制出来。我找了一个下午,能检索选定项目的是_GUICtrlListBox_SetCurSel和_GUICtrlListBox_GetSel这两个函数,但是我发现,他们检索的所谓的选定状态,是通过_GUICtrlListBox_SetSel这个函数来设置的,不是鼠标选定的。这个怎么处理呢?

afan 发表于 2022-3-31 18:41:57

smooth 发表于 2022-3-31 18:23
A大,请教一下,我想从列表框中,把那些被选中的项目,通过点击右键的方式,然后复制出来。我找了一个下 ...

_GUICtrlListBox_GetCurSel

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

afan 发表于 2022-3-31 19:55:48

smooth 发表于 2022-3-31 19:21
不好意思,我忘记上代码了。我今天搞了大半天都没搞成功。

你添加了多项选择的样式,_GUICtrlListBox_GetCurSe() 是不支持多项的,帮助里说明了。

afan 发表于 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
                                        $ListBox_GetText &= $aText[$i] & @CRLF
                                Next
;~                                 ClipPut($ListBox_GetText)
                                MsgBox(0, '', $ListBox_GetText)
                EndSwitch
        Until $msg = -3
EndFunc   ;==>Example

smooth 发表于 2022-3-31 20:10:50

afan 发表于 2022-3-31 19:55
你添加了多项选择的样式,_GUICtrlListBox_GetCurSe() 是不支持多项的,帮助里说明了。

不好意思,是我想当然了,以为是选择的都能复制。复制多个项目的,是不是搞不了。

afan 发表于 2022-3-31 20:22:50

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

你楼上不就是

smooth 发表于 2022-3-31 22:02:38

afan 发表于 2022-3-31 20:22
你楼上不就是
嗯,看到了。防止项目自动排序的样式是$GUI_DOCKAUTO,为了实现多项目选择,我增加了$LBS_STANDARD,和$LBS_EXTENDEDSEL样式,结果就导致$GUI_DOCKAUTO无效。我不想让项目自动排序,这样就搞不成多项目同时选择。
页: [1]
查看完整版本: [已解决]GuictrlcreateList选中的项目,能否在鼠标点击控件外其他地方后取消选...