防止在C#中重新绘制控件?

时间:2010-06-18 16:37:07

标签: c# performance forms controls redraw

我有一个包含大量运行时生成的控件(图像,按钮,面板,...)的表单,大约100个控件(我正在制作卡片匹配游戏,因此表单中有很多控件)

我将生成代码放入构造函数中,每次应用程序启动时,大约需要3-5秒才能完全加载所有控件。

如果我将另一个窗口置于顶部然后再返回我的应用程序,则会再次重新绘制控件。

如何防止重绘控件?如果您不介意,请在C#中给我一个简单的例子。

感谢任何帮助!

4 个答案:

答案 0 :(得分:1)

我发现这篇文章解释了如何在.NET中执行此操作,方法是调用WIN API SET_MESSAGE function为您不想更新的控件设置WM_SETREDRAW标志。虽然您可以阻止某些控件更新,但您确定无法通过减少页面上的控件数来解决此问题吗? 100控件似乎很多,可能表明您需要有多个视图。

享受!

答案 1 :(得分:1)

我的建议是将表单用作绘图表面,并将卡片位图直接绘制到表单上。这不难做到。

您可以向表单Paint事件添加处理程序,该事件将为您提供带有Graphics对象的参数。使用graphics.DrawImageUnscaled在您想要的位置绘制每张卡片。

这将使应用程序更快。

答案 2 :(得分:1)

防止重绘控件是毫无意义的。你会得到一个应该出现控件的洞,你的用户将无法使用该洞。

它只是因为你有太多的控件而慢慢重绘。您只能通过使用较少的控件来更快地重绘。或者通过使用可以在一个窗口中显示多个项目的控件,如ListBox,ListView,TreeView,DataGridView。

请注意,您的特定问题已在Vista和Windows 7中修复.Aero主题使用Windows的屏幕外缓冲。这意味着当窗口被另一个窗口遮挡时,窗口不再需要重新绘制自己。但是,当用户最小化窗口并恢复窗口时,您仍会得到缓慢的重绘。

答案 3 :(得分:0)

您可能需要考虑使用单个数据表控件。 ListView(或像ObjectListView之类的东西)可能是个不错的选择。

如果您的数据实际上不是列表/表格,则应将控件拆分为单独的标签页,这样可以提高性能和可用性。