繁体   English   中英

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

[英]Prevent controls from being redrawn in C#?

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

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

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

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

任何帮助表示赞赏!

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

请享用!

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

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

这将使应用程序更快。

防止重绘控件是毫无意义的。 你会得到一个应该出现控件的洞,你的用户不会对那个洞有任何用处。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM