C#创建多文档的界面

到目前为止你创建的所有项目都是单文档界面(single document interface,SDI)的项目。在SDI程序中,应用中的每个窗体与其他的窗体都是对等的,窗体之间不存在层次关系。Visual C# 也允许创建多文档界面(MDI)程序。MDI程序包含一个父窗口(也称为容器)以及一个或多个子窗口。MDI程序的一个经典例子是Adobe PhotoShop。运行PhotoShop时,显示一个父窗口。在这个父窗口内,可以打开任意数量的文档,每个文档都在一个子窗口中显示。在MDI程序中,所有子窗口都共享父窗口的同一个工具栏和菜单栏。

子窗口的一个限制是它们只能在父窗口的边界之内显示。图6.19显示了运行的PhotoShop,它打开了多个子文档窗口。

图6.19 

MDI程序由一个父窗口以及一个或多个子窗口组成

注意:除了子窗口,MDI应用还可以包含任意数量的正常窗口(如对话框)。

下面创建一个简单的MDI项目。执行以下步骤创建项目。

1.在菜单上选择“文件/新建项目”,显示“新建项目”对话框(注意到这是一个模式窗口)。

2.在“名称”中输入“MDI Example”,然后单击“确定”,创建项目。

3.在“解决方案资源管理器”中右击Form1.cs,在弹出菜单上选择“重命名”,然后将窗体的名称修改为fclsMDIParent.cs。接下来,将窗体的Text属性设置为“MDI Parent”,并将它的IsMdiContainer 属性设置为True(如果不将IsMdiContainer 属性设置为True,这个例子将不可行)。

首先,Visual C# 将客户区域变为暗灰色,并呈现下陷效果。这是MDI父窗口的标准外观。所有可见的子窗口都在该区域中显示。

4.在菜单上选择“项目/增加Windows窗体”,创建一个新的窗体。将该窗体命名为fclsChild1.cs,并将其Text属性改为Child 1。

5.添加第三个窗体到项目中。将该窗体命名为fclsChild2.cs,并将其Text属性改为Child 2。

6.单击工具栏上的“全部保存”。

7.在“解决方案资源管理器”中双击fclsMDIParent.cs,在设计器中显示父窗口。

8.接下来,双击窗体访问其缺省事件—Load事件。输入下列代码:

clsChild1 objChild = new fclsChild1();

objChild.MdiParent = this;

objChild.Show();

现在,你已经知道第一条语句和最后一条语句的作用了。第一条语句实例化一个新的对象,类型为fclsChild1。最后一条语句无模式地显示该窗体。这里我们感兴趣的是第二条语句。它将窗体的MdiParent属性设置为当前窗体(this总是引用当前对象),当前窗体是一个MDI父窗体,因为它的IsMdiContainer 属性设置为True。当显示这样的一个新窗体时,它将作为MDI的一个子窗体。

现在按F5键运行程序。注意观察子窗体如何显示在父窗体的客户区域。如果调整父窗体的大小使得一个或多个子窗体不能显示,这时便会出现滚动条(见图6.20)。如果删除了设置MdiParent属性的语句,则窗体将只是浮动在父窗体之上(因为它不再是子窗体),因此不再显示在父窗体的边界之内。

在菜单上选择“调试/停止调试”停止运行项目,并执行下列步骤:

1.显示“解决方案资源管理器”,双击fclsChild1窗体使它显示在设计器中。

2.添加一个按钮到窗体中,并如下设置按钮的属性:

属性

Name

btnShowChild2

Location

105,100

Size

85,23

Text

Show Child 2

图6.20 

子窗体只能显示在父窗体的边框之内

3.双击按钮访问它的Click事件,然后添加下列代码:

fclsChild2 objChild = new fclsChild2();

objChild.MdiParent = this.MdiParent;

objChild.Show();

这段代码显示第二个子窗体。注意这段代码与之前输入的代码的区别。不能将第二个子窗体的MdiParent设置为this,因为this引用当前窗体(fclsChild1,它并不是MDI容器)。但是,this.MdiParent引用了当前子窗体的父窗体,这正是最初将窗体设置为子窗体时设置的属性。因此,可以将第一个子窗体的父窗体传递给第二个子窗体,这样它们就成为同一个窗体的子窗体。

注意:任一窗体都可以作为子窗体(当然,除了MDI父窗体之外)。要使一个窗体成为子窗体,将它的MdiParent属性设置为一个已定义为MDI容器的窗体。

4.按F5键运行项目。可以看到子窗体中的按钮,单击这个按钮(如果你看不到这个按钮,你可能误将它添加到第二个子窗体中了)。单击按钮时,就会显示第二个子窗体。注意看这个窗体是如何显示在父窗体的边界之内的(见图6.21)。

图6.21 

子窗体之间是平等的

提示:MDI父窗体具有ActiveMdiChild属性,用它可获得对当前活动子窗口的引用。

注意:要使父窗口在项目第一次运行时更大,可在设计或运行时在窗体的Load事件中设置窗体的Size.Height和Size.Width属性。

关于窗体,有一点要记住:可以创建任意多的窗体实例。但是,管理同一窗体的多个实例很复杂,这超出了本书的范围。

如果你还不理解MDI窗体,不要担心。作为Visual C# 新手,你编写的大多数应用程序都将是SDI程序。当你更熟悉一般的Visual C# 项目的创建时,再开始尝试MDI项目。记住,不要只是因为可以创建MDI程序而使用MDI;只有在项目要求时才使用MDI

6.9  小结

理解窗体很重要,因为窗体是动态的画布,可以在上面构建用户界面。如果不知道如何使用窗体,整个应用程序就会受损。使用窗体不仅是设置属性,特别是当你考虑到终端用户的时候。随着经验的增长,你将进入窗体设计的最佳状态,事情变得很自然。

在这一章中,你学习了如何做一些有趣的事情,如创建透明的窗体,以及一些高端的技巧,如创建MDI应用程序。你还学习了如何创建可滚动的窗体(不可忽略的界面元素),你还花了许多时间在窗体的控件上,这是很重要的,因为窗体的主要功能就是用来放置控件。在接下来的两章中,你将学习Visual C# 的许多功能强大的控件,这些控件将成为你的开发武器库中的重要武器。

你可能感兴趣的:(C#)