您的位置:首页 > 编程语言 > C语言/C++

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

2017-03-20 16:00 429 查看

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

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++ C语言 双缓冲 重绘