如何自动保存和恢复窗体的大小,位置等等的信息

内容提要 ( 译者 )

这篇文章中 , 给我们介绍了一个可以自动保存窗体状态信息的一个类 , 这个类可以从他的父窗体中预订事件 , 自动保存和恢复窗体的状态 . 实现方法可以说是非常的巧妙 , 并且非常的通用 .

文章中的代码可以从 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.LoadStateEventPersistWindowState.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.ClosingForm.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
Published At
Categories with Web编程
Tagged with
comments powered by Disqus