class myView :public CView{} public: ........ private: ........ CBitmap* m_pOldBitmap; //第一步:添加新成员 CBitmap m_MemBitmap; //声明内存中承载临时图象的位图 CDC m_MemDC; //声明用于缓冲作图的内存DC }; BOOL CChildView::OnEraseBkgnd(CDC* pDC) { //第二步消去背景重绘 // (要先添加此响应消息) // TODO: 在此添加消息处理程序代码和/或调用默认值 //修改此处 return true/*CWnd::OnEraseBkgnd(pDC)*/; } int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CWnd::OnCreate(lpCreateStruct) == -1) return -1; // TODO: 在此添加您专用的创建代码 //第三步 对双缓存环境初始化 //(要先添加此响应消息) x=GetSystemMetrics(SM_CXSCREEN); y=GetSystemMetrics(SM_CYSCREEN); CDC* pDC=GetDC(); m_MemDC.CreateCompatibleDC(pDC); //依附窗口DC创建兼容内存DC m_MemBitmap.CreateCompatibleBitmap(pDC,x,y); //创建兼容位图 m_pOldBitmap=m_MemDC.SelectObject(&m_MemBitmap); //将位图选进内存DC,原位图保存到m_pOldBitmap CBrush brush(RGB(255,255,255)); m_MemDC.FillRect(CRect(0,0,x,y),&brush); //设置客户区背景为白色 ReleaseDC(pDC); return 0; } void CChildView::OnPaint() { CPaintDC dc(this); // 用于绘制的设备上下文 // TODO: 在此处添加消息处理程序代码 CRect rc; GetClientRect(&rc); //双缓存绘图环境 // 第四步 :绘图... m_MemDC.FillSolidRect(0,0,rc.Width(),rc.Height(),RGB(255,255,255)); //draw what you want.......... // 一个简单的测试,普通绘图严重闪屏 for (int i=0;i<500;i+=10){ m_MemDC.Rectangle(i,140,40,180); } dc.BitBlt(0,0,rc.Width(),rc.Height(),&m_MemDC,0,0,SRCCOPY); // 不要为绘制消息而调用 CWnd::OnPaint() }