如何:创建 MDI 子窗体

MDI 子窗体是多文档界面 (MDI) 应用程序的基本元素,因为这些窗体是用户交互的中心。

在下面的过程中,将使用 Visual Studio 创建显示 RichTextBox 控件的 MDI 子窗体,它和大多数文字处理应用程序类似。 将 System.Windows.Forms 控件替换为其他控件(如 DataGridView 控件或混合控件),可创建各种可能的 MDI 子窗口(并且进一步扩展为 MDI 应用程序)。

创建 MDI 子窗体

  1. 在 Visual Studio 中创建新的 Windows 窗体应用程序项目。 在窗体的“属性”窗口中,将它的 IsMdiContainer 属性设置为 true,并将 WindowsState 属性设置为 Maximized

    这将该表单指定为适合子窗口的 MDI 容器。

  2. MenuStrip 控件从 Toolbox 中拖到窗体上。 将 Text 属性设置为“文件”

  3. 单击“项”属性旁边的省略号 (...),然后单击“添加”以添加两个子工具条菜单项。 将这些项的 Text 属性设置为“新建”和“窗口”

  4. 在“解决方案资源管理器” 中,右键单击项目,然后选择“添加” >“新项” 。

  5. 在“添加新项”对话框中,选择“Windows 窗体”(采用 Visual Basic 或 Visual C# 时)或从“模板”窗格中选择“Windows 窗体应用程序 (.NET)”(采用 Visual C++ 时)。 在“名称”框中,将窗体命名为 Form2。 选择“打开”,将窗体添加到项目中

    注意

    在此步骤中创建的 MDI 子窗体是标准的 Windows 窗体。 因此,它具有 Opacity 属性,该属性允许你控制窗体的透明度。 但是,Opacity 属性旨在用于顶级窗口。 不要将其与 MDI 子窗体同时使用,否则可能会引起绘制问题。

    此窗体将作为 MDI 子窗体的模板。

    随即会打开“Windows 窗体设计器”,显示 Form2

  6. 将 RichTextBox 控件从“工具箱”中拖到窗体上

  7. 在“属性”窗口中,将 Anchor 属性设置为“上,左”,并将 Dock 属性设置为“填充”

    这导致即使在调整 MDI 子窗体的大小,RichTextBox 控件也会完全填充该窗体的区域。

  8. 双击“新建”菜单项创建此控件的 Click 事件处理程序

  9. 插入与下面的代码相似的代码,以便在用户单击“新建”菜单项时创建新的 MDI 子窗体

    注意

    在下面的示例中,事件处理程序处理 MenuItem2Click 事件。 请注意,你的“新建”菜单项可能不是 MenuItem2,具体取决于应用程序的体系结构

    Protected Sub MDIChildNew_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem2.Click
       Dim NewMDIChild As New Form2()
       'Set the Parent Form of the Child window.
       NewMDIChild.MdiParent = Me
       'Display the new form.
       NewMDIChild.Show()
    End Sub
    
    protected void MDIChildNew_Click(object sender, System.EventArgs e){
       Form2 newMDIChild = new Form2();
       // Set the Parent Form of the Child window.
       newMDIChild.MdiParent = this;
       // Display the new form.
       newMDIChild.Show();
    }
    
    private:
       void menuItem2_Click(System::Object ^ sender,
          System::EventArgs ^ e)
       {
          Form2^ newMDIChild = gcnew Form2();
          // Set the Parent Form of the Child window.
          newMDIChild->MdiParent = this;
          // Display the new form.
          newMDIChild->Show();
       }
    

    在 C++ 中,在 Form1.h 顶部添加下面的 #include 指令:

    #include "Form2.h"
    
  10. 在“属性”窗口顶部的下拉列表中,选择与“文件”菜单条对应的菜单条,然后将 MdiWindowListItem 属性设置为窗口 ToolStripMenuItem

    这样,“窗口”菜单就能够维护打开的 MDI 子窗口的列表(活动子窗口旁有一个复选标记)

  11. F5 运行该应用程序。 通过从“文件”菜单中选择“新建”,可以创建新的 MDI 子窗体,可在“窗口”菜单项中跟踪该子窗体

    注意

    当 MDI 子窗体具有一个 MainMenu 组件(通常带有菜单项的菜单结构),而且它在有 MainMenu 组件(通常带有菜单项的菜单结构)的 MDI 父窗体中打开时,如果设置了 MergeType 属性(或 MergeOrder 属性),这些菜单项就会自动合并。 将两个 MainMenu 组件的 MergeType 属性和子窗体的所有菜单项设置为 MergeItems。 此外,设置 MergeOrder 属性,以便这两个菜单的菜单项按所需顺序显示。 此外,请记住,关闭 MDI 父窗体时,每个 MDI 子窗体先引发一个 Closing 事件,再引发 MDI 父窗体的 Closing 事件。 取消 MDI 子窗体的 Closing 事件将不会阻止引发 MDI 父窗体的 Closing 事件;但是,MDI 父窗体的 Closing 事件的 CancelEventArgs 参数将设置为 true。 通过将 CancelEventArgs 参数设置为 false 可以强制 MDI 父窗体和所有 MDI 子窗体关闭。

另请参阅