1。不要在Show中调用SetScrollSize,他会引起刷新;
2。犯不着再GetDC(),OnDraw里的DC传过去不就行了吗?

解决方案 »

  1.   

    to wjf;怎样才能不刷新?
    我也觉得奇怪,好象不能在OnDraw或OnPaint中加入改变CScrollView的size,它会引起很强烈的闪烁,倒是在别的地方改动就可以了.
      

  2.   

    不懂,为什么你的Show一定要放在OnDraw,在你需要显示的时候用GetDC()在Show不可以吗?
      

  3.   

    在响应WM_PAINT时,调用诸如SetScrollSize之类的函数,又会引发invalidate,产生一个WM_PAINT闪烁不强烈才怪!
      

  4.   

    我认为真正的原因在于,你没有重载CScrollView::OnErase
    应该自己来处理NCBKERASE的消息,而不应该由CScrollView来处理.
    因为每次ON_Paint都产生NCBKERASE消息,而默认的处理方式
    我认为应该是(我没有看到源码)
    BOOL CYourView::OnErase(CDC *pDC)
    {
      //默认是这句
      return (CScrollView::OnErase);
    }事实上最终调用的可能是
       
    CRect rect;
       GetClientRect(&rect);
       rect.left=0;
       rect.top=0;
       return (pDC->FillSolidRect(&rect,RGB(255,255,255)));//就是白色了
       //也正是这几句影响很大
     
    因此只要自己接管背景的重绘就能很大程度地改善闪烁问题
      

  5.   

    不要每次OnDraw时对bmiHeader进行初始化,你的.....可能还有其他的读PICTURE的语句吧。
    把它放到初始化的初始化的函数中。
      

  6.   

    用 GetClipBox() 取得真正需要画的区域。
      

  7.   

    To:gameboy999/vcmfc/wjf
        我同意!
    To:dusj
        这是一个performance可以改进的地方,但和提出的问题无关。
    To:ab
        "取得真正需要画的区域"应该用GetUpdateRect().