当前位置:C++技术网 > 资讯 > 窗口背景贴图,打开窗口会闪烁

窗口背景贴图,打开窗口会闪烁

更新时间:2016-08-10 13:45:04浏览次数:1+次

当窗体的style属性设置为null,而窗体的背景是一副图片的时候,在窗口打开关闭或者窗口切换的时候,会有闪烁,这是为什么呢?



C++技术网解答:

    窗口背景贴图闪烁,是在多次轮流绘制界面时交替画面差异太大而产生的。

    绘图时,先绘制的将被后绘制的覆盖叠加。最后绘制的也就在最顶层。你贴图也就是让你贴的图作为窗口背景,作为最后绘制的一层显示出来,这样就是窗口的背景了。

    你这里至少有窗口背景的绘制,然后就是你贴图。每次窗口打开、关闭和切换,都会导致窗口重绘,来恢复窗口的画面,这是Windows的机制。而每次重绘窗口的时候,都要绘制窗口,然后再用你的图片贴图一下。

    默认情况下,绘制窗口背景的时候,是用窗口类结构中的画刷句柄指定的画刷绘制窗口背景,默认是白色画刷。而你贴的图和白色有很大的差异,而且绘制的时候,因为延迟,导致没有快速的实现,让你感觉到了两次画图的影像留存界面,所以你感觉到一白一个你的背景,所以产生了闪烁。

    闪烁产生的原因和使用双缓冲消除多次绘图产生的闪烁办法,可以阅读《绘图技术的闪烁原因探究》系列,请直接在C++技术网的搜索框输入系列名称搜索阅读。

    而你这里仅仅是贴了一次背景图,和背景自己的重绘,一共两次造成了闪烁。鉴于这个原因,可以用最简单的办法去解决,即让背景重绘不发生。你可以禁止背景重绘,你可以处理WM_ERASEBKGND窗口消息,阻止默认的重绘背景,直接返回即可,在MFC中,重载OnEraseBkgnd。只要返回一个状态,表示你已经处理,不让系统默认处理,就OK。或者,你还可以将窗口背景画刷设置为空画刷,这样也背景重绘也不会起作用。

    然后你会发现,现在只剩下你一个背景贴图了,就不会产生闪烁了。强烈建议你看完《绘图技术的闪烁原因探究》系列,能让你深入了解闪烁的原理。而不限于解决目前这个问题。