CreateWindowEx()在Windows 7上速度较慢(有时候)

3

我在Windows 7(和可能的Vista)使用CreateWindowEx()函数时遇到了相当严重的性能问题。

我创建的一些窗口在Windows 7中需要的时间比XP长得多。时间可能高达15-25毫秒,当你需要创建很多窗口时这是很多的。(在XP上的时间始终为0-2毫秒。)为什么会这样?有什么解决方法吗?

所有窗口都在同一个线程中创建。其中一些是使用窗口类构建的,而另一些则是我自己的。对我来说,似乎所有具有WS_POPUP [EDIT:和WS_EX_TOOLWINDOW]属性的窗口都会受到此延迟的影响,而没有该属性的窗口则不会。(但实际原因当然可能是其他属性导致的。)这似乎适用于我所有的窗口,除了RICHEDIT_CLASS控件,它是唯一一个在7上不稳定地变化在1-30毫秒之间的控件。 谢谢!

[编辑:该应用程序最大的问题是在主窗口创建时,使用gToolTip创建了许多(约300个)工具提示。我可以将工具提示的创建延迟到窗口显示时,但我有其他“恶意”窗口,而且我仍然想确切地了解正在发生的事情。]
[更新:我的工具提示问题得到了很大改善。我从CodeProject中使用的包装类不适合[每个控件调用一次,共计300次],因为它为每个调用创建一个新窗口。诀窍是为每个弹出窗口创建一个工具提示窗口,然后仅向其发送TTM_ADDTOOL消息以针对每个控件。]
[因此,性能得到了很大改善,但对于其他窗口仍存在明显的延迟...]
2个回答

2
由于您提到了WS_POPUP,如果您在创建具有WS_VISIBLE设置的窗口,则可能与 CS_SAVEBITS 类样式有关。

CS_SAVEBITS(0x0800)

将此类窗口遮挡的屏幕图像部分保存为位图。...此样式会增加显示窗口所需的时间,因为系统必须先分配内存来存储位图。


感谢您提供的想法,但不幸的是,没有一个[邪恶的]窗口被创建为可见窗口。有些具有CS_SAVEBITS属性,而有些则没有...我观察到的唯一共同属性是WS_POPUP和WS_EX_TOOLWINDOW。请参见上面的编辑... - Adam

1

如果你想将其降低到XP的水平,可以关闭Aero。它的合成功能使得像玻璃和实时缩略图等视觉效果不是免费的。


我怕这不是一个解决方案。我们不能期望所有用户都这样做。 - Adam
是的,用户可以非常不讲理 :) - Hans Passant
由于我们的应用程序在XP上运行良好,我宁愿告诉他们下载XP破解版并卸载Windows 7 :p。 - Adam
无论如何,Aero已经关闭了。因此它根本不是一个因素。 - Adam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接