Windows Forms中SDI和MDI简介

Windows Forms 中SDI和MDI简介
 
发布日期:2008-07-23 | 更新日期:2009-03-29
作者:郑佐

摘要: 本文简单介绍.NET Windows Forms中SDI和MDI应用程序模型和实现。
 
本页内容
 
概述
在Windows 应用程序模型中,一般分单实例应用程序和多实例应用程序,而对于单实例应用程序常见的又有多窗口SDI应用程序和单实例MDI应用程序。
 
SDI 和MDI
《Windows Forms 2.0 Programming》一书对Windows Forms的应用程序模型进行了比较详细的介绍。下面列举两种单实例应用程序的一些特征。
a. 多窗口SDI应用程序(Multiple-SDI Applications)通常具有以下特征:
只运行应用程序的单个实例;
多个顶层窗口互相独立运行;
不会重新打开当前已经加载的文件;
当最后一个窗口关闭的时候,应用程序也会退出;
有一个Window菜单允许用户查看并选择当前有效的顶层窗口。
 
b. 单实例MDI应用程序(Single-MDI Applications)通常具有以下特征:
只运行应用程序的单个实例;
多个MDI子窗口运行在同一个的MDI父窗口中;
支持菜单合并功能,子窗口的菜单按一定规则合并到MDI父窗口菜单中;
不会重新打开当前已经加载的文件;
当最后一个MDI子窗口被关闭时,应用程序不会退出;
当MDI父窗体被关闭时,应用程序退出;
有一个Window菜单允许用户查看并选择当前已经打开的子窗口。
 
Single Instance
在.NET 2.0中,FCL提供了WindowsFormsApplicationBase类来简化Windows应用程序编程,如果您是开发人员会感到感到奇怪,WindowsFormsApplicationBase类不在System.Windows.Forms 命名空间中而是属于Microsoft.VisualBasic.ApplicationServices 命名空间,也许这是作为VB.NET开发人员的优先好处吧。该类对应的程序集为Microsoft.VisualBasic.dll,不过该程序集包含在.NET框架中一起发布,如果要引用该程序集,在部署上不存在额外操作。
 
WindowsFormsApplicationBase 类实现了类似于Application类的一些功能,不过该类还包含一些简化Windows Forms应用程序开发的接口,下面来简单了解一下。
 
WindowsFormsApplicationBase 类实现了对单实例应用程序的支持,通过设置IsSingleInstance 属性为True以及重写 OnStartupNextInstance 方法可以简洁的实现。
public  sealed class SingleInstanceApplication : WindowsFormsApplicationBase
{
    public SingleInstanceApplication() : base()
    {
        this.IsSingleInstance = true;
        this.ShutdownStyle = ShutdownMode.AfterMainFormCloses;
    }
    protected override void OnCreateMainForm()
    {
        this.MainForm = new MainForm();
    }
 
    protected override void OnStartupNextInstance(StartupNextInstanceEventArgs e)
    {
        base.OnStartupNextInstance(e);
        this.MainForm.Activate();
    }
}
 
SingleInstanceApplication 类继承自WindowsFormsApplicationBase,在构造函数中设置为单实例模式,同时设置在主窗体关闭后退出应用程序。在继承类中, OnCreateMainForm 方法被重写用来创建主窗体,如果要保证应用程序单一实例运行,还需要重写OnStartupNextInstance方法,在该应用程序的下一个应用程序实例启动时,OnStartupNextInstance方法会得到执行,在上面的实现代码中,调用基类方法同时激活主窗口。
 
Splash Screen
对于常见的Windows应用程序初始化过程中,可能会使用一个启动画面来显示程序的初始化进程,比如微软的Visual Studio和Office软件。 WindowsFormsApplicationBase 提供了SplashScreen属性或重写 OnCreateSplashScreen 方法来设置启动窗口。下面显示了创建SplashScreen的实现代码。
application.SplashScreen = new SplashScreenForm();
 
如果 SplashScreen 属性为空,那么受保护的ShowSplashScreen方法就会调用OnCreateSplashScreen方法创建初始屏幕窗口。
protected  override void OnCreateSplashScreen()
{
    this.SplashScreen = new SplashScreenForm();
}
 
也许,我们更想把SingleInstanceApplication类实现为单件模式,那可以简单的调整一下代码。
public  sealed class SingleInstanceApplication : WindowsFormsApplicationBase
{
    private static readonly SingleInstanceApplication application = new SingleInstanceApplication();
 
    private SingleInstanceApplication() : base()
    {
        this.IsSingleInstance = true;
        this.ShutdownStyle = ShutdownMode.AfterMainFormCloses;
    }
 
    public static SingleInstanceApplication Application
    {
        get { return application; }
    }
}
 
结束语
关于多窗口SDI应用程序和单实例MDI应用程序的一些具体实现,可以参考《Windows Forms 2.0 Programming》一书Chapter 14,作者网站上提供了该书的示例代码和关于Chapter 14的完整内容。该书由Chris Sells著作,第二版包含了很多.NET 2.0的新功能,对于windows Forms应用程序开发进行了比较详细的讲解,关于书本的更多信息可以访问Chris Sells的 网站

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值