65.9K
CodeProject 正在变化。 阅读更多。
Home

C# 窗体位置管理器

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.56/5 (7投票s)

2005年11月2日

CPOL

2分钟阅读

viewsIcon

52090

downloadIcon

650

一篇包含有关处理窗体位置的类的详细信息的文章, 而无需在每个窗体中添加代码

我找不到一个好的通用类示例来记录窗口的位置。我发现的示例代码通常依赖于为每个单独的窗口添加代码。 我认为,这有两个缺点

  1. 你在每个窗体中都有很多重复的代码。
  2. 每个窗体总是以相同的方式调整大小。 如果您想将同一窗体用于两个不同的目的,它将始终出现在同一位置。

以下代码是一个类,它将跟踪一个或多个窗口并在它们关闭时记录它们的位置。 它不需要对现有窗体进行任何更改,并且只需一个对象即可处理多个窗体。

要实例化该类,您需要向该类传递一个要使用的应用程序名称。 这用于在当前用户的 hive 中创建或打开一个注册表项,并为窗体创建一个子键。 每个窗体都有自己的窗体键子分支,用于存储有关各个窗体的信息。

要处理一个窗体,您可以调用 HandleForm 函数。 这会将窗体与您传入的 formName 一起跟踪在 hashtable 中。 如果您希望根据其内容或调用它的对象,将同一窗体在两个不同的位置打开,那么您可以简单地传入不同的窗体名称,每个单独版本的窗体现在都将在不同的位置加载和保存。

formLocationHandler = new FormManager.FormLocationHandler("Test App");
formLocationHandler.HandleForm("Form2", newForm);
newForm.Show();

如果不想在创建 FormManager 后再麻烦它,static 函数调用 HandleFormForApp 也作为一个便捷方法提供。

FormManager.FormLocationHandler.HandleFormForApp("Test App", "Form1 Take2", newForm);

当窗体关闭时,窗体会触发 form.Closing 事件,该事件会调用 FormLocationHandler。 然后,这会将窗体的位置记录回注册表中,以备下次读取窗体时使用。

此代码存在几个问题,可以通过以下方式解决

  1. 如果打开一个窗口,调整它的大小,然后打开该窗口的另一个副本(不关闭第一个),它将与原始窗口大小相同,而不是调整大小后的窗口。 您可以通过在每次触发 form.LocationChanged form.SizeChanged 事件时保存窗体位置和大小来避免这种情况,但这也会磨损您的注册表,从而减慢您的应用程序的速度。
  2. 另一种选择是检查 hashtable 中是否有一个具有相同名称的窗体(窗体名称存储在 hashtable 中),并从注册表复制位置。

历史

  • 2005 年 11 月 2 日: 初始发布
© . All rights reserved.