void CGraphDlg::OnPaint() 
{
CPaintDC dc(this); // device context for painting
CRect rect;
GetWindowRect(&rect);
CDC MemDC;
CBitmap MemBitmap;
MemDC.CreateCompatibleDC(NULL);
MemBitmap.CreateCompatibleBitmap(&dc,rect.Width (),rect.Height ());
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
MemDC.FillSolidRect(0,0,rect.Width (),rect.Height (),RGB(165,209,209));
CPen newPen(PS_SOLID, 1, (COLORREF)0x008c8c8c);
CPen* pOldPen = MemDC.SelectObject(&newPen);
MemDC.MoveTo (0,0);
MemDC.LineTo (100,100);

dc.BitBlt(0,0,rect.Width(),rect.Height(),&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(pOldPen);
MemBitmap.DeleteObject();
MemDC.DeleteDC();
}
是我的双缓冲还有问题吗?

解决方案 »

  1.   

    WM_ERASEBKGND消息直接返回TRUE了没?
    是图形闪还是控件闪?
      

  2.   

    是图形闪。
    我这个对话框怎么没有WM_ERASEBKGND消息呢?
      

  3.   

    我加上还是会闪,怎么回事呢?
    BOOL CGraphDlg::OnEraseBkgnd(CDC* pDC) 
    {
    // TODO: Add your message handler code here and/or call default

    return true;
    }
      

  4.   

    我不怎么懂MFC编程,不知道MFC有没有处理对话框消息的地方,有这个地方的话可以把WM_ERASEBKGND消息加上试试
      

  5.   

    已经找到WM_ERASEBKGND消息了,return true 后还是会闪烁,就是在两个标签页面切换的时候会有闪烁
      

  6.   

    一般只要WM_ERASEBKGND直接返回TRUE,双缓冲代码没问题的话就不会闪了,还闪的话我就不清楚怎么回事了,帮你顶一下吧
      

  7.   

    MemDC.CreateCompatibleDC(&dc); MemDC.SelectObject(pOldBit); //先将位图选出 DC 才删除。
      

  8.   

    把画图的地方放在其他地方 ,然后Invalidate就可以了
      

  9.   


    我也加入了MemDC.SelectObject(pOldBit);这一句,可是还是有闪烁
      

  10.   

    些小的闪烁不是因为你的双缓冲问题,你在你的页面切换的地方将哪个CGraphDlg子窗口显示出来就可以了,你现在没做这个步骤
      

  11.   

    我也出现过这种情况,我的解决办法是不用CPaintDC 直接用CWindowDC 在最后直接ValidateRect()更新
      

  12.   

    这个闪是因为你在切换标签时,倒致了DLG的重绘。你再怎么缓冲,DLG被覆盖的地方还是要重绘。重绘频繁自然会闪了