4.9.2主窗口和子窗口的菜单的融合

在许多多文档编辑器应用程序中,在没有子窗体打开时,菜单比较简单,而有子窗体打开后,菜单增多。实现这种功能一般是在主窗体中创建一个简单菜单,子窗体没打开时,只显示这个简单菜单。在子窗体中也创建一个菜单,包含主窗体菜单中没有的菜单项。打开子窗体后,子窗体的菜单和主窗体菜单合并成为一个菜单,这个功能叫做主窗口和子窗口的菜单的融合。创建具有这种功能的多文档编辑器应用程序可以按下列步骤:

(1)新建项目。修改主窗口属性IsMdiContainer为true。

(2)把Mainmenu控件放到主窗体中。增加顶级菜单项:文件。其属性MergeType=MergeItems,表示打开子窗体后,主窗体和子窗体中属性MergeOrder相同的顶级菜单项的弹出菜单中的菜单项合并为一个弹出菜单。属性MergeOrder=0。子窗体的顶级菜单项文件的属性MergeType也应为MergeItems,MergeOrder属性也应为0,这样打开子窗口后,才能合并为一个弹出菜单。属性Name=menuItemFile。为文件菜单增加菜单项:新建、打开、退出,属性Name分别为menuItemNew、menuItemOpen、menuItemExit,属性MergeType都为Add,属性MergeOrder依次为1、2、6,目的是打开子窗口后,在新建和打开菜单项后加入子窗口菜单栏中的文件菜单的另存为菜单项。增加菜单:帮助,其属性MergeType=Add,属性MergeOrder=7,属性Name=menuItemHelp。为帮助菜单增加菜单项:关于…,属性Name=menuItemAbout。其余菜单在子窗口中实现。注意属性MergeOrder分别为0、7,打开子窗口后,子窗口中的菜单将按顺序插入到主窗口的菜单中,例如,子窗口有菜单:编辑,其属性MergeOrder=3,合并后,菜单排列顺序为:文件、编辑、帮助。

(3)创建子窗体,选择菜单项:项目/添加Windows窗体,弹出对话框,选择Windows窗体,在名称栏输入窗体文件名称:formChild.cs,单击打开按钮,可以见到一个新窗体。定义新窗体的类名也为formChild。

(4)为formChild窗体增加变量:Form1 MainForm1;

(5)修改formChild类构造函数如下(阴影部分是所做的修改):

public formChild(Form1 form1)//增加参数
{
//Windows窗体设计器支持所必需的
InitializeComponent();
//TODO:在InitializeComponent调用后添加任何构造函数代码
MainForm1=form1;//新增语句,这里Form1是主窗体的属性Name的值
}//有了Form1,可以在formChild窗体中调用主窗体的公有方法

(6)把Mainmenu控件放到子窗体中。增加顶级菜单项:文件,其属性MergeType=MergeItems,属性MergeOrder=0。为文件顶级菜单项弹出菜单增加菜单项:另存为…,属性MergeType=Add,属性MergeOrder=3,菜单合并后,另存为…菜单项将出现在主窗口文件菜单的新建和打开菜单项之后。增加菜单项:关闭当前文件,属性MergeType=Add,属性MergeOrder=4。

(7)增加顶级菜单项:编辑,其属性MergeType=Add,属性MergeOrder=3。注意属性MergeOrder=3,菜单合并后,编辑菜单将出现出现菜单文件之后。为编辑顶级菜单项弹出菜单增加菜单项:拷贝、剪贴、粘贴。

(8)增加顶级菜单项:窗口,其属性MergeType=Add,属性MergeOrder=6,属性Name=menuItemWindow,属性MdiList=true,该属性将在窗口菜单下增加子窗口列表。为窗口菜单增加菜单项:层叠,属性Name为menuItemCascade。

(9)放RichTextBox1控件到子窗体。修改属性Dock=Fill,Text=””,属性 Modifiers=public,使RichTextBox1为公有成员,在主窗体可以访问RichTextBox1。

(10)为主窗体菜单项新文件增加单击事件函数如下:

private void menuItemNew_Click(object sender, System.EventArgs e)
{formChild ChildForm=new formChild(this);
ChildForm.MdiParent=this;
ChildForm.Show();
}

(11)把OpenFileDialog控件放到主窗体中。单击打开文件菜单项事件处理函数如下:

private void menuItemOpen_Click(object sender, System.EventArgs e)
{if(openFileDialog1.ShowDialog(this)==DialogResult.OK)
{formChild ChildForm=new formChild(this);
ChildForm.MdiParent=this;
ChildForm.richTextBox1.LoadFile(openFileDialog1.FileName);
ChildForm.Show();
}
}

(12)为主窗体菜单项退出增加单击事件处理函数如下:

private void menuItemExit_Click(object sender, System.EventArgs e)
{Close();}

(13)为子窗体菜单项层叠增加单击事件处理函数如下:

private void menuItemCascade_Click_1(object sender, System.EventArgs e)
{MainForm1.LayoutMdi(MdiLayout.Cascade);}

(14)把SaveFileDialog控件放到子窗体中。为子窗体菜单项另存为增加单击事件函数如下:

private void menuItemChildSaveAs_Click(object sender, System.EventArgs e)
{if(saveFileDialog1.ShowDialog(this)==DialogResult.OK)
{richTextBox1.SaveFile(saveFileDialog1.FileName,
RichTextBoxStreamType.PlainText);
}
}

(15)为子窗体菜单项关闭当前窗口增加单击事件函数如下:

private void menuItemCloseChild_Click(object sender, System.EventArgs e)
{Close();}

(16)为子窗体菜单项拷贝、剪贴和粘贴增加单击事件函数如下:

语句分别为:richTextBox1.Cut();richTextBox1.Copy();richTextBox1.Paste();

(17)运行效果如下图。