duck904 发表于 2012-8-6 15:30:17

[已解决]列表视图(_GUICtrlListView)可以加入按钮(GUICtrlCreateButton)吗?

本帖最后由 duck904 于 2012-8-8 18:00 编辑

如题:需要做一个列表,在没一行最后放一个按钮[执行]
看了下列表视图,可以有复选框,但是没找到按钮,小白请教。
列表视图中的标题栏上可以加复选框吗?想点下标题栏中的复选框来选中列表中的所有行

yhxhappy 发表于 2012-8-7 00:59:11

什么感觉你说的是ListView呢?
ListView应该是可以加一些其他控件的,但我不会,所以遇到这种列表中添加其他控件的我都用子窗口来做。
再添加一个滚动条,根据行数*行高来计算滚动条滚动范围

duck904 发表于 2012-8-7 15:20:48

打错了,是ListView,谢谢指教

yhxhappy 发表于 2012-8-7 17:31:59

临时写了个,不知道合不合你意#include <ScrollBarConstants.au3>                ;子窗口滚动条使用
#include <GUIScrollBars.au3>                        ;子窗口滚动条使用
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Array.au3>


$fGUI = GUICreate("XXXX", 600, 400)
$AllCheckbox = GUICtrlCreateCheckbox("全选", 25, 30, 50, 16)

GUISetState()

Local $cGUI_W = 550, $cGUI_H = 320
$cGUI = GUICreate("", 550, 320, 25, 50, $WS_BORDER+$WS_CHILD, "", $fGUI)

Local $Y = 0, $D = 32                ;Y=每一行的Y坐标,D=行高
Local $ButtonArray
For $i = 1 To 15
        $Checkbox = GUICtrlCreateCheckbox("标题" & $i, 10, $Y+10, 100, 16)
        $Button = GUICtrlCreateButton("按钮" & $i, 480, $Y+5, 50, 22)
        GUICtrlCreateLabel("", 0, $Y+$D, $cGUI_W, 1)                        ;分隔线
                GUICtrlSetBkColor(-1, 0xdcdcdc)
               
        ReDim $ButtonArray
        $ButtonArray = $Button
        $ButtonArray = $Checkbox
       
        $Y += $D
Next
$ButtonArray = UBound($ButtonArray)-1

If $Y > $cGUI_H Then
        _GUIScrollBars_Init($cGUI)                                                                                                ;初始化滚动条
        _GUIScrollBars_SetScrollRange($cGUI, $SB_VERT, 0, Round($Y*0.061, 0))        ;设备垂直滚动条参数,高度
        _GUIScrollBars_ShowScrollBar($cGUI, $SB_HORZ, False)                                        ;设置水平滚动条隐藏
        GUIRegisterMsg($WM_VSCROLL, "_WM_VSCROLL")
EndIf


GUISetState()

While 1
        $Msg = GUIGetMsg()
        Switch $Msg
        Case -3
                Exit
        Case $ButtonArray To $ButtonArray[$ButtonArray]
                MsgBox(0, "", '你按下了 "' & GUICtrlRead($Msg) & '"')
        Case $AllCheckbox
                If GUICtrlRead($AllCheckbox) = 1 Then
                        $State = $GUI_CHECKED
                Else
                        $State = $GUI_UNCHECKED
                EndIf
                For $x = 1 To $ButtonArray
                        GUICtrlSetState($ButtonArray[$x], $State)
                Next
        EndSwitch
WEnd


Func _WM_VSCROLL($hWnd, $Msg, $wParam, $lParam)                                ;刷新滚动条
        Local $nScrollCode = BitAND($wParam, 0x0000FFFF)
        Local $index = -1, $yChar, $yPos
        Local $Min, $Max, $Page, $Pos, $TrackPos

        For $x = 0 To UBound($aSB_WindowInfo) - 1
                If $aSB_WindowInfo[$x] = $hWnd Then
                        $index = $x
                        $yChar = $aSB_WindowInfo[$index]
                        ExitLoop
                EndIf
        Next
        If $index = -1 Then Return 0

        Local $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_VERT)
        $Min = DllStructGetData($tSCROLLINFO, "nMin")
        $Max = DllStructGetData($tSCROLLINFO, "nMax")
        $Page = DllStructGetData($tSCROLLINFO, "nPage")
        $yPos = DllStructGetData($tSCROLLINFO, "nPos")
        $Pos = $yPos
        $TrackPos = DllStructGetData($tSCROLLINFO, "nTrackPos")

        Switch $nScrollCode
                Case $SB_TOP
                        DllStructSetData($tSCROLLINFO, "nPos", $Min)
                Case $SB_BOTTOM
                        DllStructSetData($tSCROLLINFO, "nPos", $Max)
                Case $SB_LINEUP
                        DllStructSetData($tSCROLLINFO, "nPos", $Pos - 1)
                Case $SB_LINEDOWN
                        DllStructSetData($tSCROLLINFO, "nPos", $Pos + 1)
                Case $SB_PAGEUP
                        DllStructSetData($tSCROLLINFO, "nPos", $Pos - $Page)
                Case $SB_PAGEDOWN
                        DllStructSetData($tSCROLLINFO, "nPos", $Pos + $Page)
                Case $SB_THUMBTRACK
                        DllStructSetData($tSCROLLINFO, "nPos", $TrackPos)
        EndSwitch

        DllStructSetData($tSCROLLINFO, "fMask", $SIF_POS)
        _GUIScrollBars_SetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)
        _GUIScrollBars_GetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)
        $Pos = DllStructGetData($tSCROLLINFO, "nPos")

        If ($Pos <> $yPos) Then
                _GUIScrollBars_ScrollWindow($hWnd, 0, $yChar * ($yPos - $Pos))
                $yPos = $Pos
        EndIf

        Return $GUI_RUNDEFMSG
EndFunc

duck904 发表于 2012-8-7 18:22:30

谢谢楼上大虾的代码,不过自己写样子太难看了,还是想用ListView

bnuzjm 发表于 2013-8-1 07:32:24

标记一下,以后用得上

boliang 发表于 2013-8-9 23:36:50

回复 6# duck904

同样的问题,我也不知道怎么加上按钮的,楼主,你搞定没,分享下

boliang 发表于 2013-8-9 23:37:24

回复 6# duck904

同样的问题,我也不知道怎么加上按钮的,楼主,你搞定没,分享下

boliang 发表于 2013-8-9 23:37:46

回复 1# duck904

同样的问题,我也不知道怎么加上按钮的,楼主,你搞定没,分享下

kuku645 发表于 2013-8-28 17:06:50

同样的问题,我也不知道怎么加上按钮的,楼主,你搞定没,分享下

alaws 发表于 2015-7-20 02:21:07

虽然达不到标题要的效果,但4楼分享的代码还是值得学习的,谢谢!
页: [1]
查看完整版本: [已解决]列表视图(_GUICtrlListView)可以加入按钮(GUICtrlCreateButton)吗?