找回密码
 加入
搜索
查看: 11584|回复: 24

[GUI管理] Listview中添加下拉框

 火.. [复制链接]
发表于 2012-5-14 15:26:21 | 显示全部楼层 |阅读模式
似乎没法实现,不知有没其他方法实现类似的效果。
网上有找到DataGrid添加ComboBox的方法,,不过AU3也没有DataGrid控件
发表于 2012-5-18 10:10:58 | 显示全部楼层
本帖最后由 netegg 于 2012-5-22 11:19 编辑

[au3]#include <Constants.au3>
#include <GUIConstantsEx.au3>
#include <GUIComboBox.au3>
#include <GUIListView.au3>
#include <WindowsConstants.au3>
Opt('GUIOnEventMode', 1)

Dim $hGUI = GUICreate('Test', 300, 200)

Dim $ListView = GUICtrlCreateListView('A|B|C', 0, 0, 300, 200, $LVS_NOSORTHEADER)
Dim $hListView = GUICtrlGetHandle($ListView)
Dim $hHeader = _GUICtrlListView_GetHeader($hListView)
Dim $hComboBox = _GUICtrlComboBox_Create($hListView, 'A|B|C|D', 0, 0)

Dim $hProc = DllCallbackRegister('_ListViewHandler', 'lresult', 'hwnd;uint;wparam;lparam')
Dim $pProc = DllCallbackGetPtr($hProc)
Dim $hListViewProc = _WinAPI_SetWindowLong($hListView, $GWL_WNDPROC, $pProc)

Dim $iItem = -1, $iSubitem = -1

_WinAPI_ShowWindow($hComboBox, @SW_HIDE)
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_DOUBLEBUFFER, $LVS_EX_GRIDLINES))
_GUICtrlListView_SetColumnWidth($hListView, 0, 100)
_GUICtrlListView_SetColumnWidth($hListView, 1, 100)
_GUICtrlListView_SetColumnWidth($hListView, 2, 100)

_GUICtrlListView_BeginUpdate($hListView)
For $i = 1 To 10
    Local $iItem = _GUICtrlListView_AddItem($hListView, $i)
        _GUICtrlListView_AddSubItem($hListView, $iItem, '', 1)
        _GUICtrlListView_AddSubItem($hListView, $iItem, '', 2)
Next
_GUICtrlListView_EndUpdate($hListView)

GUISetOnEvent($GUI_EVENT_CLOSE, '_Close')
GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
GUISetState()

While 1
    Sleep(10)
WEnd

Func _Close()
    GUIDelete()
    DllCallbackFree($hProc)
    Exit
EndFunc

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $tNM = DllStructCreate($tagNMHDR, $ilParam)
    Local $aSubHitTest
    Local $aRect
   
    Switch DllStructGetData($tNM, 'hWndFrom')
        Case $hListView
            If DllStructGetData($tNM, 'Code') = $LVN_HOTTRACK Then
                $aSubHitTest = _GUICtrlListView_SubItemHitTest($hListView)
                If $aSubHitTest[1] > 0 Then

                    $aRect = _GUICtrlListView_GetSubItemRect($hListView, $aSubHitTest[0], $aSubHitTest[1])
                    _GUICtrlListView_SetItemText($hListView, $iItem, _GUICtrlComboBox_GetEditText($hComboBox), $iSubitem)
                    _WinAPI_ShowWindow($hComboBox, @SW_HIDE)
                    _WinAPI_MoveWindow($hComboBox, $aRect[0], $aRect[1], 100, 120)
                   _GUICtrlComboBox_SetCurSel($hComboBox, _GUICtrlComboBox_FindString($hComboBox, _GUICtrlListView_getItemText($hListView, $aSubHitTest[0], $aSubHitTest[1])))
                    _WinAPI_ShowWindow($hComboBox)
                    $iItem = $aSubHitTest[0]
                    $iSubitem = $aSubHitTest[1]
                Else
                    _WinAPI_ShowWindow($hComboBox, @SW_HIDE)
                EndIf
            EndIf
            
        Case $hHeader
            Switch DllStructGetData($tNM, 'Code')
                Case $HDN_BEGINTRACK, $HDN_BEGINTRACKW
                    Return 1
            EndSwitch
    EndSwitch

    Return $GUI_RUNDEFMSG
EndFunc

Func _ListViewHandler($hWnd, $iMsg, $iwParam, $ilParam)
    Local $aRect
   
    Switch $iMsg
        Case $WM_HSCROLL, $WS_VSCROLL
            If BitAND(_WinAPI_GetWindowLong($hComboBox, $GWL_STYLE), $WS_VISIBLE) Then
                $aRect = _GUICtrlListView_GetSubItemRect($hListView, $iItem, $iSubitem)
                _WinAPI_MoveWindow($hComboBox, $aRect[0], $aRect[1], 100, 120)
            EndIf
    EndSwitch
    Return _WinAPI_CallWindowProc($hListViewProc, $hWnd, $iMsg, $iwParam, $ilParam)
EndFunc[/au3]
嗯,改成$LVN_HOTTRACK比$nm_click好多了

点评

大佬好棒!  发表于 2020-2-19 23:30
发表于 2012-5-14 15:43:16 | 显示全部楼层
可以利用 菜单  的方法,鼠标移至这列时,菜单出现.

list自带的方法不知道有没有.
 楼主| 发表于 2012-5-14 16:09:54 | 显示全部楼层
只要是为了显示数据,不是选择操作,所以用菜单不直观
发表于 2012-5-14 16:50:46 | 显示全部楼层
似乎没法实现,不知有没其他方法实现类似的效果。
网上有找到DataGrid添加ComboBox的方法,,不过AU3也没有 ...
cxm23 发表于 2012-5-14 15:26



    这种, 可以截获当点或双击Listview的Item时,就产生一个临时的Combo,当用户选了Combo里的值时,就把这个值赋予那个Item,然后就删除这个Combo,这样就可以实现这种效果了

当然也可以生成个Context菜单,当单击LV里的某个Item时,就在适当的位置显示这个右键菜单。
发表于 2012-5-14 17:41:40 | 显示全部楼层
回复 4# happytc

应该是第一种
创建场景另做个界面只放combo就行了
发表于 2012-5-14 22:09:39 | 显示全部楼层
回复 1# cxm23


    不知道
GUICtrlCreateDummy ( )
行不?
发表于 2012-5-14 22:14:59 | 显示全部楼层
回复  cxm23


    不知道
GUICtrlCreateDummy ( )
行不?
楼上风云 发表于 2012-5-14 22:09


怎么用这个达到楼主的目的?实在想不出来
发表于 2012-5-14 23:37:32 | 显示全部楼层
看来没有回答了
我来抛个砖头,一定要引来玉女呀

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <Misc.au3>

Global $fClick = False
Global $aLVClickInfo, $hTmpCombo = 0
Global $Dll = DllOpen("user32.dll")
Global $hGUI, $hListView, $sText, $hTmpCombo, $aLVRectInfo

Opt("GUICloseOnESC", 0)
Opt("MustDeclareVars", 1)
CreateGui()

Func CreateGui()
        $hGUI = GUICreate("Test", 300, 200)
        $hListView = _GUICtrlListView_Create($hGUI, "Col 0|Col 1|Col 2", 10, 10, 250, 200)
        _GUICtrlListView_AddItem($hListView, "Item AA",0)
        _GUICtrlListView_AddSubItem($hListView, 0, "Item AB", 1)
        _GUICtrlListView_AddSubItem($hListView, 0, "Item AC", 2)
        _GUICtrlListView_AddItem($hListView, "Item BA", 1)
        _GUICtrlListView_AddItem($hListView, "Item CA", 2)
        _GUICtrlListView_AddItem($hListView, "Item DA", 3)

        GUISetState(@SW_SHOW, $hGUI)
        GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

        While True
                Switch GUIGetMsg()
                        Case $GUI_EVENT_CLOSE                                
                                ExitLoop
                EndSwitch

                If $hTmpCombo Then
                        If _IsPressed("0D", $Dll) Then
                                $sText = GUICtrlRead($hTmpCombo)
                                _GUICtrlListView_SetItemText($hListView, $aLVClickInfo[0], $sText, $aLVClickInfo[1])
                                GUICtrlDelete($hTmpCombo)
                                $hTmpCombo = 0
                                GUICtrlSetState($hListView, $GUI_ENABLE)
                        EndIf

                        If _IsPressed("1B", $Dll) Then
                                GUICtrlDelete($hTmpCombo)
                                $hTmpCombo = 0
                                GUICtrlSetState($hListView, $GUI_ENABLE)
                        EndIf
                EndIf

                If $fClick Then
                        $fClick = False

                        GUICtrlDelete($hTmpCombo)
                        Switch $aLVClickInfo[1]
                                Case 0
                                        $aLVRectInfo = _GUICtrlListView_GetItemRect($hListView, $aLVClickInfo[0], 2)
                                Case Else
                                        $aLVRectInfo = _GUICtrlListView_GetSubItemRect($hListView, $aLVClickInfo[0], $aLVClickInfo[1])
                        EndSwitch

                        $hTmpCombo = GUICtrlCreateCombo("", $aLVRectInfo[0] + 10, $aLVRectInfo[1] + 10, 100, $aLVRectInfo[3] - $aLVRectInfo[1])
                        GUICtrlSetData($hTmpCombo, "male|female|ladyboy")
                        GUICtrlSetState($hListView, $GUI_DISABLE)
                        GUICtrlSetState($hTmpCombo, BitOR($GUI_FOCUS, $GUI_ONTOP))
                EndIf
        WEnd
        DllClose($Dll)
        GUIDelete($hGUI)
EndFunc

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    If $hTmpCombo Then Return $GUI_RUNDEFMSG
    Local $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    If HWnd(DllStructGetData($tNMHDR, "hWndFrom")) = $hListView And DllStructGetData($tNMHDR, "Code") = $NM_CLICK Then
        $aLVClickInfo = _GUICtrlListView_SubItemHitTest($hListView)
        If $aLVClickInfo[0] <> -1 Then $fClick = True
    EndIf
    Return $GUI_RUNDEFMSG
EndFunc
发表于 2012-5-15 07:53:03 | 显示全部楼层
本帖最后由 netegg 于 2012-5-15 07:54 编辑

回复 1# cxm23

grid可以用table来做,不过lz这种更像是listview
 楼主| 发表于 2012-5-15 09:25:37 | 显示全部楼层
回复 9# netegg

table是什么?
发表于 2012-5-15 09:38:25 | 显示全部楼层
本帖最后由 netegg 于 2012-5-15 09:40 编辑

回复 10# cxm23

表,也就是和你所说的grid更接近的一个玩意
 楼主| 发表于 2012-5-15 10:09:17 | 显示全部楼层
回复 11# netegg

AU3有这个控件吗?
发表于 2012-5-15 10:10:38 | 显示全部楼层
回复 12# cxm23
没,官方有个自制的
 楼主| 发表于 2012-5-15 11:04:59 | 显示全部楼层
http://www.autoitscript.com/foru ... able__fromsearch__1

找到了,不过似乎不是我想要的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2012-5-15 21:16:11 | 显示全部楼层
回复 14# cxm23


    这个倒是蛮漂亮的!谢谢分享
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-11 13:10 , Processed in 0.092670 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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