双缓冲绘图,画出的都是黑色,自定的画笔没起作用?
代码如下: 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();  

解决方案 »

  1.   

    CPen pen;
    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);
        }
    ....
      

  2.   

    如果要选择画刷:在pen.CreatePen(PS_SOLID,1,RGB(255,0,0));后加上:
    CBrush brush;
    brush.CreateSolidBrush(RGB(255,255,255));
    dcMem.SelectObject(&brush);
      

  3.   

       bmp.CreateCompatibleBitmap(&dcMem,rect.Width(),rect.Height());//创建兼容位图
    改成:
       bmp.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());//创建兼容位图
    另外:
    尽量不要混合用MFC类和API函数,比如在MFC中直接用CPen类代替HPEN。
    选入DC的位图、画笔这些GDI资源,用完后都要选出,否则会存在GDI资源泄漏。
      

  4.   

    这句话错了
    bmp.CreateCompatibleBitmap(&dcMem,rect.Width(),rect.Height());//创建兼容位图
    改为
    bmp.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());//创建兼容位图
    就OK了