MSHFlexGrid中没有直接捕获“列宽被改变”的事件。
可以先保存各列宽,在MSHFlexGrid1_MouseUp事件中进行判断!!

解决方案 »

  1.   

    zgjchina1(还俗和尚.COM)的办法好象不行,
    刚试了一下,在RESIZE列宽的时候,MOUSEUP事件根本不被触发。我想只能考虑用API,想办法传一个回调函数进去,也许能解决。
      

  2.   

    因为我不知道网格有多少列,不希望使用REDIM数组,有没有其他简单的办法?
    而且每次MouseUp都判断的话,会不会影响其他的响应速度?
      

  3.   

    MOUSEUP在这里根本不可用,你想在这里用也没门啊
    还跟速度有什么关系?
      

  4.   

    可以用API来捕捉事件,如果需要我可以把代码贴出来
      

  5.   

    如果引用了API会引起系统不稳定的话,就不必了。
      

  6.   

    to:hfamwu(小溪) 
    你有代码吗 能不能给我一点 我给分
      

  7.   

    我把代码帖出来 ,这是我做的一个小例子。
    并请大家再看看这个贴子,解决了继续加分http://www.csdn.net/expert/topic/281/281297.shtmForm1中的代码:
    form1中加两个mshflexgrid控件,name为fg(0),fg(1),加五个按钮Option ExplicitPrivate hwnd5 As Long
    Private hwnd0 As LongPrivate Sub Form_Load()
        Dim ret As Long
        Dim ret1 As Long
        hwnd0 = fg(0).hwnd
        hwnd5 = fg(1).hwnd
        
        Command1_Click
        preWinProc = GetWindowLong(hwnd5, GWL_WNDPROC)
        ret = SetWindowLong(hwnd5, GWL_WNDPROC, AddressOf FlexWndProc)
        intFlag = 0
        intCount = fg(0).Cols
        
        preWinProc1 = GetWindowLong(hwnd0, GWL_WNDPROC)
        ret1 = SetWindowLong(hwnd0, GWL_WNDPROC, AddressOf FlexWndProc0)
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        Dim ret As Long
        Dim ret1 As Long
        '取消Message的截取,而使之又只送往原来的Window Procedure
        ret = SetWindowLong(hwnd5, GWL_WNDPROC, preWinProc)
        ret1 = SetWindowLong(hwnd0, GWL_WNDPROC, preWinProc1)
    End SubPrivate Sub Command1_Click()
        Dim i, intCount As Integer
        Dim strCaption As String
        
        fg(0).Redraw = False
        For i = 0 To fg(0).Cols - 1
            fg(0).Row = 0
            fg(0).Col = i
            strCaption = fg(0).Text
            fg(0).Row = 1
            fg(0).Text = strCaption
            fg(0).ColAlignmentFixed(i) = flexAlignCenterCenter
            fg(0).MergeCol(i) = True
        Next i
        fg(0).Row = 0
        fg(0).Col = 1
        fg(0).Text = "col1"
        fg(0).Col = 2
        fg(0).Text = "col1"
        fg(0).Col = 3
        fg(0).Text = "col1"
        fg(0).Col = 5
        fg(0).Text = "col2"
        fg(0).Col = 6
        fg(0).Text = "col2"
        fg(0).Col = 7
        fg(0).Text = "col2"
        
        fg(0).RowHeight(1) = 480
        
        fg(0).MergeCells = flexMergeFree
        fg(0).MergeRow(0) = True
        
        fg(0).Redraw = True
    End SubPrivate Sub Command2_Click()
        fg(0).Col = 1
        fg(0).Row = 0
        MsgBox fg(0).Text
        MsgBox CStr(fg(0).RowHeight(0))
        MsgBox CStr(fg(0).ColWidth(1))
        fg(0).Col = 1
        fg(0).Row = 1
        MsgBox fg(0).Text
        MsgBox CStr(fg(0).RowHeight(1))
        MsgBox CStr(fg(0).ColWidth(1))
    End SubPrivate Sub Command5_Click()
        Form2.Show vbModal, Me
    End SubPrivate Sub Command3_Click()
        Dim i  As Long, j As Long
        With fg(1)
            For i = 1 To 2
                For j = 1 To 10
                    .TextMatrix(i - 1, j - 1) = "1_1"
                Next j
            Next i
            For i = 3 To 10
                For j = 1 To 10
                    .TextMatrix(i - 1, j - 1) = i & "_" & j
                Next j
            Next i
        End With
    End SubPrivate Sub Command4_Click()
        With fg(1)
            .MergeCells = 1
            .MergeRow(1) = True
            .MergeRow(0) = True
        End With
    End SubModule中的代码:Option ExplicitDeclare Function SendMessage Lib "user32" Alias "SendMessageA" _
        (ByVal hwnd As Long, ByVal Msg As Long, _
        ByVal wParam As Long, ByVal lParam As Long) As LongDeclare Function EnumChildWindows Lib "user32" _
       (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, _
       ByVal lParam As Long) As Long
    Declare Function GetClassName Lib "user32" Alias "GetClassNameA" _
           (ByVal hwnd As Long, ByVal lpClassName As String, _
            ByVal nMaxCount As Long) As Long
    Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
      (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
      (ByVal hwnd As Long, ByVal nIndex As Long) As Long
    Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
      (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, _
       ByVal wParam As Long, ByVal lParam As Long) As LongPublic Const GWL_WNDPROC = (-4)
    Public Const WM_MOUSEMOVE = &H200
    Public Const WM_RBUTTONDOWN = &H204
    Public Const WM_HSCROLL = &H114
    Public Const WM_VSCROLL = &H115Public Const WM_WINDOWPOSCHANGED = &H47
    Public Const WM_WINDOWPOSCHANGING = &H46
    Public Const WM_NCCALCSIZE = &H83
    Public Const WM_NCPAINT = &H85
    Public Const WM_ERASEBKGND = &H14
    Public Const WM_SIZE = &H5Public preWinProc As Long
    Public preWinProc1 As Long
    Private hEditWnd As Long
    Private hScrollWnd As Long
    Public intCount As Integer
    Public intFlag As Integer
    Private i As IntegerPublic Function FlexWndProc0(ByVal hwnd As Long, ByVal Msg As Long, _
                             ByVal wParam As Long, ByVal lParam As Long) As Long
        Select Case Msg
            Case WM_WINDOWPOSCHANGING
                If intFlag = 12 Then
                    intFlag = 0
                    With Form1
                        For i = 0 To intCount - 1
                            .fg(1).ColWidth(i) = .fg(0).ColWidth(i)
                        Next i
                    End With
                ElseIf intFlag = 10 Then
                    intFlag = 12
                Else
                    intFlag = 10
                End If
        End Select
        FlexWndProc0 = CallWindowProc(preWinProc1, hwnd, Msg, wParam, lParam)
     End FunctionPublic Function FlexWndProc(ByVal hwnd As Long, ByVal Msg As Long, _
                             ByVal wParam As Long, ByVal lParam As Long) As Long
        Select Case Msg
            Case WM_HSCROLL
                SendMessage Form1.fg(0).hwnd, WM_HSCROLL, wParam, lParam
    '        Case WM_VSCROLL
    '            Debug.Print "MSHFlexGrid Mouse VScroll Down "
    '            SendMessage Form1.fg(0).hwnd, WM_VSCROLL, wParam, lParam
    '        Case WM_RBUTTONDOWN
    '            Debug.Print "MSHFlexGrid Mouse RButton Down "
    '        Case Else
            '将之送往原来的Window Procedure
        End Select
        FlexWndProc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)
     End Function
      

  8.   

    分给你了。不过这段代码对我没有用。
    为了一个拖动而引用到windows消息不是我希望的。
      

  9.   

    我通常是用Timer控件来处理,在事件中比较当前列宽与原始值。
    虽然方法不太标准,但处理起来比较简单有效。
      

  10.   

    VsFlex中有一个colwidthchange事件
      

  11.   

    使用VsFlex会引起发行的版权问题,谢谢关注。
      

  12.   

    你是不是用TEXTBOX编辑MSHFlexGrid?如果是的话,在TEXTBOX的失去焦点的事件中加入代码。