闻心阁

一蓑烟雨看苍生,半壶浊酒笑红尘

VC双缓冲绘图小记

2011-10-28 约 3 分钟读完 搬砖秘籍

在VC下绘图,在放大缩小的时候会引起重绘(废话),但是最近用VC读了一幅图片文件,在我变动窗口大小的时候,视图区域一直闪烁。为了解决这个问题,学了一下双缓冲绘图。

双缓冲绘图的原理不难理解,就是先把图绘制在内存里,然后把整个内存的图像直接复制到视图区域即可。

步骤一屏蔽背景刷新。

背景刷新其实是在响应WM_ERASEBKGND消息。我们在
视类中添加对这个消息的响应,可以看到缺省的代码如下:
BOOL CMYView::OnEraseBkgnd(CDC* pDC)
{
//return CView::OnEraseBkgnd(pDC);
return TRUE;
}

步骤二缓冲绘图

//---------测试双缓存---------
		CDC dcMem; //用于缓冲作图的内存DC 
	CBitmap bmp; //内存中承载临时图象的位图 

	dcMem.CreateCompatibleDC(pDC); //依附窗口DC创建兼容内存DC 

	bmp.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());//创建兼容位图 

	dcMem.SelectObject(&bmp); //将位图选择进内存DC 

	//按原来背景填充客户区,不然会是黑色 

	dcMem.FillSolidRect(rect,pDC->GetBkColor()); 

	pPicture->Render(dcMem.m_hDC,0,0,rect.Width(),rect.Height(), 
		0,nHeight,nWidth,-nHeight,NULL);

	pDC->BitBlt(0,0,rect.Width(),rect.Height(), 

		&dcMem,0,0,SRCCOPY);//将内存DC上的图象拷贝到前台 

	dcMem.DeleteDC(); //删除DC

	//---------end测试------------</pre>

通过上面的方法大体可以实现双缓冲的绘图,不过如果一幅图过大的话(比如我读取了一个4M的jpg图片),在变动窗口大小的时候会出现卡的现象,也就是有点假死的感觉。如果各位看官有什么好方法,请留言告知一声,谢谢。

19 条评论

  1. MurphyL
    要不要在专业点啊~
    1. Sailor 博主
      估计就这样了,专业不了了
  2. 搁浅
    看不懂 啊,哈哈
    1. Sailor 博主
      哈哈,这个是我们苦逼的专业而已~
  3. 孤单键盘
    哈哈 不错不错





    没看懂····
    1. Sailor 博主
      嗯,这个如果不学c++的话,就路过就行
  4. walfred
    这个还是蛮重要的,我现在就遇到了这些
    1. Sailor 博主
      嗯,不过感觉这个方法还有问题
  5. C瓜哥
    高版本的VC里面有CMemDC, 直接用,就可以忽略双缓冲的细节了😄
    1. Sailor 博主
      嗯,谢谢啦,又写了一篇
  6. 乱了感觉
    刚刚开始学习C,飘过..........
    1. Sailor 博主
      你们不会也学C++吧
    2. 乱了感觉 回复 @Sailor
      现在还在学C,C++应该也是必修的吧。
    3. Sailor 博主 回复 @乱了感觉
      看来你也要学c++了,不过感觉c和c++没有太大区别
  7. 梦飞
    😓压力好大……看不懂……
    1. Sailor 博主
      闻道有先后,术业有专攻
  8. 七七
    看不懂,好专业啊
    1. Sailor 博主
      用时自然会懂~
  9. Kala
    学习了,谢谢分享
VC双缓冲绘图小记2 ADO编程多步OLE DB 操作产生错误