Windows Forms
中SDI和MDI簡介 發布日期:2008-07-23 | 更新日期:2009-03-29作者:鄭佐
摘要:本文簡單介紹.NET Windows Forms中SDI和MDI應用程式模型和實現。
本頁內容概述SDI和MDISingle InstanceSplash Screen結束語
概述在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的網站。