在一个0.2秒定时器的事件中用双缓冲显示动画,运行一会儿就死机,为什么?
void CM2View::OnTimer(UINT nIDEvent) 
{
         CClientDC dc(this);
CClientDC *pDC1=&dc;

CDC memDC;
CDC *pDC=&memDC; //首先定义一个显示设备对象
    CBitmap MemBitmap;//定义一个位图对象 CRect rect;
    GetClientRect(&rect); //随后建立与屏幕显示兼容的内存显示设备
pDC->CreateCompatibleDC(NULL);
//这时还不能绘图,因为没有地方画
//下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小
MemBitmap.CreateCompatibleBitmap(pDC1,rect.Width(),rect.Height());

//将位图选入到内存显示设备中
//只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上
CBitmap *pOldBit=pDC->SelectObject(&MemBitmap);

//先用背景色将位图清除干净,这里用的是黑色作为背景
pDC->FillSolidRect(0,0,rect.Width(),rect.Height(),RGB(0,0,0));
    CBrush brush;
CBrush * pOldBrush;

CFont gunTongFont,* oldFont;
//创建X轴字体
gunTongFont.CreateFont (30, 0, 0, 0, 300,
FALSE, FALSE, 0, ANSI_CHARSET,
OUT_DEFAULT_PRECIS, 
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, 
DEFAULT_PITCH|FF_SWISS, _T("宋体")) ;
    oldFont = pDC->SelectObject(&gunTongFont);     //此处为画图的代码,画了几个多边形和圆 pDC1->BitBlt(0,0,rect.Width(),rect.Height(),pDC,0,0,SRCCOPY); MemBitmap.DeleteObject();
    memDC.DeleteDC();
pOldBit->DeleteObject();
brush.DeleteObject();
pOldBrush->DeleteObject();
gunTongFont.DeleteObject();
oldFont->DeleteObject();
CView::OnTimer(nIDEvent);
}

解决方案 »

  1.   

    pOldBit->DeleteObject();
    brush.DeleteObject();
    pOldBrush->DeleteObject();
    gunTongFont.DeleteObject();
    oldFont->DeleteObject();
    ==============================
    这些代码的调用都删除。
      

  2.   

    看看有没有GDI资源泄露。你贴出来的以上代码好象没有。
      

  3.   

    pOldBrush->DeleteObject(); 没创建 不能删除
    oldFont->DeleteObject();不要 在MemBitmap.DeleteObject上面换成
    pDC->SelectObject(&oldFont);
      

  4.   

    所有的原Gdi对象都没有重新SelectObject
    你这样会造成原Gdi对象没有释放oldFont = pDC->SelectObject(&gunTongFont);
    ...
    ...
    pDC->SelectObject(oldFont);oldFont指针指向的Font对象泄漏了
      

  5.   

    pDC->CreateCompatibleDC(&dc);
    然后把SelectObject返回的旧对象再SelectObject回去,不要自己delete旧对象。或,弄个memDC然后BitBlt是常见的做法,找个别人的例子看看。