C#中的慢速屏幕涂料

时间:2010-11-18 12:07:55

标签: c# winforms user-interface performance paint

我只在C#中将几个控件放入我的主窗体中,并且我看到每个控件在窗体加载时绘制得非常慢。这对用户来说非常明显,这让我感到困扰。我没有在运行时创建任何控件,它们已经在表单中。我看到了一些相关的问题,并发现了以下建议:

this.SetStyle(ControlStyles.UserPaint, true);

this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);

this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

this.SetStyle(ControlStyles.ResizeRedraw, true);

this.UpdateStyles();

此解决方案实际上导致我的表单加载速度更慢。我无法想象如果它包含超过30个控件将会发生什么。

关于我应该做什么的任何建议?

5 个答案:

答案 0 :(得分:1)

您需要提供更多信息。

如果您使用我们的视觉工作室控件,并且您有5个并且遇到此类问题,则问题必须在其他地方 - 糟糕的图形驱动程序或类似的东西。

那么,你使用什么控件?具体到底是什么? 如果您设置了一些属性,请尝试将它们重置为默认值并查看是否有更改。

您设置为表单的标志对于非所有者绘制的控件并不重要,您没有说是这种情况。

答案 1 :(得分:0)

不确定这是否与您的问题有关,因为缺少信息,但我在某些时候遇到了同样的问题,我将提供详细信息。

5年多以前,我在一个Windows Forms信息亭应用程序上工作,该应用程序是基于.Net 1.1(当时最新的)构建的。该应用程序需要花哨的图形,其中包括主要表单的背景图像和具有透明层的图像,用于表单上的不同控件。以标准方式实现,通过在控件中使用BackgroundImage属性或OnPaint事件,导致接口速度较慢。存在闪烁,并且在表单中添加了大量控件的情况下,您实际上可以看到它们被逐个加载。

涉及透明度的控件的问题在于它们涉及不同的涂料模型与不具有透明度的涂料模型。当接收到绘制事件时,这样的控件必须将该事件转发给其父级,该父级将首先渲染,并且仅在此之后才渲染子级的图形。这应该意味着一个paint事件被转换为三个(paint事件控制透明,然后绘制事件转发给父,然后绘制事件回到控制透明),但由于一些奇怪的原因,似乎在.Net的Windows窗体中有更多这样的油漆事件从孩子到父母来回传递。不知道是什么原因造成的。我知道的一件事是VB6或C ++ MFC应用程序,作为.Net Windows窗体的应用程序,也构建在Win32之上,没有问题。

当时,我尝试了很多来自互联网的技巧(就像你引用的那些),但是没有一个真的奏效。我最终在GDI +之上构建了自己的渲染引擎。这不是我推荐的东西,因为它花了我很多时间来实现,在这个过程中我失去了像visual forms editor这样的功能。

我建议但是,考虑到从那时起出现的技术,如果您需要构建图形密集型应用程序,最好使用Windows Presentation Foundation(WPF),已针对此进行了优化,而不是使用Windows窗体。

答案 2 :(得分:0)

我意识到backgroundImageLayout设置为“tile”,我切换到“stretch”,这显着提高了GUI性能。我还将一些控件的背景颜色更改为白色,这对我的表单中隐藏的面板特别有帮助。

感谢大家。

答案 3 :(得分:0)

如果使用绘制事件在表单上绘制背景图像,则可能会使事情变慢。相反,在表单加载或设计模式下绘制一次背景图像,然后从paint事件处理程序中取出所有内容。

答案 4 :(得分:0)

尝试将图像放在表单的顶部,高度和宽度并在其上绘制。它会刷新并绘制得更快。