防止窗口闪烁地办法
也许我们都碰到过这种情况,当你想重画某个窗口的时候,或你需要每隔一段时间要进行重画窗口,窗口会不停的闪烁。那么如何消除闪烁呢?借鉴了别人的经验,自己也总结一下,现将总结的几种方法介绍一下,供大家参考。
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刷新图像窗口控件闪烁两种解决方法。有时候,我们需要在窗口或者控件中显示图像,以及某些region、contour,甚至是交互时才会出现的ROI选择框。 但是随着操作的频繁进行,我们在重绘窗口内容的时候,会出现并...
浏览器的这种行为主要是为了防止恶意脚本自动打开窗口,从而影响用户的浏览体验。在某些情况下,如在Ajax请求完成之后才尝试打开新窗口,由于请求是异步的,浏览器无法确定用户是否真正触发了这个行为,因此可能将其...
"闪屏"(Flickering)是其中一个典型问题,表现为窗口或控件在刷新时出现闪烁效果,这不仅影响用户体验,也可能使程序显得卡顿。针对这一问题,`WinFormsDoubleBuffer`提供了有效的解决方案。 首先,我们来理解闪屏...
但按下述步骤,可以很容易地DEL它们。运行注册表编辑器REGEDIT.EXE,打开 HKEY_LOCAL_MACHINE\SOFTWARE\MICRO-SOFT\WINDOWS\CURRENTVERSION\ EXPLORER\ DESKTOP \NAMESPACE,单击 NameSpace 旁的+号将出现几个数字域...
1)增加防止COOKIE欺骗攻击的加密KEY属性设置,编辑器用到的COOKIE都将会进行加密。 2)更新编辑器帮助文件。 3)文字水印调整为只添加到图像宽高>100像素的图片上面,并且调整编辑器默认配置添加的是图片水印! 2010...
- 解决办法:先完全断开电源,等待约20-30秒后再接通电源,等待10秒后再开机。 #### 七、清除CMOS口令的方法 **问题描述**:忘记CMOS口令。 **解决方案**: 1. 快速短接主板上的“ClearCMOS”跳线。 2. 如果能够...
-为按钮增加DisableControlBeforePostBack属性 - 回发之前是否禁用按钮,防止重复提交 - 默认为true。 -Grid的Values属性访问限制由internal改为public,这就意味这可以自由改变Grid中每个单元格的值了。 -增加...
-为按钮增加DisableControlBeforePostBack属性 - 回发之前是否禁用按钮,防止重复提交 - 默认为true。 -Grid的Values属性访问限制由internal改为public,这就意味这可以自由改变Grid中每个单元格的值了。 -增加...
2、限制 发送编辑框 文本最大长度,防止用户发送大量数据致使软件阻塞; 3、优化服务端界面; 4、加入已输入文本长度提示; 5、优化 表情 功能(根本问题没有解决:不能在 信息框 内直接显示。欢迎给我提建议。)...
2 <br>0003 设置程序代码行序号 3 <br>0004 开发环境全屏显示 3 <br>0005 设置窗口的自动隐藏功能 3 <br>0006 根据需要创建所需解决方案 4 <br>0007 如何使用“验证的目标架构”功能 4 ...