如何:创建 MDI 父窗体、子窗体、确定活动的 MDI 子窗体

Microsoft Visual Studio 2008/.NET Framework 3.5

Windows 窗体编程

如何:创建 MDI 父窗体

多文档界面 (MDI) 应用程序的基础是 MDI 父窗体。它是包含 MDI 子窗口的窗体,MDI 子窗口是用户与 MDI 应用程序在其中进行交互的子窗口。在

Windows 窗体设计器中以及以编程方式创建 MDI 父窗体都很容易。

在设计时创建 MDI 父窗体

  创建 Windows 应用程序项目。有关更多信息,请参见如何:创建 Windows 应用程序项目。

  “属性”窗口中,将 IsMDIContainer 属性设置为“true”。

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

        注意

        当在“属性”窗口中设置属性时,如果愿意,也可将 WindowState 属性设置为“Maximized”,因为当父窗体最大化时操作 MDI

        子窗口最为容易。另请注意,MDI 父窗体的边缘将采用系统颜色(在 Windows 系统控制面板中设置),而不是采用您使用

        Control.BackColor 属性设置的背景色。

 

  “MainMenu”组件从“工具箱”拖到窗体上。创建一个“Text”属性设置为“文件(&F)”的顶级菜单项,且带有名为“新建(&N)”和“关闭(&C)”的子菜单项。再创建一个名为“窗口(&W)”的顶级菜单项。

 

  第一个菜单将在运行时创建并隐藏菜单项,而第二个菜单将跟踪打开的 MDI 子窗口。此时,您已创建了一个 MDI 父窗口。

   F5 运行应用程序。有关如何创建在 MDI 父窗体内运行的 MDI 子窗口的信息,请参见如何:创建 MDI 子窗体。

请参见

任务

如何:创建 MDI 子窗体

如何:确定活动的 MDI 子窗体

如何:将数据发送到活动的 MDI 子窗体

如何:排列 MDI 子窗体

 

其他资源

多文档界面 (MDI) 应用程序

 

 

Visual Studio 开发中心

      主页技术资源库学习下载支持社区产品信息

 

Web 开发

    技术文章

MSDN 请稍候MSDN Library 请稍候开发工具和语言 请稍候Visual Studio 2005 Visual Studio 文档 基于Windows 的应用程序、组件和服务 请稍候创建基于 Windows 的应用程序Windows 窗体 增强 Windows 窗体应用程序 多文档界面 (MDI) 应用程序 请稍候 如何:创建 MDI 子窗体语言筛选器 : 全部 Visual Basic

 

C#

 

C++

 

J#

 

JScript

 

XAML

This page is specific to

Microsoft Visual Studio 2005/.NET Framework 2.0

 

 

Other versions are also available for the following:

  .NET Framework 3.0

  Microsoft Visual Studio 2008/.NET Framework 3.5

Windows 窗体编程

 

 

 

如何:创建 MDI 子窗体

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

在下面的过程中,将创建显示 RichTextBox 控件的 MDI 子窗体,该子窗体类似于大多数字处理应用程序。将 System.Windows.Forms

控件替换为其他控件(如 DataGridView 控件或混合控件)使您得以创建各种可能的 MDI 子窗口(而且进一步扩展为 MDI 应用程序)。

      注意

      显示的对话框和菜单命令可能会与“帮助”中的描述不同,具体取决于您现用的设置或版本。若要更改设置,请在“工具”菜单上选择“导入和导出设置”。有关更多信息,请参见

      Visual Studio 设置。

 

创建 MDI 子窗体

  创建菜单结构中包含顶级菜单项“文件”和“窗口”及菜单项“新建”和“关闭”的 MDI 父窗体。有关创建 MDI 父窗体的更多信息,请参见如何:创建 MDI

  父窗体。

  “属性”窗口顶部的下拉列表中,选择与“窗口(&W)”菜单项对应的菜单项,然后将 MdiList 属性设置为“true”。

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

  “解决方案资源管理器”中右击项目,指向“添加”,然后选择“添加新项”。

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

        注意

        在此步骤中创建的 MDI 子窗体是标准的 Windows 窗体。因此,它具有 Opacity

        属性,该属性允许控制窗体的透明度。但是,Opacity 属性旨在用于顶级窗口。不要将其与 MDI 子窗体同时使用,否则可能会引起绘制问题。

 

  “添加新项”对话框中,选择“Windows 窗体”(在 Visual Basic 或 Visual C# 中)或从“模板”窗格中选择“Windows

  窗体应用程序 (.NET)”(在 Visual C++ 中)。在“名称”框中,命名窗体 Form2。单击“打开”按钮将该窗体添加到项目中。

  “Windows 窗体设计器”打开,其中显示 Form2。

  将一个“RichTextBox”控件从“工具箱”中拖到窗体上。

  “属性”窗口中,将 Anchor 属性设置为“Top, Left”,并将 Dock 属性设置为“Fill”。

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

  “新建”菜单项创建 Click 事件处理程序。有关创建事件处理程序的更多信息,请参见如何:使用设计器创建事件处理程序。

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

        注意

        在下面的示例中,事件处理程序处理 MenuItem2 的 Click 事件。请注意,您的“新建”菜单项可能不是

        MenuItem2,这取决于应用程序结构的具体情况。

  Visual Basic 复制代码

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

 

 

  C# 复制代码

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();

}

 

 

  C++ 复制代码

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();

   }

 

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

  C++ 复制代码

#include "Form2.h"

 

   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 子窗体关闭。

 

 

请参见

任务

如何:创建 MDI 父窗体

如何:确定活动的 MDI 子窗体

如何:将数据发送到活动的 MDI 子窗体

如何:排列 MDI 子窗体

 

其他资源

多文档界面 (MDI) 应用程序

 

如何:确定活动的 MDI 子窗体语言筛选器 : 全部 Visual Basic

 

C#

 

C++

 

J#

 

JScript

 

XAML

This page is specific to

Microsoft Visual Studio 2005/.NET Framework 2.0

 

 

Other versions are also available for the following:

  .NET Framework 3.0

  Microsoft Visual Studio 2008/.NET Framework 3.5

Windows 窗体编程

如何:确定活动的 MDI 子窗体

有时需要提供一个在控件上操作的命令,而该控件在当前活动的子窗体上具有焦点。例如,假设要将子窗体文本框中的选定文本复制到剪贴板。可以创建这样一个过程:使用标准“编辑”菜单上“复制”菜单项的

Click 事件将选定的文本复制到剪贴板。

因为一个 MDI 应用程序可以有同一个子窗体的多个实例,因此该过程需要知道使用哪个窗体。若要指定正确的窗体,请使用 ActiveMdiChild

属性,该属性返回具有焦点的或最近活动的子窗体。

当窗体上有数个控件时,还需要指定哪个控件是活动的。与 ActiveMdiChild 属性一样,ActiveControl

属性返回活动子窗体中具有焦点的控件。下面的过程阐释了可以从子窗体菜单、MDI 窗体菜单或工具栏按钮调用的复制过程。

确定活动的 MDI 子窗体(将它的文本复制到剪贴板)

  在方法中,将活动子窗体的活动控件的文本复制到剪贴板。

        注意

        此示例假定有一个 MDI 父窗体 (Form1),其中包含一个或多个含有 RichTextBox 控件的 MDI

        子窗口。有关更多信息,请参见创建 MDI 父窗体。

  Visual Basic 复制代码

Public Sub mniCopy_Click(ByVal sender As Object, _

   ByVal e As System.EventArgs) Handles mniCopy.Click

 

   ' Determine the active child form.

   Dim activeChild As Form = Me.ActiveMDIChild

 

   ' If there is an active child form, find the active control, which

   ' in this example should be a RichTextBox.

   If (Not activeChild Is Nothing) Then

      Try

         Dim theBox As RichTextBox = _

         Ctype(activeChild.ActiveControl, RichTextBox)

         If (Not theBox Is Nothing) Then

            ' Put selected text on Clipboard.

            Clipboard.SetDataObject(theBox.SelectedText)

         End If

      Catch

         MessageBox.Show("You need to select a RichTextBox.")

      End Try

   End If

End Sub

 

  C# 复制代码

protected void mniCopy_Click (object sender, System.EventArgs e)

{

   // Determine the active child form.

   Form activeChild = this.ActiveMdiChild;

 

   // If there is an active child form, find the active control, which

   // in this example should be a RichTextBox.

   if (activeChild != null)

   {  

      try

      {

         RichTextBox theBox = (RichTextBox)activeChild.ActiveControl;

         if (theBox != null)

         {

            // Put the selected text on the Clipboard.

            Clipboard.SetDataObject(theBox.SelectedText);

            

         }

      }

      catch

      {

         MessageBox.Show("You need to select a RichTextBox.");

      }

   }

}

 

  J# 复制代码

private void menuItem5_Click(System.Object sender, System.EventArgs e)

{

   // Determine the active child form.

   Form activeChild = this.get_ActiveMdiChild();

      

   // If there is an active child form, find the active control, which

   // in this example should be a RichTextBox.

   if ( activeChild  != null  )

   {

      try

      {

         RichTextBox theBox = ((RichTextBox)(activeChild.get_ActiveControl()));

         if ( theBox  != null  )

         {

            // Create a new instance of the DataObject interface.

            IDataObject data = Clipboard.GetDataObject();

            // If the data is text, then set the text of the

            // RichTextBox to the text in the clipboard.

            if (data.GetDataPresent(DataFormats.Text))

            {

               theBox.set_SelectedText(data.GetData(DataFormats.Text).ToString());

            }

         }

      }

      catch(System.Exception exp)

      {

         

         MessageBox.Show("You need to select a RichTextBox.");

      }

   }

}

 

 

请参见

任务

如何:创建 MDI 父窗体

如何:创建 MDI 子窗体

如何:将数据发送到活动的 MDI 子窗体

如何:排列 MDI 子窗体

 

其他资源

多文档界面 (MDI) 应用程序

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值