【问题标题】:How to optimize controls and forms painting and redraw for speed, and to remove flickering? [closed]如何优化控件和窗体的绘画和重绘以提高速度,并消除闪烁? [关闭]
【发布时间】:2014-08-26 21:09:14
【问题描述】:

我正在做一个大项目。我的表单是form1的mdi容器。 form1 加载太慢,我可以看到正在绘制的控件。

每个表单都有一个更新方法,但我仍然有同样的问题。我无法使用任务创建新表单。

这是我的代码

       form1.MdiParent = Me
       form1.Show()

我的表单有 40 多个控件(文本框、标签、网格视图 ...),是的,它是繁重的 UI。是否有任何解决方案可以利用并发技术,例如:任务、异步等待?

【问题讨论】:

  • 很难弄清楚你在问什么。你有一个具体的问题让它更容易吗?就目前而言,这个问题似乎非常广泛,没有任何澄清,它可能会被关闭。
  • WinForms 在显示带有许多控件的表单时总是很慢,您可以尝试几件事来加快该过程,可能最有效的方法可能是处理来自 WndProc 的 WM_PAINT 消息为避免重绘,当所有控件都准备好时,您可以取消阻止消息并刷新表单。我没有将此作为答案,因为我没有为您提供正确的代码,所以我更愿意发表评论,因为您需要检查不同的组合(如双缓冲和离屏渲染 + WM_PAINT 方法)才能找到正确的给你的方式
  • @JesusSalas 我只是好奇。你屏蔽了WM_PAINT。什么都没有画出来。然后你刷新。一切都画好了。怎么这么快。双缓冲不用于更快的绘图,而是用于更流畅的动画或避免闪烁问题。最后,您不必阻止WM_PAINT。只需将所有控件的可见性设置为 false 即可。
  • @valter 如果我没记错的话(几年前我在使用 WinForms 的大型项目中遇到过同样的问题),它更快的原因与您在设置表单无效,导致所有子控件的重绘,然后阻止主表单重绘,直到所有控件都添加到 Children 集合并且一切准备就绪,避免这种情况发生,加快进程,因为我不记得所有关于我如何实现此解决方法的详细信息,我只想提供一些提示。我会试着写一些代码来提供一个准确的答案。

标签: c# .net vb.net performance winforms


【解决方案1】:

在运行了一些测试并查看了一些旧代码后,我已经能够找到有助于解决此特定问题的内容,您可以尝试将下一个样式添加到表单中

public partial class Form1 : Form
{
    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams CP = base.CreateParams;
            CP.ExStyle = CP.ExStyle | 0x02000000; // WS_EX_COMPOSITED
            return CP;
        }
    }
}

您可以在此处查看 WS_EX_COMPOSITED 文档: http://msdn.microsoft.com/en-us/library/windows/desktop/ff700543(v=vs.85).aspx

我在一个包含 752 个子控件(标签、文本框、数据网格、组合框和列表框)的表单上尝试了这个,但我看不到子控件是如何绘制的,它们只是飞溅到视图中。

VB版:

Protected Overrides ReadOnly Property CreateParams() As CreateParams
 Get
     Dim cp As CreateParams = MyBase.CreateParams
        cp.ExStyle = cp.ExStyle Or &H02000000 
     Return cp
 End Get
End Property

【讨论】:

  • 正如我所说。它没有加速这个过程。您只需使用双缓冲。问题是加快控制重绘
  • 非常感谢这是解决我问题的方法
  • 这太棒了!谢谢
  • 很好的解决方案!它加载相同的速度,但对用户的感知是一种更快捷的形式!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多