Windows形式在XP中反复绘制,但在Vista中不绘制
-
16-09-2019 - |
题
我正在尝试解决我的应用程序中的问题。我正在开发Vista中的应用程序,并且在那里运行良好,但是当我将其带到XP时,该表格就会变得缓慢而无反应。当我使用断点观看Windows消息时,我发现在XP中,该表单每秒都会反复绘制一次(即使它实际上并不需要);但是,对Vista的相同测试并未显示这种重复的绘画。
关于可能导致这一点的什么想法?
解决方案
感谢大家的投入。在颠覆的帮助下,现在已经解决了问题!窗口的呆滞性是一个相对较新的问题,因此我决定使用Subversion在源代码中回顾一下,并发现我最近将WS_EX_COMPOSITED样式标志应用于表单上,以减少Vista中的闪烁。
protected override CreateParams CreateParams
{
get
{
CreateParams result = base.CreateParams;
result.ExStyle |= 0x02000000; // WS_EX_COMPOSITED
return result;
}
}
当我评论出来时,该表格再次在XP中响应,重复的WM_PAINT消息消失了。因此,解决方案是仅在Vista或更高版本中应用WS_EX_COMPOSS。
protected override CreateParams CreateParams
{
get
{
CreateParams result = base.CreateParams;
if (Environment.OSVersion.Platform == PlatformID.Win32NT
&& Environment.OSVersion.Version.Major >= 6)
{
result.ExStyle |= 0x02000000; // WS_EX_COMPOSITED
}
return result;
}
}
现在一切都很好!
其他提示
在没有看到特定代码等的情况下,我不知道您的特定问题,但是由于桌面窗口管理器(DWM),Vista中的窗口绘画大不相同。由于组成效果,每个窗口的图像实际上是缓存/双缓冲的,因此您不会看到重新粉刷的闪烁。
我建议您专注于解决XP上的问题,因为这显然是DWM掩盖Vista的问题。
某些东西导致部分或所有窗口变得无效。
正如@Jon所说的不多的细节,但这里有一些要寻找的东西:
- 您有自定义油漆逻辑吗?形容它。
- 您的代码中有任何计时器吗?他们在做什么?
- 闪烁仅在使用程序时发生,或者当您的手不在计算机上并观看时才发生?
- 您是否仅使用标准.NET控件或任何控件库 /用户控件?
不隶属于 StackOverflow