【问题标题】:Windows Form Paints Repeatedly In XP, But Not In VistaWindows 窗体在 XP 中重复绘制,但在 Vista 中没有
【发布时间】:2010-11-19 22:54:14
【问题描述】:
我正在尝试解决我的应用程序中的一个问题。我在 Vista 中开发应用程序,它在那里运行良好,但是当我将它带到 XP 时,表单变得迟缓且无响应。当我使用断点查看 windows 消息时,我发现在 XP 中,表单大约每秒重复绘制一次(即使它并不真正需要);然而,在 Vista 上的相同测试并没有显示这种重复的绘画。
关于可能导致此问题的任何想法?
【问题讨论】:
标签:
.net
winforms
windows-vista
windows-xp
paint
【解决方案1】:
没有看到具体的代码等,我不知道您的具体问题,但是由于桌面窗口管理器 (DWM),Vista 中的窗口绘制完全不同。由于合成效果,每个窗口的图像实际上是缓存/双缓冲的,因此您不会看到重新绘制的闪烁。
我建议您专注于解决 XP 上的问题,因为这显然是 DWM 在 Vista 上掩盖的问题。
【解决方案2】:
某些原因导致您的部分或全部窗口失效。
正如@Jon 所说的没有太多细节,但这里有一些事情要寻找:
- 您有自定义绘制逻辑吗?描述一下。
- 您的代码中有计时器吗?他们是做什么的?
- 闪烁是仅在程序正在使用时发生,还是在您的手离开计算机而只是观看时发生?
- 您只是在使用标准的 .Net 控件还是任何控件库/用户控件?
【解决方案3】:
感谢大家的意见。现在问题已经解决了,在 Subversion 的帮助下!窗口迟缓是一个相对较新的问题,所以我决定及时回顾我使用 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_COMPOSITED。
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;
}
}
现在一切正常!