`

防止窗口闪烁地办法

    博客分类:
  • VC
 
阅读更多

防止窗口闪烁地办法


也许我们都碰到过这种情况,当你想重画某个窗口的时候,或你需要每隔一段时间要进行重画窗口,窗口会不停的闪烁。那么如何消除闪烁呢?借鉴了别人的经验,自己也总结一下,现将总结的几种方法介绍一下,供大家参考。 

1、将Invalidate()替换为InvalidateRect()。 

因为Invalidate()会导致整个窗口的图象重画,需要的时间比较长,而InvalidateRect()仅仅重画Rect区域内的内容,所需时间会少一些。所以替换之后在很大程度上会减少闪烁。如果你确实需要改善闪烁的情况,计算一个Rect所用的时间比起重画那些不需要重画的内容所需要的时间要少得多。 


2、不要让系统擦除你的窗口。 

系统在需要重画窗口的时候会帮你用指定的背景色来擦除窗口。可是,也许需要重画的区域也许非常小。或者,在你重画这些东西之间还要经过大量的计算才能开始。这个时候你可以禁止系统擦掉原来的图象。直到你已经计算好了所有的数据,自己把那些需要擦掉的部分用背景色覆盖掉(如:dc.FillRect(rect,&brush);rect是需要擦除的区域,brush是带背景色的刷子),再画上新的图形。要禁止系统擦除你的窗口,可以重载OnEraseBkgnd()函数,让其直接返回TRUE就可以了。如 

BOOL CMyWin::OnEraseBkgnd(CDC* pDC) 
{ 
	return TRUE; 
	//return CWnd::OnEraseBkgnd(pDC);//把系统原来的这条语句注释掉。 
} 
 

3、有效的进行擦除。 

擦除背景的时候,不要该擦不该擦的地方都擦。比如,你在一个窗口上放了一个很大的Edit框,几乎占了整个窗口,那么你频繁的擦除整个窗口背景将导致Edit不停重画形成剧烈的闪烁。事实上你可以CRgn创建一个需要擦除的区域,只擦除这一部分。如 

GetClientRect(rectClient); 
rgn1.CreateRectRgnIndirect(rectClient); 
rgn2.CreateRectRgnIndirect(m_rectEdit); 
if(rgn1.CombineRgn(&rgn1,&rgn2,RGN_XOR) == ERROR)//处理后的rgn1只包括了Edit框之外的客户区域,这样,Edit将不会被我的背景覆盖而导致重画。 
{ 
	ASSERT(FALSE); 
	return ; 
} 
brush.CreateSolidBrush(m_clrBackgnd); 
pDC->FillRgn(&rgn1,&brush); 
brush.DeleteObject(); 
 

注意:在使用这个方法的时候要同时使用方法二。 


4、使用MemoryDC先在内存里把图画好,再复制到屏幕上。 


这对于一次画图过程很长的情况比较管用。毕竟内存操作比较快,而且复制到屏幕又是一次性的,至少不会出现可以明显看出一个东东从左画到右的情况。 

void CMyWin::OnPaint() 
{ 
	CPaintDC dc1(this); // device context for painting 
	dcMemory.CreateCompatibleDC(&dc1); 
	CBitmap bmp; 
	bmp.CreateCompatibleBitmap(&dc1,rectClient.Width(),rectClient.Height()); 
	dcMemory.SelectObject(&bmp); 

	//接下来你想怎么画就怎么画吧。 
	//dcMemory.FillRect(rectClient,&brush); 

	dc1.BitBlt(0,0,rectClient.Width(),rectClient.Height(),&dcMemory,0,0,SRCCOPY); 
	dcMemory.DeleteDC(); 
	// Do not call CWnd::OnPaint() for painting messages 
} 
 

分享到:
评论

相关推荐

    Halcon刷新图像窗口控件闪烁解决方法.hdev

    Halcon刷新图像窗口控件闪烁两种解决方法。有时候,我们需要在窗口或者控件中显示图像,以及某些region、contour,甚至是交互时才会出现的ROI选择框。 但是随着操作的频繁进行,我们在重绘窗口内容的时候,会出现并...

    Ajax打开新窗口被浏览器拦截的两种解决办法

    浏览器的这种行为主要是为了防止恶意脚本自动打开窗口,从而影响用户的浏览体验。在某些情况下,如在Ajax请求完成之后才尝试打开新窗口,由于请求是异步的,浏览器无法确定用户是否真正触发了这个行为,因此可能将其...

    WinFormsDoubleBuffer.rar

    "闪屏"(Flickering)是其中一个典型问题,表现为窗口或控件在刷新时出现闪烁效果,这不仅影响用户体验,也可能使程序显得卡顿。针对这一问题,`WinFormsDoubleBuffer`提供了有效的解决方案。 首先,我们来理解闪屏...

    注册表修改大全(作者:Sunny)

    但按下述步骤,可以很容易地DEL它们。运行注册表编辑器REGEDIT.EXE,打开 HKEY_LOCAL_MACHINE\SOFTWARE\MICRO-SOFT\WINDOWS\CURRENTVERSION\ EXPLORER\ DESKTOP \NAMESPACE,单击 NameSpace 旁的+号将出现几个数字域...

    商用版本文本编辑器DotNetTextBoxV6.0.8Source 源码

    1)增加防止COOKIE欺骗攻击的加密KEY属性设置,编辑器用到的COOKIE都将会进行加密。 2)更新编辑器帮助文件。 3)文字水印调整为只添加到图像宽高>100像素的图片上面,并且调整编辑器默认配置添加的是图片水印! 2010...

    最新整编的电脑常见问题、故障

    - 解决办法:先完全断开电源,等待约20-30秒后再接通电源,等待10秒后再开机。 #### 七、清除CMOS口令的方法 **问题描述**:忘记CMOS口令。 **解决方案**: 1. 快速短接主板上的“ClearCMOS”跳线。 2. 如果能够...

    ExtAspNet v2.2.1 (2009-4-1) 值得一看

    -为按钮增加DisableControlBeforePostBack属性 - 回发之前是否禁用按钮,防止重复提交 - 默认为true。 -Grid的Values属性访问限制由internal改为public,这就意味这可以自由改变Grid中每个单元格的值了。 -增加...

    ExtAspNet_v2.3.2_dll

    -为按钮增加DisableControlBeforePostBack属性 - 回发之前是否禁用按钮,防止重复提交 - 默认为true。 -Grid的Values属性访问限制由internal改为public,这就意味这可以自由改变Grid中每个单元格的值了。 -增加...

    A梦CO即时通讯软件 易语言

    2、限制 发送编辑框 文本最大长度,防止用户发送大量数据致使软件阻塞; 3、优化服务端界面; 4、加入已输入文本长度提示; 5、优化 表情 功能(根本问题没有解决:不能在 信息框 内直接显示。欢迎给我提建议。)...

    C#编程经验技巧宝典

    2 <br>0003 设置程序代码行序号 3 <br>0004 开发环境全屏显示 3 <br>0005 设置窗口的自动隐藏功能 3 <br>0006 根据需要创建所需解决方案 4 <br>0007 如何使用“验证的目标架构”功能 4 ...

Global site tag (gtag.js) - Google Analytics