SDI、MDI的基本概念和實例理解
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方法可以簡潔的實現。
- 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的一些延續
關于多窗口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有所幫助。
【編輯推薦】