win32 窗口缩放时出现闪屏

今天无意发现之前写的一个小工具在缩放窗口的时候,出现闪屏,主要有两个位置:

  1. 工具栏出一闪屏
  2. 右侧的控制面板出现闪屏 (这个控制面板与多层元件组合而成)

之前真没注意到这个问题,平时都是最大化/恢复窗口,没缩放窗口,所以没发现这样的问题。

网上搜索了一下,找到一些解决方案:

[百度文库] VC窗口闪烁问题的解决 - http://wenku.baidu.com/view/3c7e747931b765ce0508146a.html

我遇到的问题属于第2种情况:

原因二:  复杂的界面有多层窗口组成,当windows在窗口改变大小的时候是先重画父窗口,然后重画子窗口,子父  窗口重画的过程一般无法在一个刷新周期内完成,所以会呈现闪烁。 我们知道父窗口上被子窗口挡住的部分其实没必要重画的  解决方法:给窗口加个风格 WS_CLIPCHILDREN ,这样父窗口上被子窗口挡住的部分就不会重画了。  如果同级窗口之间有重叠,那么需要再加上 WS_CLIPSIBLINGS 风格

我在创建主窗口的相关代码中加一个dwStyle: WS_CLIPCHILDREN

就解决了闪屏的问正式。

今天还发现一个新的 dwExStyle:WS_EX_COMPOSITED  (xp下什么双缓冲绘图机制)

相关的介绍:

http://www.cppblog.com/xfpl-at-hotmail-dot-com/archive/2009/10/10/98261.html?opt=admin

http://blog.sina.com.cn/s/blog_874559b70100thqy.html

我在一个多层次控件的父窗口,其实就是一个类似java中的JPanel上,设置 dwExStyle: WS_EX_COMPOSITED

竟然可以解决缩放窗口时JPanel中控件重绘造成的闪屏情况。

但是,当我把这个指定给一个画图片的面板上,发现虽然彻底解决了图片重绘时的闪屏问题,但是电脑的CPU占用达到50%.

看来这个 dwExStyle: WS_EX_COMPOSITED 是要付出代价的.

2014-01-11

时间: 2024-10-10 02:07:46

win32 窗口缩放时出现闪屏的相关文章

Android如何避免切换至SurfaceView时闪屏(黑屏闪一下)

最近的项目中,有一个Activity用到Fragment+ViewPager,其中一个fragment中实现了视频播放的功能,包含有SurfaceView.结果,每次打开程序第一次进入到该Activity时都会闪屏黑一下.原因就出在SurfaceView. 详解: I think I found the reason for the black flash. In my case I’m using a SurfaceView inside a Fragment and dynamically

Java Swing创建自定义闪屏:在闪屏上添加Swing进度条控件(转)

本文将讲解如何做一个类似MyEclipse启动画面的闪屏,为Java Swing应用程序增添魅力. 首先看一下效果图吧, 原理很简单,就是创建一个Dialog,Dialog有一个进度条和一个Label用来分别显示进度和进度信息,而Dialog的宽度和高度正是闪屏图片的宽度和高度.然后将闪屏图片贴到Dialog中作为整个窗体的背景,Dialog显示时覆盖闪屏所处的区域.由于Dialog显示时闪屏并没有消失,且Dialog的X.Y及宽高都与闪屏图片一致,因此实际切换时,非常流畅,用户感觉不到有异常,

【iOS开发】解决“点击MPMoviePlayerController播放视频时,出现一个黑屏闪屏问题”

当点击某按钮播放视频时,如果在按钮触发函数时alloc MPMoviePlayerController对象,同时加载资源文件,因为加载资源文件也需要时间,这时会有一个短暂的黑色闪屏,这点体验很不好,有一个好的解决方案是,提前alloc预加载好该MoviePlayer对象,点击按钮时直接调用play. 预加载相关代码: //预加载视频,避免出现黑屏 NSString *videoPath=[[NSBundle mainBundle]pathForResource:@"startVideo"

winform MDI子窗口闪动问题(本人测试100%有效解决闪屏问题)

将下面的代码随便放到主窗体的任何一个地方 protected override CreateParams CreateParams //解决MDI闪屏 { get { CreateParams cp = base.CreateParams; cp.ExStyle |= 0x02000000; return cp; } }

另类解决Win10游戏会闪屏的方法

在Win10系统中遇到游戏时闪屏另很多朋友很苦恼,可是又找不到解决方法,下面小编分享一个另类的解决方法,或许可以帮助你解决Win10下游戏时闪屏的问题,. 解决步骤: 1.打开游戏后先将游戏界面调整成"窗口化",或者"无边窗口化(全屏无边框)"; 2.任意打开一个另外的程序窗口,按组合键Win+Tab(不是Alt+Tab)切换,然后点击+添加桌面,添加一个"桌面2"; 3.接着将游戏窗口拖入"桌面2"里去; 4.然后点击&qu

关于VC画图闪屏的问题 - VC/MFC / 基础类

显示图形如何避免闪烁,如何提高显示效率是问得比较多的问题. 而且多数人认为MFC的绘图函数效率很低,总是想寻求其它的解决方案. MFC的绘图效率的确不高但也不差,而且它的绘图函数使用非常简单, 只要使用方法得当,再加上一些技巧,用MFC可以得到效率很高的绘图程序. 我想就我长期(呵呵当然也只有2年多)使用MFC绘图的经验谈谈 我的一些观点. 1.显示的图形为什么会闪烁? 我们的绘图过程大多放在OnDraw或者OnPaint函数中,OnDraw在进行屏 幕显示时是由OnPaint进行调用的.当窗口

利用WinPcap模拟网络包伪造飞秋闪屏报文

起因 不知道从什么时候开始,同事开始在飞秋上发闪屏振动了,后来变本加厉,成了每日一闪.老闪回去也比较麻烦,作为程序猿呢,有没有什么偷懒的办法呢?(同事负责用户体验,不大懂编程).然后尝试了以下思路: UI自动化 利用UISpy查看飞秋聊天窗口,悲催的发现找不到发送闪屏振动的按钮. 模拟鼠标事件 准备使用mouse_event发送鼠标事件来模拟闪屏振动的按下.但是一想,每次闪屏振动按钮所在的位置不一样,要是移动窗口或者改变窗口布局,都得重新设置坐标,麻烦,遂弃之. 伪造网络报文 以前就知道WinP

VC++ 轻松实现“闪屏” SplashWnd

我们平时使用的好多软件在运行启动时都会有一个"闪屏"画面显示,一般用于标识软件的一些信息,如软件版本名称.公司等,通过查找资料发现,其实实现起来很简单,一个类就能搞定! SplashWnd.h C++ Code 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647   #if !defined(AFX_SPLASHWND_H__18C1CB0F_1CFF_483B_87

双缓冲解决控制台应用程序输出“闪屏”(C/C++,Windows)

使用 C 语言编写游戏的小伙伴们想必起初都要遇到这样的问题,在不断清屏输出数据的过程中,控制台中的输出内容会不断地闪屏.出现这个问题的原因是程序对数据处理花掉的时间影响到了数据显示,或许你可以使用局部覆盖更新方法(减少更新数据量)来缓解闪屏,但是这种方法并不适用于所有场合,尤其是更新数据本身就非常大的场合. 本文将讲述解决控制台应用程序输出闪屏的终级解决方法——双缓冲. 问题呈现 下面的代码演示了在高速不断清屏输出数据的过程的闪屏问题,特邀您一试: 1 2 3 4 5 6 7 8 9 10 11