clistctrlcl 闪烁_VC窗口闪烁问题的解决

一般的

windows

复杂的界面需要使用多层窗口而且要用贴图来美化,所以不可避免在窗口

移动或者改变大小的时候出现闪烁。

先来谈谈闪烁产生的原因

原因一:

如果熟悉显卡原理的话,调用

GDI

函数向屏幕输出的时候并不是立刻就显示在屏幕

上只是写到了显存里,而显卡每隔一段时间把显存的内容输出到屏幕上,这就是刷新周期。

一般显卡的刷新周期是

1/80

秒左右,具体数字可以自己设置的。

这样问题就来了,

一般画图都是先画背景色,

然后再把内容画上去,

如果这两次操作不在同

一个

刷新周期内完成,

那么给人的视觉感受就是,

先看到只有背景色的图像,

然后看到画上内容

的图像,

这样就会感觉闪烁了。

解决方法:尽量快的输出图像,使输出在一个刷新周期内完成,如果输出内容很多比较慢,

那么采用

内存缓冲的方法,先把要输出的内容在内存准备好,然后一次输出到显存。要知道一次

API

调用一般可以

在一个刷新周期内完成。

对于

GDI

,用创建内存

DC

的方法就可以了

原因二:

复杂的界面有多层窗口组成,当

windows

在窗口改变大小的时候是先重画父窗口,然后重

画子窗口,子父

窗口重画的过程一般无法在一个刷新周期内完成,所以会呈现闪烁。

我们知道父窗口上被子窗口挡住的部分其实没必要重画的

解决方法:给窗口加个风格

WS_CLIPCHILDREN

,

这样父窗口上被子窗口挡住的部分就不

会重画了。

如果同级窗口之间有重叠,那么需要再加上

WS_CLIPSIBLINGS

风格

原因三:

有时候需要在窗口上使用一些控件,比如

IE

,当你的窗口改变大小的时候

IE

会闪烁,即使

你有了

WS_CLIPCHILDREN

也没用。原因在于窗口的类风格有

CS_HREDRAW

或者

CS_VREDRAW

,这两个风格表示

窗口在宽度或者高度变化的时候

重画,但是这样就会引起

IE

闪烁

解决方法:注册窗口类的时候不要使用这两个风格,如果窗口需要在改变大小的时候重画,

那么可以在

WM_SIZE

的时候

调用

RedrawWindow

原因四:

界面上窗口很多,而且改变大小时很多窗口都要移动和改变大小,如果使用

MoveWindow

或者

SetWindowPos

两个

API

改变窗口的大小和位置,

由于他们是等待窗口重画完成后才返回,

所以过程很慢,

这样视觉

效果就可能会闪烁。

解决方法:

使

API

BeginDeferWindowPos,

DeferWindowPos

EndDeferWindowPos

先调用

BeginDeferWindowPos

设定需要移动的窗口的个数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值