怎样禁止用户调整Listview的列宽?
谢谢!

解决方案 »

  1.   

    Private Sub Form_Load()
       Dim li As ListItem
       Dim lCount As Long
      
       With ListView1.ListItems
            For lCount = 1 To 100
                Set li = .Add(, , lCount)
                li.SubItems(1) = lCount
                li.SubItems(2) = lCount
            Next
       End With
       
       glLVDefWindowProc = SetWindowLong(ListView1.hwnd, GWL_WNDPROC, AddressOf LVWindowProc)
        
    End Sub
    Private Sub Form_Unload(Cancel As Integer)
       If glLVDefWindowProc Then
            '结束子类处理
            SetWindowLong ListView1.hwnd, GWL_WNDPROC, glLVDefWindowProc
            glLVDefWindowProc = 0
       End If
    End Sub
    Option Explicit
    Public 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 Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
    Public Declare Function DefWindowProc Lib "user32.dll" Alias "DefWindowProcA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Public Const GWL_WNDPROC = (-4)
    Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal dwLength As Long)
    Public Type NMHDR
       hwndFrom As Long        ' Window handle of control sending message
       idFrom As Long   ' Identifier of control sending message
       code As Long      ' Specifies the notification code
    End Type
    Public Type NMHEADER
        hdr As NMHDR
        iItem As Long
        iButton As Long
        pitem As Long
    End Type
    Public Const WM_NOTIFY& = &H4E
    Public Const HDN_FIRST = -300&
    Public Const HDN_LAST = -399&
    Public Const HDN_ITEMCHANGINGA As Long = HDN_FIRST - 0
    Public Const HDN_ITEMCHANGINGW As Long = HDN_FIRST - 20
    Public Const HDN_ITEMCHANGEDA As Long = HDN_FIRST - 1
    Public Const HDN_ITEMCHANGEDW As Long = HDN_FIRST - 21
    Public Const HDN_ITEMCLICKA As Long = HDN_FIRST - 2
    Public Const HDN_ITEMCLICKW As Long = HDN_FIRST - 22
    Public Const HDN_ITEMDBLCLICKA As Long = HDN_FIRST - 3
    Public Const HDN_ITEMDBLCLICKW As Long = HDN_FIRST - 23
    Public Const HDN_DIVIDERDBLCLICKA As Long = HDN_FIRST - 5
    Public Const HDN_DIVIDERDBLCLICKW As Long = HDN_FIRST - 25
    Public Const HDN_BEGINTRACKA As Long = HDN_FIRST - 6
    Public Const HDN_BEGINTRACKW As Long = HDN_FIRST - 26
    Public Const HDN_ENDTRACKA As Long = HDN_FIRST - 7
    Public Const HDN_ENDTRACKW As Long = HDN_FIRST - 27
    Public Const HDN_TRACKA As Long = HDN_FIRST - 8
    Public Const HDN_TRACKW As Long = HDN_FIRST - 28
    Public Const HDN_GETDISPINFOA As Long = HDN_FIRST - 9
    Public Const HDN_GETDISPINFOW As Long = HDN_FIRST - 29
    Public Const HDN_BEGINDRAG As Long = HDN_FIRST - 10
    Public Const HDN_ENDDRAG As Long = HDN_FIRST - 11
    Public Const HDN_FILTERCHANGE As Long = HDN_FIRST - 12
    Public Const HDN_FILTERBTNCLICK As Long = HDN_FIRST - 13
    Public glLVDefWindowProc As Long
    Public Function LVWindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        Select Case uMsg
        Case WM_NOTIFY
            Dim tHD As NMHDR
            CopyMemory tHD, ByVal lParam, Len(tHD)
            Select Case tHD.code
            Case HDN_BEGINTRACKA, HDN_DIVIDERDBLCLICKA, HDN_BEGINDRAG, HDN_TRACKA
                Debug.Print "1"
                LVWindowProc = 1
                Exit Function
            End Select
        End Select
        LVWindowProc = CallWindowProc(glLVDefWindowProc, hwnd, uMsg, wParam, lParam)
    End Function