Windows窗体在XP中重复绘制,但不在Vista中

时间:2009-08-15 21:36:24

标签: .net winforms windows-vista windows-xp paint

我正在尝试解决我的应用程序中的问题。我正在开发Vista中的应用程序,它在那里工作正常,但当我把它带到XP时,表单变得迟钝和反应迟钝。当我使用断点观察窗口消息时,我发现在XP中,窗体每秒重复绘制一次(即使它并不真正需要);然而,Vista上的相同测试并没有显示出这种重复的绘画。

关于可能导致这种情况的任何想法?

3 个答案:

答案 0 :(得分: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;
    }
}

现在一切都很棒!

答案 1 :(得分:1)

没有看到具体的代码等我不知道你的具体问题,但是由于桌面窗口管理器(DWM),Vista中的窗口绘画差别很大。由于合成效果,每个窗口的图像实际上都是缓存/双缓冲的,因此您不会看到重新绘制的闪烁。

我建议您专注于解决XP上的问题,因为这显然是DWM在Vista上屏蔽的问题,。

答案 2 :(得分:1)

导致部分或全部窗口失效的原因。

由于@Jon没有说太多细节,但这里有一些事情需要寻找:

  1. 你有自定义绘画逻辑吗?描述一下。
  2. 您的代码中是否有计时器?他们做了什么?
  3. 闪烁是仅在程序正在使用时发生,还是在您的手离开计算机并只是观看时发生?
  4. 您是否只使用标准.Net控件或任何控件库/用户控件?