精华内容
下载资源
问答
  • 创建多文档界面应用程序MDI 什么是多文档界面应用程序 (MDI) : 首先介绍下什么是单文档界面应用程序 我们使用的 Windows 自带的记事本 在一个窗口中只能 打开一个文件 如果想要打开另一个文件 要么把现在这个文件...

    创建多文档界面应用程序MDI

    什么是多文档界面应用程序 (MDI) :
    首先介绍下什么是单文档界面应用程序 我们使用的 Windows 自带的记事本 在一个窗口中只能
    打开一个文件 如果想要打开另一个文件 要么把现在这个文件关掉 要么再打开一个记事本窗口
    这种应用程序就叫做单文档界面应用程序 (SDI) 而 (MDI) 就是可以在一个窗口中打开多个文件
    比如 Excel 文档

    MDI 主要由两种窗口组成 1 父窗口 2 子窗口
    父窗口可以包含菜单 是最外部的窗口 父窗口中可以包含很多子窗口
    一般的 MDI 应用程序在父窗口中都有一个 [窗口] 菜单项 用来在子窗口中切换

    MDI (多文档界面应用程序 ) 的特点
    1 启动程序时首先显示父窗体
    2 它是应用程序中所有其他窗口的容器
    3 每个应用程序只能有一个父窗体
    4 在任何指定时间都可以打开多个子窗体
    5 任何子窗体都不能移出父窗体的区域
    6 关闭父窗体所有子窗体也会被关闭

    创建 MID 应用程序
    先将主窗体的 IsMDIContainer 属性设置为 True
    在调用子窗体 show() 方法前加入一行代码
    //form2 为子窗体引用
    form2.MdiParent = this;
    在父窗体菜单中创建 [窗口] 菜单项
    将主窗体菜单控件的 MdiWindowsListItem 属性设置为 [窗口]

    参考代码:

    //主窗体 Form1
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace WindowsMDI
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void NewtsmiWindows_Click(object sender, EventArgs e)
            {
                Form2 form2 = new Form2();
                form2.MdiParent = this;
                form2.Show();
            }
        }
    }
    


     

    //Form2 子窗体
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace WindowsMDI
    {
        public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }
    
            private void Form2_Load(object sender, EventArgs e)
            {
    
            }
        }
    }
    
     


     

    展开全文
  • 5-多文档界面应用程序

    千次阅读 2007-05-18 14:19:00
    多文档界面 (MDI) 应用程序具有一个主窗口(父窗口),该窗口在其工作区内包含一组窗口(子窗口)。每个子窗口都是一个限制为只能在该父窗口内出现的窗体。这些子窗口通常共享父窗口界面的菜单栏、工具栏以及其他...

     

    多文档界面 (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);

            }
        }
    }
    展开全文
  • 单文档和多文档应用程序简介通常Windows应用程序分为三类:基于对话框的应用程序、单文档界面应用程序(SDI)和多文档界面应用程序(MDI)。单文档界面(Single-Document Interface, SDI)和多文档界面(Multi-Document...

    单文档和多文档应用程序简介

    通常Windows应用程序分为三类:基于对话框的应用程序、单文档界面应用程序(SDI)和多文档界面应用程序(MDI)。单文档界面(Single-Document Interface, SDI)和多文档界面(Multi-Document Interface, MDI)。

    单文档应用程序(MDI)是处理单一文档的应用程序,通常用于完成一个任务,使用单一的文档。此应用程序常涉及许多用户交互操作,并且能够保存或打开工作的结果。在SDI应用程序中已打开一个文件,要新建或再打开一个文件,则必须关闭当前打开的文件,才会打开新文件。如果要同时打开两个文件,则必须启动应用程序的一个新实例。Microsoft Windows中的“记事本”是单文档界面应用程序的一个典型示例。在“记事本”中,同一时间只能打开一个文档。

    多文档应用程序(MDI)是一种常用的文档程序,常用的Excel,VS应用程序都是多文档应用程序。多文档应用程序最大特点是,用户可以一次打开多个文档,每个文档对应不同的窗口。MDI应用程序允许创建一个在单个容器窗体内容纳多个窗体应用程序,每个应用程序都有一个主窗口,子窗口在主窗口中打开,主窗口的菜单会随着当前活动的子窗口的变化而变化。

     

    多文档应用程序的主窗体和子窗体

    多文档应用程序(MDI)至少由两上载然不同的窗口组成,第一个窗口叫MDI窗体容器,也叫做主窗体,它包含多个MDI子窗体,也就是可以在主窗体中显示的窗口。MDI主窗体的特点如下:

    启动MDI应用程序时,首先显示的是主窗体。
    主窗体是MDI程序的窗体窗器,该程序的所有窗体都在主窗体的界面内打开。
    每个MDI应用程序都只能有一个MDI主窗体。
    任何MDI子窗体都不能移出MDI框架区域。
    关闭MDI主窗体则自动关闭所有打开的MDI子窗体

    多文档操作MDI的属性和事件

    属性

    说明

    MdiChildren

    用于获取表示多文档界面 (MDI) 子窗体的窗体数组

    MdiParent

    用于获取或设置当前多文档界面 (MDI) 父窗体

    ActiveMdiChild

    用于获取当前活动的多文档界面 (MDI) 子窗体

    方法

    说明

    ActivateMdiChild

    用于激活子窗体

    LayoutMdi

    排列 MDI 父窗体中的多文档界面 (MDI) 子窗体

    事件

    说明

    Closed

    由用户或窗体的 Close 方法关闭窗体后,发生该事件

    Closing

    正在关闭窗体时,发生该事件

    MdiChildActivate

    在 MDI 应用程序中激活或关闭多文档界面 (MDI) 子窗体时,触发该事件

     

    展开全文
  • C# winform窗体应用程序多文档界面设计 VS2012+devExpress Ribbon布局 多文档界面 https://blog.csdn.net/qq_25473787/article/details/81208894 DotNetBar控件的多文档界面的实现 ...

    C# winform窗体应用程序多文档界面设计 VS2012+devExpress Ribbon布局 多文档界面

    https://blog.csdn.net/qq_25473787/article/details/81208894

    DotNetBar控件的多文档界面的实现

    https://blog.csdn.net/weixin_34362875/article/details/85551667

    DevExpress.XtraNavBar.NavBarControl的用法(加主菜单和子菜单)

    https://blog.csdn.net/qimeiyun/article/details/39008729

    分享在winform下实现左右布局多窗口界面-续篇

    https://blog.csdn.net/weixin_34290096/article/details/85808138

    展开全文
  • Swing实现多文档界面(MDI)应用程序

    千次阅读 2019-01-30 15:15:12
    通常情况下,在一个GUI应用程序中需要使用多个窗体,针对多窗体的应用程序,Swing提供了JDesktopPane类和JInternalFrame类(分别称为桌面面板类和内部窗体类)来实现多文档界面(MDI)应用程序。 1.1 JDesktopPane...
  • 多文档界面 (MDI) 应用程序 https://docs.microsoft.com/zh-cn/dotnet/framework/winforms/advanced/multiple-document-interface-mdi-applications (1)创建一个新的Windows应用程序,它有一个空白的窗体Form1。...
  • 第十五章 多文档界面的程序   上一章我们介绍了单文档的程序,它只能打开一个文档进行编辑,要编辑或查看另一文档,当前文档就被关闭了。多文档的应用程序象WORD,VC++本身等,都可以同时打开多个文档进行...
  • VC 开发的多文档界面源程序,多文档应用程序包含了大多数常用的功能,很有参考价值。程序测试图如下:
  • Qt多文档界面应用设计

    千次阅读 2014-12-08 17:14:44
    使用Qt编写多文档界面(MDI)应用相当方便,主要会使用到QMdiArea和QMdiSubWindow两个类。可以查看Qt Asistant中这两个类的说明文档,里面介绍的相当详细。另外,可以搜索例程"Mdi Example",这是提供的一个示例程序,...
  • 1.5 多文档MFC应用程序实例

    千次阅读 2017-05-18 14:55:20
    单文档应用程序每次只能打开一个文档窗口(例如...多文档应用程序和单文档应用程序类似,依然支持“文档/视图”结构,以做到数据与界面的分离; 多文档应用程序在打开多个文档时,每个时刻只能有一个文档处于活动状态,
  • 多文档界面设计

    千次阅读 2008-12-18 15:02:00
    前文曾提到多文档界面应用程序,什么是多文档界面呢?使用过Windows应用程序的用户可能已注意到:并非所有用户界面的外观或行为都相同。Windows窗体布局共有三种主要样式:单文档界面(Single-Document Interface, ...
  • PyQt5之多文档界面

    2020-07-27 22:18:42
    多文档界面应用程序占用较少的内存资源,子窗口都可以放在主窗口容器中,这个容器控件被称为QMdiArea。QMdiArea控件通常占据在QMainWindow对象的中央位置,可以设置任何QWidget作为子窗口对象的内部控件。 一、...
  • 第六章 多文档界面

    2017-10-25 10:08:33
     对于多文档界面应用程序有一个管理,就是为他提供一个Window菜单,这个菜单中包含一些管理这个窗口以及窗口列表的命令。激活窗口会使用一个选择标记表示出来。用户在window菜单中单击代表特定窗口的一项,就可以...
  • 首先 :我们要知道什么是多文档界面(MDI) 理论上说是“在多文档窗口环境下进行开发设计的,这种多文档界面称为多文档界面(mdi)” 通俗 的一点,我们最常见到的Excel表格就是mdi [我个人理解的图是这样的] ...
  • windows程序设计学习笔记-多文档界面

    千次阅读 2016-07-18 07:43:43
    多文档界面多文档界面是一个针对文档处理应用程序的一套规范。 MDI程序构成: 标题栏,菜单,边框。 客户区,在MDI中又称工作区,其中可有多个子窗口(文档窗口)。MDI程序特点: 1.文档窗口最小化时,变成位于...
  • 一个VC 多文档视图的应用程序实例,类似于EditPlus那种多窗口视图的程序界面,同时可打开若干个视图窗口,而互相不受影响,目前有很多使用此类窗口风格的程序。
  • 在某些情况下可以防止用户单击关闭按钮以关闭 MFC 应用程序中的框架窗口的窗口的标题栏中。 关闭按钮可以删除删除在 WS_SYSMENU 样式从帧窗口。 但是,此的 Minimize 最大化,和还原按钮也删除,并且无法添加。 这是...
  • 前面各章我们都生成对话框样式的界面,这可以方便我们学习各种常用控件的设计,本章要学习如何生成一个单文档界面应用程序,以及文档类和视图类的概念和相互关系。   本章要点 1 用AppWizard生成单文档...
  • 1.中心部件 多文档视图
  • MDI[多文档界面]

    2017-02-28 11:03:00
    多文档界面 (MDI) 应用程序使您能同时显示多个文档,每个文档显示在各自的窗口中。 MDI 应用程序中常有包含子菜单的“窗口”菜单项,用于在窗口或文档之间进行切换。 计算机中/MDI[多文档界面] 编辑 MDI(Multiple ...
  • 第十章 多文档界面

    千次阅读 2012-07-24 21:55:11
    多文档界面(MDI)是Microsoft Windows文档处理应用程序的一种规范,该规范描术了窗口结构和允许用户在单个应用程序中使用多个文档的用户界面(如字处理程序中的本文文档和电子表格程序中的电子表格)。简单地说,就像...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,318
精华内容 527
关键字:

多文档界面应用程序