内容提要 ( 译者 )
这篇文章中 , 给我们介绍了一个可以自动保存窗体状态信息的一个类 , 这个类可以从他的父窗体中预订事件 , 自动保存和恢复窗体的状态 . 实现方法可以说是非常的巧妙 , 并且非常的通用 .
文章中的代码可以从 http://www.codeproject.com/csharp/RestoreFormState/RestoreFormState_src.zip 下载 .
简介
每次我生成一个新的桌面型程序的时候,我都要在主窗口的关闭事件中写一些代码来保存我主窗口一些信息 , 比如位置,大小,窗体状态等等 , 这篇文章中,我们讲述了如何使用一个简单的 C# 类自动完成上面的这些工作 . 我在设计这个类的时候 , 我就考虑到要在使用时候用最少的代码就可以把这个类加到窗体中 , 并且能够从工具箱中把它加到窗体中 .
类是如何工作的
类的名字为 PersitWindowState
,
为了能更明白理解它的作用 , 我们先略过它的实现 , 先来看看它的应用 。 这个类用起来 的非常简单。下面是一个 演说如何把它加到一个窗体中 :
public class AppForm : System.Windows.Forms.Form
{
private PersistWindowState m_windowState;
public AppForm()
{
m_windowState = new PersistWindowState();
m_windowState.Parent = this;
_// 在设置注册表的HKEY_CURRENT_USER中设置路径_
m_windowState.RegistryPath = @"Software\YourCompany\YourApp";
}
[STAThread]
static void Main()
{
Application.Run(new AppForm());
}
}
上面就是如何能自动的保存和取出窗体的状态的所有的代码 , 非常短小精悍。我还在 PersistWindowState 类中添加了其它的一些功能,它可以自动的保存和取出另外的一些信息。窗体添加了两个事件 PersistWindowState.LoadStateEvent
和 PersistWindowState.SaveWindowState
. 这两个事件发生是 , 有一个 RegistryKey
变量 , 可以在在当注册表中保存和取出窗体一些信息。下面的代码演示了如何使用这个类的这些功能
public class AppForm : System.Windows.Forms.Form
{
private PersistWindowState m_windowState;
public AppForm()
{
this.Text = "RestoreFormState";
m_windowState = new PersistWindowState();
m_windowState.Parent = this;
_// 在HKEY_CURRENT_USER 设置注册表的路径 _
m_windowState.RegistryPath = @"Software\YourCompany\YourApp";
_// 添加load and save 事件_
m_windowState.LoadStateEvent +=
new PersistWindowState.WindowStateDelegate(LoadState);
m_windowState.SaveStateEvent +=
new PersistWindowState.WindowStateDelegate(SaveState);
}
private int m_data = 34;
private void LoadState(object sender, RegistryKey key)
{
_// 从注册表中读信息_
m_data = (int)key.GetValue("m_data", m_data);
}
private void SaveState(object sender, RegistryKey key)
{
_// 把信息保存到注册表中_
key.SetValue("m_data", m_data);
}
[STAThread]
static void Main()
{
Application.Run(new AppForm());
}
}
类是如何实现的
在看完了类 PersistWindowState
的各种用法之后 , 让我们来看看这个类本身的设计 . PersistWindowState
的 关键就是可以预订其他类的事件 . 这个类有 4 个事件 , 它们是 Form.Closing, Control.Resize, Control.Move 和 Form.Load. 当控件的 Parent
属性设置以后 , 就可以 从 Parent
中预订 这四个事件了 ( 记住 , Parent
在这儿是非常有用的属性 . )
窗体的状态变化会在 Control.Resize
和
Control.Move
中被记录 .
Control.Resize
允许我们记录当前窗体的宽度和高度 , 我们只有在窗体是正常状态 ( 不是最大化也不是最小化 ) 是才会记录这些信息 , 当窗体是最大化或者是最小化的时候 , 我们并不记录这些信息 . Control.Move
是 用来记录窗体的位置 ( 和上面一样 , 窗体在最小化或者最大化时候 , 也不作记录 ) 和当前的状态 ,
保持和取出保存信息是在 Form.Closing
和 Form.Load
中完成的
.
当 我第一次用 .Net Beta 1 版本来实现这个功能的时候 , 我发现在 Form.Load
中 恢复保存的信息的时候 , 会使窗体的 visiable 属性变化 , 但是在正式版中再没有发现这个问题 .
下面是实现 PersistWindowState
类的所有代码 :
public class PersistWindowState : System.ComponentModel.Component
{
_// event info that allows form to persist extra window state data_
_// 这是保存和恢复窗体状态的事件_
public delegate void WindowStateDelegate(object sender, RegistryKey key);
public event WindowStateDelegate LoadStateEvent;
public event WindowStateDelegate SaveStateEvent;
private Form m_parent;
private string m_regPath;
private int m_normalLeft;
private int m_normalTop;
private int m_normalWidth;
private int m_normalHeight;
private FormWindowState m_windowState;
private bool m_allowSaveMinimized = false;
public PersistWindowState()
{
}
public Form Parent
{
set
{
m_parent = value;
_// 预订所在窗体的事件_
m_parent.Closing += new System.ComponentModel.CancelEventHandler(OnClosing);
m_parent.Resize += new System.EventHandler(OnResize);
m_parent.Move += new System.EventHandler(OnMove);
m_parent.Load += new System.EventHandler(OnLoad);
_// 保存所在窗体的初始宽度和高度_
m_normalWidth = m_parent.Width;
m_normalHeight = m_parent.Height;
}
get
{
return m_parent;
}
}
public string RegistryPath
{
set
{
m_regPath = value;
}
<FONT color=#00