MFC基础知识(四)——双缓冲解决刷屏时闪烁
2015-03-11 16:34
1016 查看
本文主要介绍:在利用MFC画图或图像显示时,有时候需要调用OnDraw()函数刷新屏幕,而屏幕往往会发生闪烁,本文主要介绍利用双缓冲解决闪屏问题。
关于闪屏方面的介绍分析见博文:
http://blog.csdn.net/longzaitianya1989/article/details/18266899
博文中关于双缓冲实现部分不够详尽,实现过程中可能会出现问题,下面再介绍一下:
1.重载OnEraseBkgnd()函数,OnEraseBkgnd对应消息WM_ERASEBKGND,修改其程序:
2.修改OnDraw()函数:
1.上面两行“///////”线之间的画图与显示中用到的CDC对象,要是memDC不能是pDC;
2.memDC进行绘图,绘图函数参数要为逻辑坐标,逻辑坐标和设备坐标区别见:
http://blog.csdn.net/hong__fang/article/details/44134195
3.上面的nWidth和nHeight不能随便设,因为你设置的大小就是刷新区域的大小,当进行图像放大与缩小时,应该刷新的是整个图像放大缩小后的区域大小,不然会有残留。
关于闪屏方面的介绍分析见博文:
http://blog.csdn.net/longzaitianya1989/article/details/18266899
博文中关于双缓冲实现部分不够详尽,实现过程中可能会出现问题,下面再介绍一下:
1.重载OnEraseBkgnd()函数,OnEraseBkgnd对应消息WM_ERASEBKGND,修改其程序:
BOOL C***View::OnEraseBkgnd(CDC* pDC) { // TODO: 在此添加消息处理程序代码和/或调用默认值 return TRUE; return CScrollView::OnEraseBkgnd(pDC); }必须重载该函数并修改,不然仍会闪屏。
2.修改OnDraw()函数:
CRect ClientRect; GetClientRect(&ClientRect); //获取客户区大小 int nWidth = (nImgWidth*m_fExpand> ClientRect.Width()) ? int(nImgWidth*m_fExpand) : ClientRect.Width(); //此处:宽高取屏幕与滚动条长度的最大值,不然放大缩小时,不能完全刷去上一次的图, //会有残余,nImgWidth nImgHeight 图像的宽与高 m_fExpand对图像放大缩小比例,不缩放则为1 int nHeight = (nImgHeight*m_fExpand> ClientRect.Height()) ? int(nImgHeight*m_fExpand) : ClientRect.Height(); CDC memDC; //定义一个显示设备对象 CBitmap bmp;//定义一个位图对象 memDC.CreateCompatibleDC(pDC); //建立与屏幕显示兼容的内存显示设备 //建立一个与屏幕显示兼容的位图 bmp.CreateCompatibleBitmap(pDC, nWidth,nHeight); memDC.SelectObject(&bmp); //将位图选入到内存显示设备中 //先用背景色将位图清除干净,这里我用的是白色作为背景 memDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255)); ////////////////////////下面添加绘图或图像显示程序/////////////////////////// //通过位图显示图像 ::SetStretchBltMode(memDC.m_hDC,STRETCH_HALFTONE); //设置拉伸方式,避免缩小时失真 ::StretchDIBits(memDC.m_hDC, 0, 0, int(nImgWidth * m_fExpand), int(nImgHeight * m_fExpand),0, 0, nImgWidth, nImgHeight, pDoc->m_pImageData, pDoc->m_pBmInfo, DIB_RGB_COLORS, SRCCOPY) ; //绘图 if(m_AoiShapeList.m_AoiList.GetSize()) m_AoiShapeList.Draw(&memDC,m_fExpand); /////////////////////////////////////////////////////////////////////////////// /将内存中的图拷贝到屏幕上进行显示 pDC->BitBlt(0,0,nWidth,nHeight,&memDC,0,0,SRCCOPY); //绘图完成后的清理 bmp.DeleteObject(); memDC.DeleteDC();注:
1.上面两行“///////”线之间的画图与显示中用到的CDC对象,要是memDC不能是pDC;
2.memDC进行绘图,绘图函数参数要为逻辑坐标,逻辑坐标和设备坐标区别见:
http://blog.csdn.net/hong__fang/article/details/44134195
3.上面的nWidth和nHeight不能随便设,因为你设置的大小就是刷新区域的大小,当进行图像放大与缩小时,应该刷新的是整个图像放大缩小后的区域大小,不然会有残留。
相关文章推荐
- MFC双缓冲解决闪烁问题
- 转帖--MFC双缓冲解决图象闪烁
- MFC双缓冲解决图象闪烁
- MFC中的双缓冲技术(解决绘图闪烁问题)
- MFC下双缓冲解决高速绘制刷新闪烁问题+多媒体定时器
- VC++ MFC+GDIPlus 双缓冲解决闪烁问题
- 转帖--MFC双缓冲解决图象闪烁
- MFC重写OnCtlColor函数造成的文本框文字、闪烁重叠的问题解决办法
- MFC基础知识总结(转)
- BitBlt()双缓冲解决图象闪烁
- mfc基础知识
- CMemDC:在MFC下解决绘图闪烁
- MFC的一些基础知识
- 双缓冲解决界面中图片较多引起的图片闪烁问题
- 用双缓冲进行绘图可解决在VC中绘图时的闪烁现象[ 转]
- MFC基础知识整理
- MFC基础知识总结
- 双缓冲解决绘制图象闪烁问题
- BitBlt()双缓冲解决图象闪烁(转贴)
- 双缓冲加重载onpaint,OnEraseBkgnd解决屏幕闪烁问题