如何创建 MDI 子窗体

MDI 子窗体是Multiple-Document 接口(MDI)应用程序的基本元素,因为这些窗体是用户交互的中心。

在以下过程中,你将使用 Visual Studio 创建一个显示 RichTextBox 控件的 MDI 子窗体,类似于大多数字处理应用程序。 通过将 System.Windows.Forms 控件替换为其他控件(如 DataGridView 控件或控件的组合),可以创建具有多种可能性的 MDI 子窗口,并进一步扩展为 MDI 应用程序。

创建 MDI 子窗体

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

    这会将窗体指定为子窗口的 MDI 容器。

  2. Toolbox中,将 MenuStrip 控件拖动到窗体。 将其 Text 属性设置为 File

  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 属性设置为 填充

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

  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 子窗体都会在 MDI 父窗体的 Closing 事件触发之前触发 Closing 事件。 取消 MDI 子窗口的 Closing 事件不会阻止 MDI 父窗口的 Closing 事件被引发;但是,MDI 父窗口的 Closing 事件的 CancelEventArgs 参数现在将设置为 true。 可以通过将 CancelEventArgs 参数设置为 false来强制 MDI 父窗体和所有 MDI 子窗体关闭。

另请参阅