SDI、MDI的基本概念和實例理解
SDI、MDI概述,在Windows 應(yīng)用程序模型中,一般分單實例應(yīng)用程序和多實例應(yīng)用程序,而對于單實例應(yīng)用程序常見的又有多窗口SDI應(yīng)用程序和單實例MDI應(yīng)用程序。下面讓我們詳細了解一下:
SDI、MDI詳細介紹
《Windows Forms 2.0 Programming》一書對Windows Forms的應(yīng)用程序模型進行了比較詳細的介紹。下面列舉兩種單實例應(yīng)用程序的一些特征。
一、多窗口SDI應(yīng)用程序(Multiple-SDI Applications)通常具有以下特征:
只運行應(yīng)用程序的單個實例;
多個頂層窗口互相獨立運行;
不會重新打開當前已經(jīng)加載的文件;
當最后一個窗口關(guān)閉的時候,應(yīng)用程序也會退出;
有一個Window菜單允許用戶查看并選擇當前有效的頂層窗口。
二、單實例MDI應(yīng)用程序(Single-MDI Applications)通常具有以下特征:
只運行應(yīng)用程序的單個實例;
多個MDI子窗口運行在同一個的MDI父窗口中;
支持菜單合并功能,子窗口的菜單按一定規(guī)則合并到MDI父窗口菜單中;
不會重新打開當前已經(jīng)加載的文件;
當最后一個MDI子窗口被關(guān)閉時,應(yīng)用程序不會退出;
當MDI父窗體被關(guān)閉時,應(yīng)用程序退出;
有一個Window菜單允許用戶查看并選擇當前已經(jīng)打開的子窗口。
SDI、MDI相關(guān)概念:
Single Instance
在.NET 2.0中,F(xiàn)CL提供了WindowsFormsApplicationBase類來簡化Windows應(yīng)用程序編程,如果您是開發(fā)人員會感到感到奇怪,WindowsFormsApplicationBase類不在System.Windows.Forms 命名空間中而是屬于Microsoft.VisualBasic.ApplicationServices 命名空間,也許這是作為VB.NET開發(fā)人員的優(yōu)先好處吧。該類對應(yīng)的程序集為Microsoft.VisualBasic.dll,不過該程序集包含在.NET框架中一起發(fā)布,如果要引用該程序集,在部署上不存在額外操作。
WindowsFormsApplicationBase類實現(xiàn)了類似于Application類的一些功能,不過該類還包含一些簡化Windows Forms應(yīng)用程序開發(fā)的接口,下面來簡單了解一下。WindowsFormsApplicationBase類實現(xiàn)了對單實例應(yīng)用程序的支持,通過設(shè)置IsSingleInstance 屬性為True以及重寫OnStartupNextInstance方法可以簡潔的實現(xiàn)。
- 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,在構(gòu)造函數(shù)中設(shè)置為單實例模式,同時設(shè)置在主窗體關(guān)閉后退出應(yīng)用程序。在繼承類中,OnCreateMainForm方法被重寫用來創(chuàng)建主窗體,如果要保證應(yīng)用程序單一實例運行,還需要重寫OnStartupNextInstance方法,在該應(yīng)用程序的下一個應(yīng)用程序?qū)嵗龁訒r,OnStartupNextInstance方法會得到執(zhí)行,在上面的實現(xiàn)代碼中,調(diào)用基類方法同時激活主窗口。
Splash Screen
對于常見的Windows應(yīng)用程序初始化過程中,可能會使用一個啟動畫面來顯示程序的初始化進程,比如微軟的Visual Studio和Office軟件。WindowsFormsApplicationBase提供了SplashScreen屬性或重寫OnCreateSplashScreen方法來設(shè)置啟動窗口。下面顯示了創(chuàng)建SplashScreen的實現(xiàn)代碼。
- application.SplashScreen = new SplashScreenForm();
如果 SplashScreen 屬性為空,那么受保護的ShowSplashScreen方法就會調(diào)用OnCreateSplashScreen方法創(chuàng)建初始屏幕窗口。
- protected override void OnCreateSplashScreen()
- {
- this.SplashScreen = new SplashScreenForm();
- }
也許,我們更想把SingleInstanceApplication類實現(xiàn)為單件模式,那可以簡單的調(diào)整一下代碼。
- 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的一些延續(xù)
關(guān)于多窗口SDI應(yīng)用程序和單實例MDI應(yīng)用程序的一些具體實現(xiàn),可以參考《Windows Forms 2.0 Programming》一書Chapter 14,作者網(wǎng)站上提供了該書的示例代碼和關(guān)于Chapter 14的完整內(nèi)容。該書由Chris Sells著作,第二版包含了很多.NET 2.0的新功能,對于windows Forms應(yīng)用程序開發(fā)進行了比較詳細的講解,關(guān)于書本的更多信息可以訪問Chris Sells的網(wǎng)站。
SDI、MDI的概念以及SDI、MDI相關(guān)的內(nèi)容就向你介紹到這里,希望對你了解和學(xué)習(xí)SDI、MDI有所幫助。
【編輯推薦】