我在OnDraw里面加了这样一段代码:
 for(int i=0;i<200;i=i+3)
{
    pDC->Rectangle (&CRect(50+i,50+i,100+i,100+i));
}
然后在CMyView::OnMouseMove里面加了一句Invalidate();
但是这样在鼠标移动的时候会屏幕导致闪烁,我就
把OnDraw里面的代码改成了这样 :
         CDC dc;
  CDC* pDrawDC = pDC;
  CBitmap bitmap;
  CBitmap* pOldBitmap = 0;
 CRect rect;
pDC->GetClipBox(client);
         dc.CreateCompatibleDC(pDC);
         bitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());  
         pOldBitmap = dc.SelectObject(&bitmap);
for(int i=0;i<200;i=i+3)
{
             pDC->Rectangle (&CRect(50+i,50+i,100+i,100+i));
 }
 pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(),
  &dc, 0, 0, SRCCOPY);
可是为什么这样还是会导致闪烁呢,后来我把
 CMyView::PreCreateWindow(CREATESTRUCT& cs)
{
 return CView::PreCreateWindow(cs);
}
改成了这样:
 CMyView::PreCreateWindow(CREATESTRUCT& cs)
{
 if (cs.lpszClass == NULL)
  cs.lpszClass = AfxRegisterWndClass(CS_DBLCLKS);
 return TRUE;
}
这样改了之后闪烁就消失了,可又这是为什么呢。

解决方案 »

  1.   

    pDC->Rectangle (&CRect(50+i,50+i,100+i,100+i));
    -->
              dc.Rectangle (&CRect(50+i,50+i,100+i,100+i));
      

  2.   

    哦,不好意思,上面那个地方本来是dc.Rectangle (&CRect(50+i,50+i,100+i,100+i));是我打错了
      

  3.   

    通过重载PreCreateWindow,你禁止了背景上画刷的使用。要验证这一点,可以不重载PreCreateWindow函数,而是加入消息处理函数CWnd::OnEraseBkgnd,其中不做任何事情,仅仅返回一个非零值。
      

  4.   

    每次鼠标移动都会重新调用PreCreateWindow去重画窗口,当然会闪烁了,
    而下面重载了PreCreateWindow,使它几乎没有什么动作,当然不会出现什么闪烁了
      

  5.   

    你首先应该明白闪烁的原因是你老是调用
    Invalidate();//而不是其他的
    这会导致整个视图重画。你应该计算需要重画的区域,调用InvalidateRect等函数,精确需要重画的区域。你可以看看《深入浅出MFC》,里面好像有一节将如何提高重绘的效率,减少闪烁。