如何实现两个mshflexgrid表格水平滚动时能够联动呀?
有两个表格,一上一下,上面是明细表,下面是合计表,只放一行合计数据,我想实现当明细表水平滚动时,合计行表格也可以同步滚动,不知如何实现才好,谢谢了。

解决方案 »

  1.   

    用Timer控件定时改变合计行表格的各个列宽,让它的各个列宽与明细表的各个列宽一致
      

  2.   

    用子类:
    模块:
    Option Explicit'以下程式在module1.bas
    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 Long
    Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongPublic Const GWL_WNDPROC = (-4)
    Public Const WM_MOUSEMOVE = &H200
    Public Const WM_RBUTTONDOWN = &H204
    Private Const WM_HSCROLL = &H114
    Public preWinProc As LongPublic Function wndproc(ByVal hwnd As Long, ByVal Msg As Long, _
                            ByVal wParam As Long, ByVal lParam As Long) As Long
    If Msg = WM_HSCROLL Then
        '这里注意一定要写全:窗体名.要联动的MSHFlexGrid控件名.hwnd
        SendMessage Form1.MSHFlexGrid2.hwnd, WM_HSCROLL, wParam, ByVal lParam
    End If
    '將之送往原來的Window Procedure
    wndproc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)
    End Function'窗体,两个MSHFlexGrid控件(MSHFlexGrid1和MSHFlexGrid2)
    Option ExplicitPrivate Sub Form_Load()
        Dim ret As Long
        preWinProc = GetWindowLong(MSHFlexGrid1.hwnd, GWL_WNDPROC)
        ret = SetWindowLong(MSHFlexGrid1.hwnd, GWL_WNDPROC, AddressOf wndproc)
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        Dim ret As Long
        ret = SetWindowLong(MSHFlexGrid1.hwnd, GWL_WNDPROC, preWinProc)
    End Sub
      

  3.   

    '作用:MSFlexGrid2同步MSFlexGrid1运动(同时改变列宽、水平垂直滚动)
    'Form1上放 MSFlexGrid1 、MSFlexGrid2、 Timer1
    '复制下列代码,即可验证
    '--------------------------------------------
    '声明全局变量
    Dim blMove As Boolean  '列宽改变标志
    Dim iColWidth() As Integer '存放MSFlexGrid1列宽数组Private Sub Form_Load()
      blMove = False '开始时当然没移动了
      MSFlexGrid1.Cols = 15
      MSFlexGrid1.Rows = 100
      MSFlexGrid2.Cols = 15
      MSFlexGrid2.Rows = 100
      MSFlexGrid1.ScrollTrack = True '数据同时滚动
      MSFlexGrid2.ScrollTrack = True
      ReDim iColWidth(MSFlexGrid1.Cols) '根据实际列宽重新定义记录数组的大小
      ReDim bColVisible(MSFlexGrid1.Cols) '根据实际列宽重新定义数组的大小
      
        For i = 0 To MSFlexGrid1.Cols - 1
            iColWidth(i) = MSFlexGrid1.ColWidth(i)
        Next
      For i = 0 To MSFlexGrid1.Rows - 1
        For j = 0 To MSFlexGrid1.Cols - 1
          MSFlexGrid1.TextMatrix(i, j) = i & "," & j
          MSFlexGrid2.TextMatrix(i, j) = i & "," & j
        Next j
      Next i
      Timer1.Enabled = True
      Timer1.Interval = 100
    End SubPrivate Sub MSFlexGrid1_Scroll()
        MSFlexGrid1.Row = MSFlexGrid1.TopRow
        MSFlexGrid1.Col = MSFlexGrid1.LeftCol
        MSFlexGrid2.TopRow = MSFlexGrid1.TopRow
        MSFlexGrid2.LeftCol = MSFlexGrid1.LeftCol
    End SubPrivate Sub Timer1_Timer()
      Call CheckWidth '检查是否列宽改变了
      If blMove Then '如果改变了
        For i = 0 To MSFlexGrid1.Cols - 1
          MSFlexGrid2.ColWidth(i) = MSFlexGrid1.ColWidth(i)
        Next
      End If
     '重新记录列宽
     For i = 0 To MSFlexGrid1.Cols - 1
        iColWidth(i) = MSFlexGrid1.ColWidth(i)
     Next
     blMove = False
    End Sub Sub CheckWidth() '检查是否列宽改变了
        For i = 0 To MSFlexGrid1.Cols - 1
            If MSFlexGrid1.ColWidth(i) <> iColWidth(i) Then
                 blMove = True
                 Exit For
            End If
        Next
    End Sub
      

  4.   

    呵呵,不需要API的,奥妙在这里
    Private Sub MSHFlexGrid1_Scroll()
        MSHFlexGrid1.Row = MSHFlexGrid1.TopRow
        MSHFlexGrid1.Col = MSHFlexGrid1.LeftCol
        MSHFlexGrid2.TopRow = MSHFlexGrid1.TopRow
        MSHFlexGrid2.LeftCol = MSHFlexGrid1.LeftCol
    End Sub
      

  5.   

    呵呵,不需要API的,奥妙在这里
    Private Sub MSHFlexGrid1_Scroll()
        MSHFlexGrid1.Row = MSHFlexGrid1.TopRow
        MSHFlexGrid1.Col = MSHFlexGrid1.LeftCol
        MSHFlexGrid2.TopRow = MSHFlexGrid1.TopRow
        MSHFlexGrid2.LeftCol = MSHFlexGrid1.LeftCol
    End Sub
      

  6.   

    谢谢ok999ok(ok999ok)
    可是你的代码的试了不行呀?没有反应。不好意思问一下,你的代码测试了吗?
      

  7.   

    当然测试过了!
    你引用的是MSHFlexGrid1?你注意我引用的是MSFlexGrid1(用法完全一样)只是名称不一样
      

  8.   

    '再贴一次吧.... 你真的要加强学习了
    '作用:MSFlexGrid2同步MSFlexGrid1运动(同时改变列宽、水平垂直滚动)
    'Form1上放 MSFlexGrid1 、MSFlexGrid2、 Timer1
    '复制下列代码,即可验证
    '--------------------------------------------
    '声明全局变量
    Dim blMove As Boolean '列宽改变标志
    Dim iColWidth() As Integer '存放MSFlexGrid1列宽数组Private Sub Form_Load()
    blMove = False '开始时当然没移动了
    MSFlexGrid1.Cols = 15
    MSFlexGrid1.Rows = 100
    MSFlexGrid2.Cols = 15
    MSFlexGrid2.Rows = 100
    MSFlexGrid1.ScrollTrack = True '数据同时滚动
    MSFlexGrid2.ScrollTrack = True
    ReDim iColWidth(MSFlexGrid1.Cols) '根据实际列宽重新定义记录数组的大小
    ReDim bColVisible(MSFlexGrid1.Cols) '根据实际列宽重新定义数组的大小For i = 0 To MSFlexGrid1.Cols - 1
    iColWidth(i) = MSFlexGrid1.ColWidth(i)
    Next
    For i = 0 To MSFlexGrid1.Rows - 1
    For j = 0 To MSFlexGrid1.Cols - 1
    MSFlexGrid1.TextMatrix(i, j) = i & "," & j
    MSFlexGrid2.TextMatrix(i, j) = i & "," & j
    Next j
    Next i
    Timer1.Enabled = True
    Timer1.Interval = 100
    End SubPrivate Sub MSFlexGrid1_Scroll()
    MSFlexGrid1.Row = MSFlexGrid1.TopRow
    MSFlexGrid1.Col = MSFlexGrid1.LeftCol
    MSFlexGrid2.TopRow = MSFlexGrid1.TopRow
    MSFlexGrid2.LeftCol = MSFlexGrid1.LeftCol
    End SubPrivate Sub Timer1_Timer()
    Call CheckWidth '检查是否列宽改变了
    If blMove Then '如果改变了
    For i = 0 To MSFlexGrid1.Cols - 1
    MSFlexGrid2.ColWidth(i) = MSFlexGrid1.ColWidth(i)
    Next
    End If
    '重新记录列宽
    For i = 0 To MSFlexGrid1.Cols - 1
    iColWidth(i) = MSFlexGrid1.ColWidth(i)
    Next
    blMove = False
    End SubSub CheckWidth() '检查是否列宽改变了
    For i = 0 To MSFlexGrid1.Cols - 1
    If MSFlexGrid1.ColWidth(i) <> iColWidth(i) Then
    blMove = True
    Exit For
    End If
    Next
    End Sub