VC双缓冲绘图小记
在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测试------------
通过上面的方法大体可以实现双缓冲的绘图,不过如果一幅图过大的话(比如我读取了一个4M的jpg图片),在变动窗口大小的时候会出现卡的现象,也就是有点假死的感觉。如果各位看官有什么好方法,请留言告知一声,谢谢。
要不要在专业点啊~
估计就这样了,专业不了了
看不懂 啊,哈哈
哈哈,这个是我们苦逼的专业而已~
哈哈 不错不错
没看懂····
嗯,这个如果不学c++的话,就路过就行
这个还是蛮重要的,我现在就遇到了这些
嗯,不过感觉这个方法还有问题
高版本的VC里面有CMemDC, 直接用,就可以忽略双缓冲的细节了[face:daxiao]
嗯,谢谢啦,又写了一篇
刚刚开始学习C,飘过..........
你们不会也学C++吧
现在还在学C,C++应该也是必修的吧。
看来你也要学c++了,不过感觉c和c++没有太大区别
[face:han]压力好大……看不懂……
闻道有先后,术业有专攻
看不懂,好专业啊
用时自然会懂~
学习了,谢谢分享