在一个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);
}
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);
}
解决方案 »
- CSocket 客户端怎么实现断开再重新连接?
- 学习vc 要深入学习数据库吗 还有数据库应该学什么的比较好
- VC MDI和SDI主窗口打开,而不打开子窗口,在程序运行时
- CMarkup类读取XML文件中的数字数据的问题
- 难!难!难!不是高手请勿看!
- 这样的代码为什么连接不上那?
- 如何用 VC 编写这个程序:当程序 SAMPLE 运行时,检测加密狗的密码,如不对,则将程序关闭?
- 内容写入*.INI文件指定位置处,原来此位置处的数据被覆盖,怎么解决啊???!!!
- 如何改变一个BUTTON上的字体的颜色,字体大小
- 关于数据库问题!!
- 如何判断一个线程已经启动?
- 给CMainFrame创建了一个CListBox,却无法操作,??
brush.DeleteObject();
pOldBrush->DeleteObject();
gunTongFont.DeleteObject();
oldFont->DeleteObject();
==============================
这些代码的调用都删除。
oldFont->DeleteObject();不要 在MemBitmap.DeleteObject上面换成
pDC->SelectObject(&oldFont);
你这样会造成原Gdi对象没有释放oldFont = pDC->SelectObject(&gunTongFont);
...
...
pDC->SelectObject(oldFont);oldFont指针指向的Font对象泄漏了
然后把SelectObject返回的旧对象再SelectObject回去,不要自己delete旧对象。或,弄个memDC然后BitBlt是常见的做法,找个别人的例子看看。