2010-04-09 13:35:56| 分类: DC|Gdi|Gdi+ | 标签: |举报 |字号大中小 订阅
CPaintDC dc(this); // device context for painting
dituDC.CreateCompatibleDC(&dc);//如果这里的参数&dc是NULL,创建的是显示器兼容DC
//dituBitmap.CreateBitmap(ScreenWidth,ScreenHeight,1,32,NULL);
dituBitmap.CreateCompatibleBitmap(&dc,ScreenWidth,ScreenHeight);
//如果不创建与DC兼容的位图,那么它选入DC后,仍然是空的显示为全黑色
dituOld = dituDC.SelectObject(&dituBitmap);
dituItem.CreateCompatibleDC(&dc);
//dituItemBitmap.CreateBitmap(ScreenWidth,ScreenHeight,1,32,NULL);
dituItemBitmap.CreateCompatibleBitmap(&dc,ScreenWidth,ScreenHeight);
_____________________________________________________________________
不应该用到这么多内存DC: 如dituItem,我们保存下来了他以前的位图dituOldItem = dituItem.SelectObject(&dituItemBitmap);但是经过多次绘图或者是其他原因,位图对象dituOldItem已经无效了,最后我们在析构函数恢复DC时: dituItem.SelectObject(dituOldItem);
dituItemBitmap.DeleteObject();
dituDC.DeleteDC();
这里有可能出现错误因为dituOldItem已经无效了,改正方法为去掉删除对象的过程,直接删除DeleteDC!
以后还可以这样改成,不用这么多DC了,仅保存图片信息HENHMETAFILE m_hEmf或者是HBITMAP m_hBm,等需要绘图是直接划到内存DC上九OK了
还有注意:CPaintDC 只用于on
A CPaintDC object can on
评论