UnSigned(僵哥) 主窗口很闪

sanguomi 2009-03-18 11:59:58
主窗口很多控件上都写了重绘代码,每次一刷新什么的主窗口就很闪,特别是用IE的工具里的清除历史记录。我把那些控件的双缓冲也都开了,WM_Erasebkgnd消息被我
返回1。
我用Sp++去截消息,WM_SETTINGCHANGE, WM_GetMinMaxINfo, wm_notify 每次闪的时候,这三消息出现的频率最高,我把前边俩个都截了,效果稍微好点点
分只有这么多了,没100分发不了专家帖。
...全文
238 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
sanguomi 2009-04-09
  • 打赏
  • 举报
回复
发现最主要的原因 是覆盖了CreateParams函数,然后加了个WS_EX_TRANSPARENT
结帖
sanguomi 2009-03-20
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 xiaocha 的回复:]
wm_notify 很多可能是重复事件造成的,

比如说 A.OnChange 有 B.Caption := 'xxx',
造成 B 的OnChange,而 B.OnChange 中又改写了 A 或 C 的OnChange
从而可能造成一个控件的多次重绘!

仔细检查一下事件处理代码,可能有帮助
[/Quote]

我测试过,确实有这现象
sanguomi 2009-03-20
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 bob008 的回复:]
我以前也实验过拦截清除背景的消息,事实上是很没效率的,我的资源里面有个进程管理器里面用到了个TBUTFORM,你可以看看我是怎么画的,刚开始我也象你一样拦截什么WM_ERASEBKGND ,双缓冲等等。。。 不过后来经过实验,发现那些根本就垃圾的要死,就好象QQ的窗体大多用的绘制方式,极其消耗资源,是非常落后的绘制手法。
[/Quote]

你发个链节吧,我看不到哦
bob008 2009-03-20
  • 打赏
  • 举报
回复
我以前也实验过拦截清除背景的消息,事实上是很没效率的,我的资源里面有个进程管理器里面用到了个TBUTFORM,你可以看看我是怎么画的,刚开始我也象你一样拦截什么WM_ERASEBKGND ,双缓冲等等。。。 不过后来经过实验,发现那些根本就垃圾的要死,就好象QQ的窗体大多用的绘制方式,极其消耗资源,是非常落后的绘制手法。
bob008 2009-03-20
  • 打赏
  • 举报
回复
我要告诉你的是如果是DELPHI的,根本就不需要双缓冲,因为如果你看TFORM的源代码,你可以看到,实际上它根本就做过创建兼容场景,兼容位图的工作,你再搞个双缓冲简直就是没效率,多做了一次无用功,你要做的仅仅是在绘制前锁定,绘制完UNLOCK。把不必要的清除给改改,该成,扫描线清除的方式,这样效率就高多了。 Refresh().是重新绘制整个的,不建议使用,应该使用校验方式。
starluck 2009-03-20
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 sanguomi 的回复:]
引用 14 楼 ahjoe 的回复:
我通常不调用Refresh().

而是调用 Invalidate().

你也应该这样做.


我昨天已经这么改了, 效果不大 ,估计问题还是窗口控件太多了
[/Quote]


呵呵,三國,看下你局部刷新代碼,我覺得應該是哪裏的問題。


wm_notify 要留意CHANGE事件主要做了什麼
xiaocha 2009-03-20
  • 打赏
  • 举报
回复
wm_notify 很多可能是重复事件造成的,

比如说 A.OnChange 有 B.Caption := 'xxx',
造成 B 的OnChange,而 B.OnChange 中又改写了 A 或 C 的OnChange
从而可能造成一个控件的多次重绘!

仔细检查一下事件处理代码,可能有帮助
sanguomi 2009-03-20
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 ahjoe 的回复:]
我通常不调用Refresh().

而是调用 Invalidate().

你也应该这样做.
[/Quote]

我昨天已经这么改了, 效果不大 ,估计问题还是窗口控件太多了
ahjoe 2009-03-20
  • 打赏
  • 举报
回复
Refresh() 立即刷新显示,如果调用很多次,每次调用都会重绘一遍。
Invalidate() 有空时刷新显示,如果调用很多次,如果前面的还没重绘,最后也只绘一次。
ahjoe 2009-03-20
  • 打赏
  • 举报
回复
我通常不调用Refresh().

而是调用 Invalidate().

你也应该这样做.
starluck 2009-03-19
  • 打赏
  • 举报
回复


這個真的要看你的情況,刷新需要什麼效果。 最好是把這些控件都管理起來然後對指定的刷新,200個帶HANDLE的刷起來夠嗆啊。
sanguomi 2009-03-19
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 byteh 的回复:]
主窗口很多控件上都写了重绘代码

就不能换个思路,不让他都重绘吗?就好比一座大楼,每块玻璃都重绘,我觉得不闪不可能,cpu总不会同一个时间脉冲干完所有的事情!

打个比方,不合适请指正!
[/Quote]

菠菜好久不见, 其实我也这么觉得, 因为那窗口控件太多, 是个以前搞VB的老程序员写的, 那个窗口被他拖了200多控件上去.... 他没类的概念, 指针也不释放, 另外代码风格很怪异, 看得我很头大, 我三星期的任务就改这BUG, 拜托大家多帮忙
byteh 2009-03-19
  • 打赏
  • 举报
回复
主窗口很多控件上都写了重绘代码

就不能换个思路,不让他都重绘吗?就好比一座大楼,每块玻璃都重绘,我觉得不闪不可能,cpu总不会同一个时间脉冲干完所有的事情!

打个比方,不合适请指正!
starluck 2009-03-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sanguomi 的回复:]
引用 7 楼 starluck 的回复:
引用 5 楼 sanguomi 的回复:
引用 4 楼 zswang 的回复:
你想做什么效果?为啥要截取主窗体的WM_Erasebkgnd消息?


我只是想要别人用鼠标刷新的时候, 软件界面别狂闪



是不是刷新直接調用的 refresh??


代码很多, 有的地方是有REFRESH
[/Quote]

這樣就比較麻煩。 最好采用局部刷。 不要直接調用 reFresh. 這樣做的話肯定就刷新所有控件了。
Seamour 2009-03-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sanguomi 的回复:]
我用API LockWindowUpdate去锁住主窗口,返回值是大于0的,然后调用刷新,还是会闪
[/Quote]

跟主窗口有啥关系,你自己写的控件没必要擦除背景的话就 return 0
sanguomi 2009-03-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 starluck 的回复:]
引用 5 楼 sanguomi 的回复:
引用 4 楼 zswang 的回复:
你想做什么效果?为啥要截取主窗体的WM_Erasebkgnd消息?


我只是想要别人用鼠标刷新的时候, 软件界面别狂闪



是不是刷新直接調用的 refresh??
[/Quote]

代码很多, 有的地方是有REFRESH
starluck 2009-03-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 sanguomi 的回复:]
引用 4 楼 zswang 的回复:
你想做什么效果?为啥要截取主窗体的WM_Erasebkgnd消息?


我只是想要别人用鼠标刷新的时候, 软件界面别狂闪
[/Quote]


是不是刷新直接調用的 refresh??
starluck 2009-03-19
  • 打赏
  • 举报
回复

是自己做的主動UPDATE窗口還是??
sanguomi 2009-03-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zswang 的回复:]
你想做什么效果?为啥要截取主窗体的WM_Erasebkgnd消息?
[/Quote]

我只是想要别人用鼠标刷新的时候, 软件界面别狂闪
王集鹄 2009-03-19
  • 打赏
  • 举报
回复
你想做什么效果?为啥要截取主窗体的WM_Erasebkgnd消息?
加载更多回复(3)

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧