双缓冲绘图,画出的都是黑色,自定的画笔没起作用?
代码如下: HPEN _hPen = (HPEN)::CreatePen(PS_SOLID,1,RGB(255,0,0));
HPEN _hOPen = (HPEN)::SelectObject(pDC->m_hDC,_hPen);
CPoint ptCenter;
CRect rect,ellipseRect;
GetClientRect(&rect);
ptCenter = rect.CenterPoint(); CDC dcMem; //用于缓冲作图的内存DC
CBitmap bmp; //内存中承载临时图象的位图
dcMem.CreateCompatibleDC(pDC); //依附窗口DC创建兼容内存DC
bmp.CreateCompatibleBitmap(&dcMem,rect.Width(),rect.Height());//创建兼容位图
dcMem.SelectObject(&bmp); //将位图选择进内存DC
dcMem.FillSolidRect(rect,pDC->GetBkColor());//按原来背景填充客户区,不然会是黑色 HPEN _hOPen1 = (HPEN)::SelectObject(dcMem.m_hDC,_hPen); for(int i=2000;i>0;i--) //在内存DC上做同样的同心圆图象
{
ellipseRect.SetRect(ptCenter,ptCenter);
ellipseRect.InflateRect(i*10,i*10);
dcMem.Ellipse(ellipseRect);
}
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,SRCCOPY);//将内存DC上的图象拷贝到前台
::SelectObject(dcMem.m_hDC,_hOPen1);
::SelectObject(pDC->m_hDC,_hOPen);
::DeleteObject(_hPen);
dcMem.DeleteDC(); //删除DC
bmp.DeleteObject();
代码如下: HPEN _hPen = (HPEN)::CreatePen(PS_SOLID,1,RGB(255,0,0));
HPEN _hOPen = (HPEN)::SelectObject(pDC->m_hDC,_hPen);
CPoint ptCenter;
CRect rect,ellipseRect;
GetClientRect(&rect);
ptCenter = rect.CenterPoint(); CDC dcMem; //用于缓冲作图的内存DC
CBitmap bmp; //内存中承载临时图象的位图
dcMem.CreateCompatibleDC(pDC); //依附窗口DC创建兼容内存DC
bmp.CreateCompatibleBitmap(&dcMem,rect.Width(),rect.Height());//创建兼容位图
dcMem.SelectObject(&bmp); //将位图选择进内存DC
dcMem.FillSolidRect(rect,pDC->GetBkColor());//按原来背景填充客户区,不然会是黑色 HPEN _hOPen1 = (HPEN)::SelectObject(dcMem.m_hDC,_hPen); for(int i=2000;i>0;i--) //在内存DC上做同样的同心圆图象
{
ellipseRect.SetRect(ptCenter,ptCenter);
ellipseRect.InflateRect(i*10,i*10);
dcMem.Ellipse(ellipseRect);
}
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,SRCCOPY);//将内存DC上的图象拷贝到前台
::SelectObject(dcMem.m_hDC,_hOPen1);
::SelectObject(pDC->m_hDC,_hOPen);
::DeleteObject(_hPen);
dcMem.DeleteDC(); //删除DC
bmp.DeleteObject();
pen.CreatePen(PS_SOLID,1,RGB(255,0,0));
dcMem.SelectObject(&pen);
for(int i=2000;i>0;i--) //在内存DC上做同样的同心圆图象
{
ellipseRect.SetRect(ptCenter,ptCenter);
ellipseRect.InflateRect(i*10,i*10);
dcMem.Ellipse(ellipseRect);
}
....
CBrush brush;
brush.CreateSolidBrush(RGB(255,255,255));
dcMem.SelectObject(&brush);
改成:
bmp.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());//创建兼容位图
另外:
尽量不要混合用MFC类和API函数,比如在MFC中直接用CPen类代替HPEN。
选入DC的位图、画笔这些GDI资源,用完后都要选出,否则会存在GDI资源泄漏。
bmp.CreateCompatibleBitmap(&dcMem,rect.Width(),rect.Height());//创建兼容位图
改为
bmp.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());//创建兼容位图
就OK了