5-多文檔界面應用程序

 

多文檔界面 (MDI) 應用程序具有一個主窗口(父窗口),該窗口在其工作區內包含一組窗口(子窗口)。每個子窗口都是一個限制爲只能在該父窗口內出現的窗體。這些子窗口通常共享父窗口界面的菜單欄、工具欄以及其他部分。如對話框之類的次要窗口不限制在父窗口的工作區中。

創建 MDI 應用程序
可以按下列步驟創建 MDI 應用程序:

創建一個表示 MDI 父窗口的 Form (MainForm),然後將其 IsMdiContainer 屬性設置爲 true。下面的代碼演示如何設置此屬性。

C#     this.IsMdiContainer = true;
VB     Me.IsMdiContainer = True

創建子窗體,然後設置每個窗體的 MdiParent 屬性,以引用該父窗體。

下面的代碼演示設置子窗體實例的 MDI 父窗體。

C#     doc.MdiParent = this;
VB     doc.MdiParent = Me

如果要顯示不同類型的數據,可擁有多種類型的子窗體。

若要顯示某個子窗體,請創建該子窗體的實例,然後調用其 Show 方法。

標準 MDI 菜單
通常,MDI 應用程序有一個“窗口”菜單,該菜單使用戶得以通過平鋪或層疊排列打開的子窗口。“窗口”菜單還使您得以定位到任何打開的子窗口。若要創建“窗口”菜單,請將要平鋪和層疊的菜單項添加到父窗體的“窗口”菜單中,然後將頂級“窗口”菜單的 MdiList 屬性設置爲 true。下面的代碼演示如何在 MDI 應用程序中創建 Windows(窗口)菜單。
C#  ....
//Add Window Menu
MenuItem miWindow = mainMenu.MenuItems.Add("&Window");
miWindow.MenuItems.Add("&Cascade", new EventHandler(this.WindowCascade_Clicked));
miWindow.MenuItems.Add("Tile &Horizontal", new EventHandler(this.WindowTileH_Clicked));
miWindow.MenuItems.Add("Tile &Vertical", new EventHandler(this.WindowTileV_Clicked));
miWindow.MdiList = true ; //Adds the MDI Window List to the bottom of the menu

....

protected void WindowCascade_Clicked(object sender, System.EventArgs e) {
    this.LayoutMdi(MdiLayout.Cascade);
}

protected void WindowTileH_Clicked(object sender, System.EventArgs e) {
    this.LayoutMdi(MdiLayout.TileHorizontal);
}


protected void WindowTileV_Clicked(object sender, System.EventArgs e) {
    this.LayoutMdi(MdiLayout.TileVertical);
}

....

VB   
....
'Add Window Menu
Dim miWindow As MenuItem = mainMenu.MenuItems.Add("&Window")
miWindow.MenuItems.Add("&Cascade", AddressOf Me.WindowCascade_Clicked)
miWindow.MenuItems.Add("Tile &Horizontal", AddressOf Me.WindowTileH_Clicked)
miWindow.MenuItems.Add("Tile &Vertical", AddressOf Me.WindowTileV_Clicked)
miWindow.MdiList = true  'Adds the AxHosting Window List to the bottom of the menu

....
'Window->Cascade Menu item handler
Protected Sub WindowCascade_Clicked(sender As object, e As System.EventArgs)
    Me.LayoutMdi(MdiLayout.Cascade)
End Sub

'Window->Tile Horizontally Menu item handler
Protected Sub WindowTileH_Clicked(sender As object, e As System.EventArgs)
    Me.LayoutMdi(MdiLayout.TileHorizontal)
End Sub


'Window->Tile Vertically Menu item handler
Protected Sub WindowTileV_Clicked(sender As object, e As System.EventArgs)
    Me.LayoutMdi(MdiLayout.TileVertical)
End Sub
....

子窗口激活
如果希望在用戶激活子窗口時通知父窗體,可以爲 MdiChildActivate 事件註冊一個事件處理方法。可以使用 Form 類的 ActiveMdiChild 屬性確定哪個子窗口是活動的。例如,下面的代碼用子窗口的名稱更新父窗體上的 StatusBar 控件。
.C#  ...

this.MdiChildActivate += new EventHandler(this.MdiChildActivated);

....

protected void MdiChildActivated(object sender, System.EventArgs e) {
    statusBar1.Text = this.ActiveMdiChild.Text;
}

....


.VB ...

AddHandler Me.MdiChildActivate, AddressOf Me.MdiChildActivated

....

Protected Sub MdiChildActivated(sender As object, e As System.EventArgs)
    If (Me.ActiveMdiChild <> Nothing) Then statusBar1.Text = Me.ActiveMdiChild.Text
End Sub

....

 

菜單合併
如果子窗口有一組菜單項,您希望這些菜單項都出現在父窗口的主菜單中,則可以創建作爲子窗口窗體的一部分的 MainMenu。當激活子窗口時,其 MainMenu 與父窗口的 MainMenu 合併。例如,下面的代碼爲每個子窗口創建一個 Format 菜單項。

C#
....
MainMenu mainMenu = new MainMenu();
this.Menu = mainMenu;

//Add Formatting Menu
MenuItem miFormat = mainMenu.MenuItems.Add("F&ormat (" + docName + ")");
miFormat.MergeType = MenuMerge.Add ;

//Font Face sub-menu
MenuItem miArial = new MenuItem("&Arial", new EventHandler(this.FormatFont_Clicked));
MenuItem miTimesNewRoman = new MenuItem("&Times New Roman",
                                         new EventHandler(this.FormatFont_Clicked));
MenuItem miTahoma = new MenuItem("&Courier New", new EventHandler(this.FormatFont_Clicked));
miArial.Checked = true ;
miFormatFontChecked = miArial ;
miArial.DefaultItem = true ;

miFormat.MenuItems.Add( "Font &Face"
        , new EventHandler(this.FormatFont_Clicked)
        , (new MenuItem[]{ miArial, miTimesNewRoman, miTahoma }));
....

 VB   
....
Dim mainMenu As MainMenu = New MainMenu()
Me.Menu = mainMenu

'Add Formatting Menu
Dim miFormat As MenuItem = mainMenu.MenuItems.Add("F&ormat (" + docName + ")")
miFormat.MergeType = MenuMerge.Add

'Font Face sub-menu
Dim miArial As MenuItem  = new MenuItem("&Arial", AddressOf Me.FormatFont_Clicked)
Dim miTimesNewRoman As MenuItem  = new MenuItem("&Times New Roman", _
                                                 AddressOf Me.FormatFont_Clicked)
Dim miCourier As MenuItem = new MenuItem("&Courier New", AddressOf Me.FormatFont_Clicked)
miArial.Checked = true
miFormatFontChecked = miArial
miArial.DefaultItem = true

miFormat.MenuItems.Add( "Font &Face" _
        , new EventHandler(AddressOf Me.FormatFont_Clicked)  _
        , (new MenuItem() {miArial, miTimesNewRoman, miCourier }))
....

默認情況下,子窗口菜單添加到父窗口中。可以使用 MergeOrder 和 MergeType 屬性控制如何進行合併。例如,下面的代碼創建名爲 File 的子窗口菜單項,該菜單項與父窗口的 File 菜單項合併。

C# 
....

Parent Form:

    //Add File Menu
    MenuItem miFile = mainMenu.MenuItems.Add("&File");
    miFile.MergeOrder=0;
    miFile.MergeType = MenuMerge.MergeItems;

    MenuItem miAddDoc = new MenuItem("&Add Document",
                                      new EventHandler(this.FileAdd_Clicked),
                                      Shortcut.CtrlA);
    miAddDoc.MergeOrder=100;

    MenuItem miExit = new MenuItem("E&xit",
                                    new EventHandler(this.FileExit_Clicked),
                                    Shortcut.CtrlX);
    miExit.MergeOrder=110;

    miFile.MenuItems.Add(miAddDoc);
    miFile.MenuItems.Add("-");     // Gives us a seperator
    miFile.MenuItems.Add(miExit);

....

Child Form:

    //Add File Menu
    MenuItem miFile = mainMenu.MenuItems.Add("&File");
    miFile.MergeType = MenuMerge.MergeItems;
    miFile.MergeOrder = 0;

    MenuItem miLoadDoc = miFile.MenuItems.Add( "&Load Document (" + docName + ")"
                                              , new EventHandler(this.LoadDocument_Clicked));
    miLoadDoc.MergeOrder = 105;

....

 VB
....

Parent Form:

    'Add File Menu
    Dim miFile As MenuItem = mainMenu.MenuItems.Add("&File")
    miFile.MergeOrder=0
    miFile.MergeType = MenuMerge.MergeItems

    Dim miAddDoc As MenuItem = new MenuItem("&Add Document", _
                                             new EventHandler( AddressOf Me.FileAdd_Clicked), _
                                             Shortcut.CtrlA)
    miAddDoc.MergeOrder=100

    Dim miExit As MenuItem = new MenuItem("E&xit", _
                                           new EventHandler(AddressOf Me.FileExit_Clicked), _
                                           Shortcut.CtrlX)
    miExit.MergeOrder=110

    miFile.MenuItems.Add(miAddDoc)
    miFile.MenuItems.Add("-")     ' Gives us a seperator
    miFile.MenuItems.Add(miExit)

....

Child Form:

    'Add File Menu
    Dim miFile As MenuItem = mainMenu.MenuItems.Add("&File")
    miFile.MergeType = MenuMerge.MergeItems
    miFile.MergeOrder = 0

    Dim miLoadDoc As MenuItem = miFile.MenuItems.Add( "&Load Document (" + docName + ")", _
                                                       AddressOf Me.LoadDocument_Clicked)
    miLoadDoc.MergeOrder = 105

....

 

一個簡單的 MDI 應用程序 

Imports System Imports System.ComponentModel
Imports System.Drawing
Imports System.Windows.Forms

Namespace Microsoft.Samples.WinForms.VB.MDI

    Public Class MainForm
        Inherits System.Windows.Forms.Form

        Private windowCount As Integer = 0

        Public Sub New()

            MyBase.New()

            MainForm = Me

            '此調用是 Windows 窗體設計器所必需的。
            InitializeComponent()

            '設置 MDI 資料
            Me.IsMdiContainer = True

            '添加“文件”菜單
            Dim miFile As MenuItem = MainMenu.MenuItems.Add("文件(&F)")
            miFile.MergeOrder = 0
            miFile.MergeType = MenuMerge.MergeItems

            Dim miAddDoc As MenuItem = New MenuItem("添加文檔(&A)", New EventHandler(AddressOf Me.FileAdd_Clicked), Shortcut.CtrlA)
            miAddDoc.MergeOrder = 100

            Dim miExit As MenuItem = New MenuItem("退出(&X)", New EventHandler(AddressOf Me.FileExit_Clicked), Shortcut.CtrlX)
            miExit.MergeOrder = 110

            miFile.MenuItems.Add(miAddDoc)
            miFile.MenuItems.Add("-")     ' 提供一個分隔符
            miFile.MenuItems.Add(miExit)

            '添加“窗口”菜單
            Dim miWindow As MenuItem = MainMenu.MenuItems.Add("窗口(&W)")
            miWindow.MergeOrder = 10
            miWindow.MenuItems.Add("層疊(&C)", New EventHandler(AddressOf Me.WindowCascade_Clicked))
            miWindow.MenuItems.Add("水平平鋪(&H)", New EventHandler(AddressOf Me.WindowTileH_Clicked))
            miWindow.MenuItems.Add("垂直平鋪(&V)", New EventHandler(AddressOf Me.WindowTileV_Clicked))
            miWindow.MdiList = True  '向菜單底部添加 MDI 窗口列表


            AddDocument() '添加初始文檔
        End Sub


        '添加瀏覽器文檔
        Private Sub AddDocument()
            windowCount = windowCount + 1
            '創建窗體
            Dim doc As Document = New Document("文檔" + windowCount.ToString())
            doc.MdiParent = Me                   '向該窗體設置其 MDI 父級
            doc.Show()                           '顯示窗體
        End Sub


        '“文件”->“添加”菜單項處理程序
        Private Sub FileAdd_Clicked(ByVal sender As Object, ByVal e As System.EventArgs)
            AddDocument()
        End Sub


        '“文件”->“退出”菜單項處理程序
        Private Sub FileExit_Clicked(ByVal sender As Object, ByVal e As System.EventArgs)
            Me.Close()
        End Sub


        '已激活其中一個 MDI 子窗口 - 將狀態欄
        '文本設置到窗口標題
        Private Sub MDIChildActivated(ByVal sender As Object, ByVal e As System.EventArgs) Handles MainForm.MDIChildActivate
            If (Me.ActiveMdiChild Is Nothing) Then
                statusBar1.Text = ""
            Else
                statusBar1.Text = Me.ActiveMdiChild.Text
            End If
        End Sub

        '“窗口”->“層疊”菜單項處理程序
        Private Sub WindowCascade_Clicked(ByVal sender As Object, ByVal e As System.EventArgs)
            Me.LayoutMdi(MdiLayout.Cascade)
        End Sub


        '“窗口”->“水平平鋪”菜單項處理程序
        Private Sub WindowTileH_Clicked(ByVal sender As Object, ByVal e As System.EventArgs)
            Me.LayoutMdi(MdiLayout.TileHorizontal)
        End Sub


        '“窗口”->“垂直平鋪”菜單項處理程序
        Private Sub WindowTileV_Clicked(ByVal sender As Object, ByVal e As System.EventArgs)
            Me.LayoutMdi(MdiLayout.TileVertical)
        End Sub

        '窗體重寫 dispose 以清理組件列表。
        Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
            If disposing Then
                If Not (components Is Nothing) Then
                    components.Dispose()
                End If
            End If
            MyBase.Dispose(disposing)
        End Sub


#Region " Windows 窗體設計器生成的代碼 "

        'Windows 窗體設計器所必需的
        Private components As System.ComponentModel.Container

        Private WithEvents mainMenu As System.Windows.Forms.MainMenu
        Private WithEvents statusBar1 As System.Windows.Forms.StatusBar

        Private WithEvents MainForm As System.Windows.Forms.Form

        '注意:下面的過程是 Windows 窗體設計器所必需的
        '可以使用 Windows 窗體設計器修改它。
        '不要使用代碼編輯器修改它。
        Private Sub InitializeComponent()
            Me.components = New System.ComponentModel.Container()
            Me.mainMenu = New System.Windows.Forms.MainMenu()
            Me.statusBar1 = New System.Windows.Forms.StatusBar()

            Me.Text = "MDI 示例"
            Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
            Me.Menu = mainMenu
            Me.ClientSize = New System.Drawing.Size(450, 200)

            statusBar1.BackColor = System.Drawing.SystemColors.Control
            statusBar1.Location = New System.Drawing.Point(0, 180)
            statusBar1.Size = New System.Drawing.Size(450, 20)
            statusBar1.TabIndex = 1
            Me.Controls.Add(statusBar1)
        End Sub

#End Region

        '運行此應用程序
        '應用程序的主入口點
        <STAThread()> Shared Sub Main()
            System.Windows.Forms.Application.Run(New MainForm())
        End Sub

    End Class

End NameSpace


-----Imports System Imports System.ComponentModel
Imports System.Drawing
Imports System.Drawing.Text
Imports System.Windows.Forms

Namespace Microsoft.Samples.WinForms.VB.MDI

    Public Class Document
        Inherits System.Windows.Forms.Form

        Private Class FontSizes
            Public Shared Small As Single = 8F
            Public Shared Medium As Single = 12F
            Public Shared Large As Single = 24F
        End Class

        Private fontSize As Single = FontSizes.Medium

        Private miFormatFontChecked As System.Windows.Forms.MenuItem
        Private miFormatSizeChecked As System.Windows.Forms.MenuItem

        Private miSmall As MenuItem
        Private miMedium As MenuItem
        Private miLarge As MenuItem

        Private miSansSerif As MenuItem
        Private miSerif As MenuItem
        Private miMonoSpace As MenuItem

        private currentFontFamily As FontFamily
        private monoSpaceFontFamily As FontFamily
        private sansSerifFontFamily As FontFamily
        private serifFontFamily As FontFamily

        Public Sub New(ByVal docName As String)

            MyBase.New()

            Document = Me

            '此調用是 Windows 窗體設計器所必需的。
            InitializeComponent()

            '初始化字體 - 使用一般字體以避免在操作
            '系統的不同版本之間出現問題
            monoSpaceFontFamily = new FontFamily (GenericFontFamilies.Monospace)
            sansSerifFontFamily = new FontFamily (GenericFontFamilies.SansSerif)
            serifFontFamily = new FontFamily (GenericFontFamilies.Serif)
            currentFontFamily = sansSerifFontFamily


            Me.Text = docName

            richTextBox1.Text = docName
            richTextBox1.Font = New System.Drawing.Font(currentFontFamily, fontSize)

            '添加“文件”菜單
            Dim miFile As MenuItem = MainMenu.MenuItems.Add("文件(&F)")
            miFile.MergeType = MenuMerge.MergeItems
            miFile.MergeOrder = 0

            Dim miLoadDoc As MenuItem = miFile.MenuItems.Add("加載文檔 ((&L)" + docName + ")", new EventHandler(AddressOf Me.LoadDocument_Clicked))
            miLoadDoc.MergeOrder = 105

            '添加“格式”菜單
            Dim miFormat As MenuItem = MainMenu.MenuItems.Add("格式 ((&O)" + docName + ")")
            miFormat.MergeType = MenuMerge.Add
            miFormat.MergeOrder = 5

            '“字體外觀”子菜單
            miSansSerif = New MenuItem("1.(&1)" + sansSerifFontFamily.Name, new EventHandler(AddressOf Me.FormatFont_Clicked))
            miSerif = New MenuItem("2.(&2)" + serifFontFamily.Name, new EventHandler(AddressOf Me.FormatFont_Clicked))
            miMonoSpace = New MenuItem("3.(&3)" + monoSpaceFontFamily.Name, new EventHandler(AddressOf Me.FormatFont_Clicked))
            miSansSerif.Checked = True
            miFormatFontChecked = miSansSerif
            miSansSerif.DefaultItem = True

            miFormat.MenuItems.Add("字體外觀(&F)" _
            , (New MenuItem() {miSansSerif, miSerif, miMonoSpace}))

            '“字體大小”子菜單
            miSmall = New MenuItem("小(&S)", new EventHandler(AddressOf Me.FormatSize_Clicked))
            miMedium = New MenuItem("中(&M)", new EventHandler(AddressOf Me.FormatSize_Clicked))
            miLarge = New MenuItem("大(&L)", new EventHandler(AddressOf Me.FormatSize_Clicked))
            miMedium.Checked = True
            miMedium.DefaultItem = True
            miFormatSizeChecked = miMedium

            miFormat.MenuItems.Add("字體大小(&S)" _
            , (New MenuItem() {miSmall, miMedium, miLarge}))

        End Sub

        '“文件”->“加載文檔”菜單項處理程序
        Protected Sub LoadDocument_Clicked(ByVal sender As Object, ByVal e As System.EventArgs)
            MessageBox.Show(Me.Text)
        End Sub


        '“格式”->“字體”菜單項處理程序
        Protected Sub FormatFont_Clicked(ByVal sender As Object, ByVal e As System.EventArgs)
            Dim miClicked As MenuItem = CType(sender, MenuItem)
            miClicked.Checked = True
            miFormatFontChecked.Checked = False
            miFormatFontChecked = miClicked

            If (miClicked Is miSansSerif) Then
                currentFontFamily = sansSerifFontFamily
            ElseIf (miClicked Is miSerif) Then
                currentFontFamily = serifFontFamily
            Else
                currentFontFamily = monoSpaceFontFamily
            End If

            richTextBox1.Font = new Font(currentFontFamily, fontSize)
        End Sub

        '“格式”->“大小”菜單項處理程序
        Protected Sub FormatSize_Clicked(ByVal sender As Object, ByVal e As System.EventArgs)
            Dim miClicked As MenuItem = CType(sender, MenuItem)
            miClicked.Checked = True
            miFormatSizeChecked.Checked = False
            miFormatSizeChecked = miClicked
            If (miClicked Is miSmall) Then
                fontSize = FontSizes.Small
            ElseIf (miClicked Is miLarge) Then
                fontSize = FontSizes.Large
            Else
                fontSize = FontSizes.Medium
            End IF

            richTextBox1.Font = New Font(currentFontFamily, fontSize)
        End Sub

        '窗體重寫 dispose 以清理組件列表。
        Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
            If disposing Then
                If Not (components Is Nothing) Then
                    components.Dispose()
                End If
            End If
            MyBase.Dispose(disposing)
        End Sub


#Region " Windows 窗體設計器生成的代碼 "

        'Windows 窗體設計器所必需的
        Private components As System.ComponentModel.Container
        Private WithEvents richTextBox1 As System.Windows.Forms.RichTextBox
        Private WithEvents mainMenu As System.Windows.Forms.MainMenu

        Private WithEvents Document As System.Windows.Forms.Form

        '注意:下面的過程是 Windows 窗體設計器所必需的
        '可以使用 Windows 窗體設計器修改它。
        '不要使用代碼編輯器修改它。
        Private Sub InitializeComponent()
            Me.components = New System.ComponentModel.Container()
            Me.richTextBox1 = New System.Windows.Forms.RichTextBox()
            Me.mainMenu = New System.Windows.Forms.MainMenu()
            Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
            Me.Menu = mainMenu
            Me.ClientSize = New System.Drawing.Size(392, 117)

            richTextBox1.Size = New System.Drawing.Size(292, 273)
            richTextBox1.Dock = System.Windows.Forms.DockStyle.Fill
            richTextBox1.TabIndex = 0
            Me.Controls.Add(richTextBox1)
        End Sub

#End Region

    End Class

End Namespace

 ----------------------
namespace Microsoft.Samples.WinForms.Cs.MDI {
    using System;
    using System.ComponentModel;
    using System.Drawing;
    using System.Windows.Forms;

    public class MainForm : System.Windows.Forms.Form {
        /// <summary>
        ///    必需的設計器變量。
        /// </summary>
        private System.ComponentModel.Container components;
        private System.Windows.Forms.MainMenu mainMenu;
        protected internal System.Windows.Forms.StatusBar statusBar1;

        private int windowCount = 0 ;

        public MainForm() {

            //
            // Windows 窗體設計器支持所必需的
            //
            InitializeComponent();

            //設置 MDI 資料
            this.IsMdiContainer = true;
            this.MdiChildActivate += new EventHandler(this.MDIChildActivated);

            //添加“文件”菜單
            MenuItem miFile = mainMenu.MenuItems.Add("文件(&F)");
            miFile.MergeOrder=0;
            miFile.MergeType = MenuMerge.MergeItems;

            MenuItem miAddDoc = new MenuItem("添加文檔(&A)", new EventHandler(this.FileAdd_Clicked), Shortcut.CtrlA);
            miAddDoc.MergeOrder=100;

            MenuItem miExit = new MenuItem("退出(&X)", new EventHandler(this.FileExit_Clicked), Shortcut.CtrlX);
            miExit.MergeOrder=110;

            miFile.MenuItems.Add(miAddDoc);
            miFile.MenuItems.Add("-");     // Gives us a seperator
            miFile.MenuItems.Add(miExit);

            //添加“窗口”菜單
            MenuItem miWindow = mainMenu.MenuItems.Add("窗口(&W)");
            miWindow.MergeOrder = 10;
            miWindow.MenuItems.Add("層疊(&C)", new EventHandler(this.WindowCascade_Clicked));
            miWindow.MenuItems.Add("水平平鋪(&H)", new EventHandler(this.WindowTileH_Clicked));
            miWindow.MenuItems.Add("垂直平鋪(&V)", new EventHandler(this.WindowTileV_Clicked));
            miWindow.MdiList = true ; //向菜單底部添加 MDI 窗口列表

            AddDocument(); //添加初始文檔
        }


        //添加文檔
        private void AddDocument() {
            windowCount++ ;
            Document doc = new Document("文檔" + windowCount);
            doc.MdiParent = this;
            doc.Show();
        }


        //“文件”->“添加”菜單項處理程序
        protected void FileAdd_Clicked(object sender, System.EventArgs e) {
            AddDocument() ;
        }


        //“文件”->“退出”菜單項處理程序
        protected void FileExit_Clicked(object sender, System.EventArgs e) {
            this.Close();
        }


        //已激活其中一個 MDI 子窗口
        protected void MDIChildActivated(object sender, System.EventArgs e) {
            if (null == this.ActiveMdiChild) {
                statusBar1.Text = "";
            } else {
                statusBar1.Text = this.ActiveMdiChild.Text;
            }
        }

        //“窗口”->“層疊”菜單項處理程序
        protected void WindowCascade_Clicked(object sender, System.EventArgs e) {
            this.LayoutMdi(MdiLayout.Cascade);
        }


        //“窗口”->“水平平鋪”菜單項處理程序
        protected void WindowTileH_Clicked(object sender, System.EventArgs e) {
            this.LayoutMdi(MdiLayout.TileHorizontal);
        }


        //“窗口”->“垂直平鋪”菜單項處理程序
        protected void WindowTileV_Clicked(object sender, System.EventArgs e) {
            this.LayoutMdi(MdiLayout.TileVertical);
        }

        /// <summary>
        ///    清理正在使用的所有資源。
        /// </summary>
        protected override void Dispose(bool disposing)
        {
           if (disposing) {
                if (components != null) {
                    components.Dispose();
                }
           }
           base.Dispose(disposing);
        }


        /// <summary>
        ///    設計器支持所必需的方法,不要使用
        ///    代碼編輯器修改此方法的內容。
        /// </summary>
        protected void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container ();
            this.mainMenu = new System.Windows.Forms.MainMenu ();
            this.statusBar1 = new System.Windows.Forms.StatusBar ();
            this.Text = "MDI 示例";
            this.AutoScaleBaseSize = new System.Drawing.Size (5, 13);
            this.Menu = this.mainMenu;
            this.ClientSize = new System.Drawing.Size (450, 200);
            statusBar1.BackColor = System.Drawing.SystemColors.Control;
            statusBar1.Location = new System.Drawing.Point (0, 180);
            statusBar1.Size = new System.Drawing.Size (450, 20);
            statusBar1.TabIndex = 1;
            this.Controls.Add (this.statusBar1);
        }

        /// <summary>
        /// 應用程序的主入口點。
        /// </summary>
        [STAThread]
        public static void Main(string[] args) {
            Application.Run(new MainForm());
        }

    }
}
--------------------------------
namespace Microsoft.Samples.WinForms.Cs.MDI {
    using System;
    using System.ComponentModel;
    using System.Drawing;
    using System.Drawing.Text;
    using System.Windows.Forms;

    public class Document : System.Windows.Forms.Form {
        /// <summary>
        ///    必需的設計器變量。
        /// </summary>
        private System.ComponentModel.Container components;
        private System.Windows.Forms.MainMenu mainMenu;
        protected internal System.Windows.Forms.RichTextBox richTextBox1;

        private struct FontSizes {
            public static float Small = 8f;
            public static float Medium = 12f;
            public static float Large = 24f;
        }

        private float fontSize = FontSizes.Medium;

        private MenuItem miFormatFontChecked;
        private MenuItem miFormatSizeChecked;

        private MenuItem miSmall ;
        private MenuItem miMedium ;
        private MenuItem miLarge ;

        private MenuItem miSansSerif ;
        private MenuItem miSerif ;
        private MenuItem miMonoSpace ;

        private FontFamily currentFontFamily ;
        private FontFamily monoSpaceFontFamily;
        private FontFamily sansSerifFontFamily;
        private FontFamily serifFontFamily;

        public Document(string docName) : base() {

            //
            // Windows 窗體設計器支持所必需的
            //
            InitializeComponent();

            // 初始化字體 - 使用一般字體以避免在操作
            // 系統的不同版本之間出現問題
            monoSpaceFontFamily = new FontFamily (GenericFontFamilies.Monospace);
            sansSerifFontFamily = new FontFamily (GenericFontFamilies.SansSerif);
            serifFontFamily = new FontFamily (GenericFontFamilies.Serif);
            currentFontFamily = sansSerifFontFamily;

            this.Text = docName;

            richTextBox1.Font = new System.Drawing.Font(currentFontFamily, fontSize);
            richTextBox1.Text = docName;

            //添加“文件”菜單
            MenuItem miFile = mainMenu.MenuItems.Add("文件(&F)");
            miFile.MergeType = MenuMerge.MergeItems;
            miFile.MergeOrder = 0;

            MenuItem miLoadDoc = miFile.MenuItems.Add("加載文檔 ((&L)" + docName + ")", new EventHandler(this.LoadDocument_Clicked));
            miLoadDoc.MergeOrder = 105;

            //添加“格式”菜單
            MenuItem miFormat = mainMenu.MenuItems.Add("格式 ((&O)" + docName + ")");
            miFormat.MergeType = MenuMerge.Add;
            miFormat.MergeOrder = 5;

            //“字體外觀”子菜單
            miSansSerif = new MenuItem("1.(&1)" + sansSerifFontFamily.Name, new EventHandler(this.FormatFont_Clicked));
            miSerif = new MenuItem("2.(&2)" + serifFontFamily.Name, new EventHandler(this.FormatFont_Clicked));
            miMonoSpace = new MenuItem("3.(&3)" + monoSpaceFontFamily.Name, new EventHandler(this.FormatFont_Clicked));
            miSansSerif.Checked = true ;
            miFormatFontChecked = miSansSerif ;
            miSansSerif.DefaultItem = true ;

            miFormat.MenuItems.Add( "字體外觀(&F)"
                        , (new MenuItem[]{ miSansSerif, miSerif, miMonoSpace })
                        );

            //“字體大小”子菜單
            miSmall = new MenuItem("小(&S)", new EventHandler(this.FormatSize_Clicked));
            miMedium = new MenuItem("中(&M)", new EventHandler(this.FormatSize_Clicked));
            miLarge = new MenuItem("大(&L)", new EventHandler(this.FormatSize_Clicked));
            miMedium.Checked = true ;
            miMedium.DefaultItem = true ;
            miFormatSizeChecked = miMedium ;

            miFormat.MenuItems.Add( "字體大小(&S)"
                        , (new MenuItem[]{ miSmall, miMedium, miLarge })
                        );
        }

        //“文件”->“加載文檔”菜單項處理程序
        protected void LoadDocument_Clicked(object sender, System.EventArgs e)
        {
            MessageBox.Show(this.Text) ;
        }

        //“格式”->“字體”菜單項處理程序
        protected void FormatFont_Clicked(object sender, System.EventArgs e) {
            MenuItem miClicked = (MenuItem)sender;
            miClicked.Checked = true;
            miFormatFontChecked.Checked = false;
            miFormatFontChecked = miClicked ;

            if (miClicked == miSansSerif) {
                currentFontFamily = sansSerifFontFamily ;
            } else if (miClicked == miSerif) {
                currentFontFamily = serifFontFamily ;
            } else {
                currentFontFamily = monoSpaceFontFamily ;
            }

            richTextBox1.Font = new Font(currentFontFamily, fontSize);
        }

        //“格式”->“大小”菜單項處理程序
        protected void FormatSize_Clicked(object sender, System.EventArgs e) {
            MenuItem miClicked = (MenuItem)sender;
            miClicked.Checked = true;
            miFormatSizeChecked.Checked = false;
            miFormatSizeChecked = miClicked;

            if (miClicked == miSmall) {
                fontSize = FontSizes.Small ;
            } else if (miClicked == miLarge) {
                fontSize = FontSizes.Large ;
            } else {
                fontSize = FontSizes.Medium ;
            }

            richTextBox1.Font = new Font(currentFontFamily, fontSize);
        }

        /// <summary>
        ///    清理正在使用的所有資源。
        /// </summary>
        protected override void Dispose(bool disposing)
        {
           if (disposing) {
                if (components != null) {
                    components.Dispose();
                }
           }
           base.Dispose(disposing);
        }

        /// <summary>
        ///    設計器支持所必需的方法,不要使用
        ///    代碼編輯器修改此方法的內容。
        /// </summary>
        private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();

            this.richTextBox1 = new System.Windows.Forms.RichTextBox();
            this.mainMenu = new System.Windows.Forms.MainMenu();

            richTextBox1.Text = "";
            richTextBox1.Size = new System.Drawing.Size(292, 273);
            richTextBox1.TabIndex = 0;
            richTextBox1.Dock = System.Windows.Forms.DockStyle.Fill;

            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.Text = "";
            this.ClientSize = new System.Drawing.Size(392, 117);
            this.Menu = mainMenu;

            this.Controls.Add(richTextBox1);

        }
    }
}
發佈了60 篇原創文章 · 獲贊 2 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章