基于双缓冲技术解决视图刷新重绘闪烁问题

基于双缓冲技术解决视图刷新重绘闪烁问题

1.基本原理

普通视图绘制完成后直接在显示器窗口中显示,所以出现闪烁的现象。双缓冲技术,简单来说就是创建一块虚拟的内存区来存储画布,而显示器中只显示实际显示缓冲区的画布。

如下图所示:

基于双缓冲技术解决视图刷新重绘闪烁问题_第1张图片

2.基本步骤

1)在OnTimer中刷新或者其他地方执行刷新动作时,视图会进行重绘。

2)在OnPaint中添加代码:

void CTranLightView::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	// TODO: Add your message handler code here

	/*
	双缓冲技术解决屏幕刷新闪烁问题
	*/

	// 获取窗口客户区
    CRect rect;
    GetClientRect(&rect);
    //用于缓冲作图的内存DC
    CDC dcMem;         
    //内存中承载临时图象的位图
    CBitmap bmp; 
    //依附窗口DC创建兼容内存DC       
    dcMem.CreateCompatibleDC(&dc);    
    //创建兼容位图
    bmp.CreateCompatibleBitmap(&dc,rect.Width(),rect.Height());  
    //将位图选择进内存DC        
    CBitmap *pOldBmp = dcMem.SelectObject(&bmp);  

    // 绘制图形
    OnDraw(&dcMem);

    // 将内存DC上的图象拷贝到前台
    dc.BitBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,SRCCOPY);

    dcMem.SelectObject(pOldBmp);
    DeleteObject(&bmp);     // 删除位图
    dcMem.DeleteDC();       // 删除DC
    DeleteObject(pOldBmp); // 删除备份位图

	// Do not call CView::OnPaint() for painting messages
}

3)在OnEraseBkGround中重载:

BOOL CTranLightView::OnEraseBkgnd(CDC* pDC) 
{
	// TODO: Add your message handler code here and/or call default
	//OnDraw(this->GetDC());
	//创建黑色视图背景
	//CRect rectClient;
	//GetClientRect(rectClient);
	//pDC->FillSolidRect(rectClient,RGB(0,0,0));

	return TRUE;

	//return CView::OnEraseBkgnd(pDC);
}


你可能感兴趣的:(C++程序设计)