我有一个表单,其中包含很多运行时生成的控件(图像、按钮、面板……),大约 100 个控件(我正在制作一个卡片匹配游戏,所以表单中有很多控件)。
我将生成代码放入构造函数中,每次应用启动时,大约需要 3-5 秒才能完全加载所有控件。
如果我把另一个窗口放在顶部然后回到我的应用程序,控件将再次重绘。
如何防止控件被重绘?如果您不介意,请给我一个 C# 中的简单示例。
任何帮助表示赞赏!
我有一个表单,其中包含很多运行时生成的控件(图像、按钮、面板……),大约 100 个控件(我正在制作一个卡片匹配游戏,所以表单中有很多控件)。
我将生成代码放入构造函数中,每次应用启动时,大约需要 3-5 秒才能完全加载所有控件。
如果我把另一个窗口放在顶部然后回到我的应用程序,控件将再次重绘。
如何防止控件被重绘?如果您不介意,请给我一个 C# 中的简单示例。
任何帮助表示赞赏!
我发现这篇文章解释了如何在 .NET 中通过调用WIN API SET_MESSAGE 函数为您不想更新的控件设置 WM_SETREDRAW 标志来执行此操作。虽然您可以阻止某些控件更新,但您确定不能通过减少页面上的控件数量来解决此问题吗?100 个控件似乎很多,可能表明您需要拥有多个视图。
享受!
我的建议是使用表格作为绘图表面并将卡片位图直接绘制到表格上。做起来并不难。
您可以向表单Paint事件添加一个处理程序,该处理程序将为您提供带有Graphics对象的参数。使用graphics.DrawImageUnscaled在您想要的位置绘制每张卡片。
这将使应用程序更快。
阻止控件重绘是毫无意义的。您将在应该出现控件的地方出现一个洞,您的用户将无法使用该洞。
它重绘缓慢只是因为您有太多控件。您只能通过使用更少的控件来更快地重绘它。或者通过使用可以在一个窗口中显示多个项目的控件,如 ListBox、ListView、TreeView、DataGridView。
请注意,您的特定问题已在 Vista 和 Windows 7 中修复。Aero 主题对 Windows 使用屏幕外缓冲。这意味着当窗口被另一个窗口遮挡时,它们不再需要重新绘制自己。但是,当用户最小化窗口并恢复它时,您仍然会得到缓慢的重绘。
You might want to consider using a single data table control. A ListView (or something like ObjectListView) may be a good option.
If your data isn't really a list/table, you should split the controls into separate tab pages, which would improve both performance and usability.