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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章