我有一段代码用来实现双击一个ListView控件时显示文本框在相应位置编辑ListView,但在拖动滚动条时因为无法扑获相应的事件导致不能适时的隐藏文本框,不知有没有什么好办法解决?

解决方案 »

  1.   

    子类处理ListView,然后拦截NC_CLICK之类的消息就好了
      

  2.   

    綠豆,拿一段能運行的代碼如果隱藏某個key,按照key對資料進行編輯可以運用到listview.tag的屬性就可以了
      

  3.   

    '------------------- 模块文件 -------------------
    Option ExplicitPublic Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Public Declare Function SetClassLong Lib "user32" Alias "SetClassLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Public Const GWL_WNDPROC = (-4)
    Public Const GCL_WNDPROC = (-24)Public Const WM_VSCROLL = &H115
    Public Const WM_MOUSEWHEEL = &H20A
    Public Const WHEEL_DELTA = 120
    Public Const WHEEL_PAGESCROLL = 65535
    Public Const WM_NCLBUTTONUP = &HA2
    Public Const WM_NCLBUTTONDOWN = &HA1
    Public Const WM_KEYDOWN = &H100
    Public Const WM_NCCALCSIZE = &H83
    Public glDefWindowProc As LongPublic Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        On Error Resume Next
        
        WindowProc = CallWindowProc(glDefWindowProc, hwnd, uMsg, wParam, lParam)
        Select Case uMsg
            Case WM_VSCROLL, WM_MOUSEWHEEL, WHEEL_PAGESCROLL
                Form1.Text1.Visible = False
        End Select
    End Function'------------------- 窗体 -------------------
    Option ExplicitPrivate Sub Form_Load()
        Dim i As Long
        Dim oItem As ListItem
        
        Dim hwnd As Long
        Call InitExceptionHandler
        
        For i = 1 To 100
            Set oItem = ListView1.ListItems.Add(, , i)
            oItem.SubItems(1) = i
        Next
        
        hwnd = ListView1.hwnd
        
        '子类处理
        glDefWindowProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc)
    End Sub
    Private Sub Form_Unload(Cancel As Integer)
        
       If glDefWindowProc Then
            '结束子类处理
            SetWindowLong ListView1.hwnd, GWL_WNDPROC, glDefWindowProc
            glDefWindowProc = 0
       End If
    End Sub
    Private Sub ListView1_ItemClick(ByVal Item As MSComctlLib.ListItem)
        Text1.Visible = True
        Text1.Move Text1.Left, Item.Top
    End Sub