功能需求:
  将一个MSFlexGrid控件列表的显示内容在一个PictureBox上滚动显示。实现方式:
  系统中有一个Timer按照滚动步长向PictureBox上发送用户自定义消息(DRAW_REC),处理该消息时是将MSFlexGrid控件的DC复制到内存DC中,再复制到PictureBox的DC上,复制时将纵向坐标递增一个象素,从而达到滚动的效果。问题:
  严重闪烁。代码(主要是处理DRAW_REC消息的代码):
Public Function PicProc(ByVal hwnd As Long, ByVal wMsg As Long, _
                        ByVal wParam As Long, ByVal lParam As Long) As Long
    
  If hwnd = Form1.Pic.hwnd Then
    If wMsg = DRAW_REC Then
  
      Dim picRc As RECT
      Dim grdRc As RECT
      GetClientRect Form1.ctlGrd.hwnd, grdRc
      GetClientRect Form1.Pic.hwnd, picRc
      
      Dim grdDc As Long
      grdDc = GetDC(Form1.ctlGrd.hwnd)
      Dim picDc As Long
      picDc = GetDC(Form1.Pic.hwnd)
  
      
      Dim memDC As Long
      memDC = CreateCompatibleDC(picDc)
      
      If memDC <> 0 Then
      
        Pos = Pos + 1
      
        Dim srcBitmap As Long
        srcBitmap = CreateCompatibleBitmap(picDc, picRc.Right - picRc.Left, picRc.Bottom - picRc.Top)
        
        SelectObject memDC, srcBitmap
               
  
'        Dim Brush As Long
'        Dim lBrush As LOGBRUSH
'        lBrush.lbColor = vbBlack
'        lBrush.lbHatch = HS_HORIZONTAL
'        lBrush.lbStyle = BS_SOLID
'        Brush = CreateBrushIndirect(lBrush)
'
'        FillRect picDc, picRc, Brush
'
'        DeleteObject Brush
        
        BitBlt memDC, picRc.Left, picRc.Top, picRc.Right - picRc.Left, picRc.Bottom - picRc.Top, _
               grdDc, grdRc.Left, Pos, SRCCOPY
               
        
        
        BitBlt picDc, picRc.Left, picRc.Top, picRc.Right - picRc.Left, picRc.Bottom - picRc.Top, _
               memDC, picRc.Left, picRc.Top, SRCCOPY
                              
      End If
      
      DeleteObject srcBitmap
      DeleteDC memDC
      ReleaseDC Form1.Pic.hwnd, picDc
      ReleaseDC Form1.ctlGrd.hwnd, grdDc    End If
    PicProc = 1
  Else
    PicProc = CallWindowProc(OriPicProc, Form1.Pic.hwnd, wMsg, wParam, lParam)
  End If
End Function

解决方案 »

  1.   

    没来的及看autoredraw=false了吗,全当
      

  2.   

    To flyingscv(zlj):
      PictureBox的autoredraw属性是false啊,你的意思我没太明白。
      

  3.   

    没必要这么复杂MShgrid没有paint事件很遗憾但是scroll,cellchange等事件也是可以用的
    在这些事件里面直接bitblt getdc(grd.hwnd)  pic.hdc就可以啊
      

  4.   

    To nik_Amis:
      不好意思,你可能误解我的意思了,我并不是要Picturebox实时显示Grd控件中的变化。而是要在Picturebox滚动显示Grd中内容。
      

  5.   

    我也感觉没真么复杂啊
    你在timer里直接写看看吧