如何创建 MDI 子窗体

MDI 子窗体是 Multiple-Document Interface (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. 单击 Items 属性旁边的省略号(...),然后单击“ 添加” 以添加两个子工具条带菜单项。 将 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 属性设置为 Top、Left ,并将 Dock 属性设置为 Fill

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

  8. 双击 “新建 ”菜单项,为其创建 Click 事件处理程序。

  9. 当用户单击“ 新建 ”菜单项时,插入类似于以下内容的代码以创建新的 MDI 子窗体。

    注释

    在下面的示例中,事件处理程序处理Click事件以响应MenuItem2。 请注意,根据您的应用程序架构的具体情况,可能无法使用“新建”菜单项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 ,菜单项将自动合并。 将两个 MergeType 组件和子窗体的所有菜单项的 MainMenu 属性设置为 MergeItems。 此外,设置 MergeOrder 属性,以便这两个菜单中的菜单项按所需顺序显示。 此外,请记住,关闭 MDI 父窗体时,每个 MDI 子窗体都会在 MDI 父窗体引发Closing事件之前引发一个Closing事件。 取消 MDI 子Closing事件不会阻止引发 MDI 父级Closing事件;但是,MDI 父级事件的CancelEventArgsClosing参数现将设为true。 可以通过将 CancelEventArgs 参数设置为 false 强制 MDI 父窗体和所有 MDI 子窗体关闭。

另请参阅