MFC基础知识(四)——双缓冲解决刷屏时闪烁

本文主要介绍:在利用MFC画图或图像显示时,有时候需要调用OnDraw()函数刷新屏幕,而屏幕往往会发生闪烁,本文主要介绍利用双缓冲解决闪屏问题。

关于闪屏方面的介绍分析见博文:

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不能随便设,因为你设置的大小就是刷新区域的大小,当进行图像放大与缩小时,应该刷新的是整个图像放大缩小后的区域大小,不然会有残留。


  • 5
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值