SDI、MDI的基本概念和实例理解
创始人
2024-06-06 07:21:42
0

SDI、MDI概述,在Windows 应用程序模型中,一般分单实例应用程序和多实例应用程序,而对于单实例应用程序常见的又有多窗口SDI应用程序和单实例MDI应用程序。下面让我们详细了解一下:
 
SDI、MDI详细介绍

《Windows Forms 2.0 Programming》一书对Windows Forms的应用程序模型进行了比较详细的介绍。下面列举两种单实例应用程序的一些特征。

一、多窗口SDI应用程序(Multiple-SDI Applications)通常具有以下特征:

只运行应用程序的单个实例;

多个顶层窗口互相独立运行;

不会重新打开当前已经加载的文件;

当最后一个窗口关闭的时候,应用程序也会退出;

有一个Window菜单允许用户查看并选择当前有效的顶层窗口。

二、单实例MDI应用程序(Single-MDI Applications)通常具有以下特征:

只运行应用程序的单个实例;

多个MDI子窗口运行在同一个的MDI父窗口中;

支持菜单合并功能,子窗口的菜单按一定规则合并到MDI父窗口菜单中;

不会重新打开当前已经加载的文件;

当最后一个MDI子窗口被关闭时,应用程序不会退出;

当MDI父窗体被关闭时,应用程序退出;

有一个Window菜单允许用户查看并选择当前已经打开的子窗口。

SDI、MDI相关概念:

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方法可以简洁的实现。

  1. public sealed class   
  2. SingleInstanceApplication : WindowsFormsApplicationBase  
  3. {  
  4. public SingleInstanceApplication() : base()  
  5. {  
  6. this.IsSingleInstance = true;  
  7. this.ShutdownStyle = ShutdownMode.AfterMainFormCloses;  
  8. }  
  9. protected override void OnCreateMainForm()  
  10. {  
  11. this.MainForm = new MainForm();  
  12. }  
  13.    
  14. protected override void   
  15. OnStartupNextInstance(StartupNextInstanceEventArgs e)  
  16. {  
  17. base.OnStartupNextInstance(e);  
  18. this.MainForm.Activate();  
  19. }  
  20. }  

SingleInstanceApplication类继承自WindowsFormsApplicationBase,在构造函数中设置为单实例模式,同时设置在主窗体关闭后退出应用程序。在继承类中,OnCreateMainForm方法被重写用来创建主窗体,如果要保证应用程序单一实例运行,还需要重写OnStartupNextInstance方法,在该应用程序的下一个应用程序实例启动时,OnStartupNextInstance方法会得到执行,在上面的实现代码中,调用基类方法同时激活主窗口。

Splash Screen

对于常见的Windows应用程序初始化过程中,可能会使用一个启动画面来显示程序的初始化进程,比如微软的Visual Studio和Office软件。WindowsFormsApplicationBase提供了SplashScreen属性或重写OnCreateSplashScreen方法来设置启动窗口。下面显示了创建SplashScreen的实现代码。

  1. application.SplashScreen = new SplashScreenForm();  

如果 SplashScreen 属性为空,那么受保护的ShowSplashScreen方法就会调用OnCreateSplashScreen方法创建初始屏幕窗口。

  1. protected override void OnCreateSplashScreen()  
  2. {  
  3. this.SplashScreen = new SplashScreenForm();  

 

也许,我们更想把SingleInstanceApplication类实现为单件模式,那可以简单的调整一下代码。

  1. public sealed class   
  2. SingleInstanceApplication :   
  3. WindowsFormsApplicationBase  
  4. {  
  5. private static readonly   
  6. SingleInstanceApplication application =   
  7. new SingleInstanceApplication();  
  8.    
  9. private SingleInstanceApplication() : base()  
  10. {  
  11. this.IsSingleInstance = true;  
  12. this.ShutdownStyle = ShutdownMode.AfterMainFormCloses;  
  13. }  
  14.    
  15. public static SingleInstanceApplication Application  
  16. {  
  17. get { return application; }  
  18. }  
  19. }  

SDI、MDI的一些延续

关于多窗口SDI应用程序和单实例MDI应用程序的一些具体实现,可以参考《Windows Forms 2.0 Programming》一书Chapter 14,作者网站上提供了该书的示例代码和关于Chapter 14的完整内容。该书由Chris Sells著作,第二版包含了很多.NET 2.0的新功能,对于windows Forms应用程序开发进行了比较详细的讲解,关于书本的更多信息可以访问Chris Sells的网站。

SDI、MDI的概念以及SDI、MDI相关的内容就向你介绍到这里,希望对你了解和学习SDI、MDI有所帮助。

【编辑推荐】

  1. 详解.NET内存管理机制与垃圾回收
  2. .Net回车符的问题解决方案
  3. Windows 7下配置.NET开发环境及激活
  4. .NET牛人应该知道些什么
  5. .NET程序中的正则表达式性能问题

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...