我用InvalidRect(CRect rc)来刷新区域,但效果不好,明明只刷一小部分,可其他地方也在闪,请问如何解决

解决方案 »

  1.   

    CView::SetRedraw( FALSE );
    do something
    CView::SetRedraw( TRUE );
    InvalidateRect( rc );
    UpdateWindow();
      

  2.   

    对不起,我没太看明白这么写和我用 InvalidateRect( rc );有何区别?就是多了个UpdateWindow?
      

  3.   

    类似联众的麻将牌池,放了很多牌,并且要不停的显示最后一张,在显示最后一张图片时,我调用 InvalidateRect( rc )来实现刷新,其中的rc就是最后一张牌的大小,在OnDraw中有整个牌池的显示,我的意思是,我只要求刷新一牌池中的小部分,为什么整个牌池都在闪?大家看明白了吗?
      

  4.   

    对阿~~ 坑定是画图的地方有问题
    在InvalidateRect(
      HWND hWnd,           // handle to window
      CONST RECT* lpRect,  // rectangle coordinates
      BOOL bErase          // erase state
    )
    的bErase的值  被搞成TRUE了~~   这样系统自个会在onpaint时 先把底图用白色刷了,然后你再刷就会晃眼了~~~  
      至于会闪,肯定是有地方搞错了,搞成重画所有的client了~~~   对了 接管WM_ERASEBKGND了吗~~   这个不接管的话,灵活性就低了
      

  5.   

    我用了另一个方法,现在好些了,就是GetClipBox(rc)然后再ondraw中根据rc判断哪些可以画,哪些不需要画
      

  6.   

    no  no   
    应该在WM_ERASEBKGND的时候 GetClipBox(rc)  根据rc判断哪些可以画,直接就在处理WM_ERASEBKGND消息的函数里画  
      

  7.   

    你在onDraw里画的话,不注意的话还会闪-----因为在onDraw之前,MFC已经在处理WM_ERASEBKGND时把剪裁区的地图抢刷成白色~~ 
    ------------------------------------------------------------------------
     回复人: Rodgu(棒子) ( ) 信誉:100  2003-03-31 12:00:00  得分:0 
    我用了另一个方法,现在好些了,就是GetClipBox(rc)然后再ondraw中根据rc判断哪些可以画,哪些不需要画