打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
c#教程之编写多文档界面应用程序
userphoto

2022.12.01 浙江

关注

4.1      编写多文档界面应用程序

本节首先介绍如何建立类似Microsoft Word的文本编辑器,然后介绍如何建立类似Visualstudio.Net的编辑器那样的文本编辑器,有多个选项卡页。

4.9.1建立类似Microsoft Word的编辑器

建立一个类似Microsoft Word的编辑器,可以有多页,每页处理一个文档。多文档界面(MDI)应用程序具有一个主窗体(父窗体),主窗体在其工作区内包含一组窗体(子窗体)。每个子窗体都是一个限制为只能在该父窗体内出现的窗体。这些子窗体通常共享父窗体界面的菜单栏、工具栏以及其他部分。创建多文当编辑器的具体步骤如下:
(1)  新建项目。修改主窗体属性IsMdiContainer=true,表示主窗体是一个子窗体容器。
(2)  放主菜单控件Mainmenu到主窗体。增加顶级菜单项:文件,属性Name=menuItemFile。为文件菜单增加菜单项:新建、打开、另存为、关闭当前窗口、退出,属性Name分别为menuItemNew、menuItemOpen、menuItemSaveAs、menuItemCloseChild、menuItemExit。增加顶级菜单项:窗口,属性Name=menuItemWindow,属性MdiList=true,该属性将在窗口菜单下增加子窗口列表。为窗口菜单增加菜单项:水平平铺、层叠、垂直平铺,属性Name分别为menuItemTileH、menuItemCascade、menuItemTileV。
(3)  创建子窗体,选择菜单项:项目/添加Windows窗体,弹出对话框(见图4.5),选择Windows窗体,在名称栏输入窗体文件名称:FormChild.cs,单击打开按钮,可以见到一个新窗体。定义新窗体的类名也为FormChild。此窗体作为主窗体的子窗体。
(4)  放RichTextBox1控件到子窗体。修改属性Dock=Fill,Text="",Modifiers=public,使RichTextBox1为公有成员,在主窗体可以访问RichTextBox1。
(5)  为主窗体菜单项新文件增加单击事件处理函数如下:
private void menuItemNew_Click(object sender,System.EventArgs e)
{   FormChild formChild=new FormChild();
    formChild.MdiParent=this;
    formChild.Show();
}
(6)  把OpenFileDialog控件放到窗体中。单击打开文件菜单项事件处理函数如下:
private void menuItemOpen_Click(object sender, System.EventArgs e)
{   if(openFileDialog1.ShowDialog(this)==DialogResult.OK)
    {   FormChild ChildForm=new FormChild();
        ChildForm.MdiParent=this;
        ChildForm.richTextBox1.LoadFile(openFileDialog1.FileName,
RichTextBoxStreamType.PlainText);
        ChildForm.Show();
    }
}
(7)  把SaveFileDialog控件放到子窗体中。另存为菜单项事件处理函数如下:
private void menuItemChildSaveAs_Click(object sender, System.EventArgs e)
{   if(saveFileDialog1.ShowDialog(this)==DialogResult.OK)
    {   FormChild ChildForm=(FormChild)this.ActiveMdiChild;
        ChildForm.richTextBox1.SaveFile(saveFileDialog1.FileName,
RichTextBoxStreamType.PlainText);
    }
}
(8)  为主窗体菜单项关闭当前窗口增加单击事件函数如下:
private void menuItemCloseChild_Click(object sender, System.EventArgs e)
{   this.ActiveMdiChild.Close();}
(9)  为主窗体菜单项退出增加单击事件函数如下:
private void menuItemExit_Click(object sender, System.EventArgs e)
{   Close();}
(10)为主窗体菜单项水平平铺增加单击事件函数如下:
private void menuItemTileH_Click(object sender, System.EventArgs e)
{   this.LayoutMdi(MdiLayout.TileHorizontal);}
(11)为主窗体菜单项层叠增加单击事件函数如下:
private void menuItemCascade_Click_1(object sender, System.EventArgs e)
{   this.LayoutMdi(MdiLayout.Cascade);}
(12)为主窗体菜单项垂直平铺增加单击事件函数如下:
private void menuItemTileV_Click(object sender, System.EventArgs e)
{   this.LayoutMdi(MdiLayout. TileVertical);}
(13)运行,运行效果如下,子窗体为层叠排列。

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)运行效果如下图。
 

4.9.3建立类似Visualstudio.Net的编辑器

Visualstudio.Net的编辑器有多个选项卡页,可以编辑多个文件。建立选项卡页数固定,每选项卡页显示一行文本,类似Visualstudio.Net的编辑器的文本编辑器的具体实现步骤如下:
(1)  新建项目。放TabControl控件到子窗体。修改属性Dock=Fill。
(2)  单击TabControl属性TabPages后按钮,打开TabPage集合编辑器,单击添加按钮,增加1个选项卡页。修改属性Text分别为:第一页,第二页。如图4.9.3。
(3)     
选中第一页,可以在页中放置控件,例如放置Label控件,属性Text=”这是第一个选项卡页”。同样在第二页中也放置Label控件,属性Text=”这是第二个选项卡页”。如果放置RichTextBox控件,可以做成多文档编辑器。
(4)      运行,可以看到多页,单击每页的标题,可以转换选项卡页。运行效果如右图:

图4.9.3
如可以有多个选项卡页,每选项卡页处理一个文档,并能动态增加新选项卡页,关闭当前选项卡页。实现步骤如下:
(1)      新建项目。放TabControl控件到子窗体。修改属性Dock=Fill。
(2)      把Mainmenu控件放到主窗体中。增加顶级菜单项:文件,为其弹出菜单增加4个菜单项:新页、关闭当前页、打开、另存为。属性Name分别为:menuItemFile、menuItemFileNew、menuItemFileClose、menuItemFileOpen、menuItemFileSaveAs。
(3)      增加一个新方法MakeNewTbpage()如下:
private object  MakeNewTbpage()
{   //增加选项卡页TabPage
TabPage tabPage1=new TabPage();
tabControl1.Controls.Add(tabPage1);//将tabPage1放到tabControl1中
tabPage1.Location=new Point(4, 21);
tabPage1.Size=new Size(284, 248);
tabPage1.Text="第"+tabPage1.TabIndex.ToString()+"页";
//增加RichTextBox
RichTextBox richTextBox1=new RichTextBox();
richTextBox1.Dock=DockStyle.Fill;
richTextBox1.Size=new Size(284, 248);
richTextBox1.Text="";
tabPage1.Controls.Add(richTextBox1);//将richTextBox1放到tabPage1中
return (object)richTextBox1;
}
(4)      为菜单项新页增加事件处理函数如下:
private void menuItemFileNew_Click(object sender, System.EventArgs e)
{ MakeNewTbpage();}
(5)      为菜单项关闭当前页增加事件处理函数如下:
private void menuItemFileClose_Click(object sender, System.EventArgs e)
{   TabPage tabPage1=tabControl1.SelectedTab;//得到当前选定的选项卡页
tabControl1.Controls.Remove(tabPage1);//从tabControl1中移走该页
//得到当前选定的选项卡页中第0个控件,即RichTextBox控件
RichTextBox richTextBox1=(RichTextBox)tabPage1.Controls[0];
if(richTextBox1!=null)
richTextBox1.Dispose();//删除当前选定选项卡页中RichTextBox控件对象
if(tabPage1!=null)
tabPage1.Dispose();//删除当前选定的选项卡页
}
(6)      把OpenFileDialog控件放到子窗体中。为菜单项打开增加事件处理函数如下:
private void menuItemFileOpen_Click(object sender, System.EventArgs e)
{   if(openFileDialog1.ShowDialog()==DialogResult.OK)
{   RichTextBox richTextBox1=(RichTextBox)MakeNewTbpage();
richTextBox1.LoadFile(openFileDialog1.FileName,
RichTextBoxStreamType.PlainText);
}
}
(7)      把SaveFileDialog控件放到子窗体中。为菜单项另存为增加事件处理函数如下:
private void menuItemFileSaveAs_Click(object sender, System.EventArgs e)
{   if(saveFileDialog1.ShowDialog()==DialogResult.OK)
{   TabPage tabPage1=tabControl1.SelectedTab;
RichTextBox richTextBox1=(RichTextBox)tabPage1.Controls[0];
richTextBox1.SaveFile(saveFileDialog1.FileName,
RichTextBoxStreamType.PlainText);
}
}
(8)      编译,运行,建立新文件,关闭当前选项卡页,打开新文件,存文件,开是否正常。

习题

(1)  RichTextBox控件Lines属性记录控件中所有文本的字符串数组,每两个回车之间字符串是数组的一个元素。定义一个数组,将属性Lines 中的内容存到这个数组中。(提示:string[] s=new string [richTextBox1.Lines.Length];s= richTextBox1.Lines)
(2)  为设计的单文档写字板增加工具栏,实现建新文件,打开文件,存文件等功能。
(3)  在工具栏中,增加2个下拉列表文本框,一个选择使用的字体,一个选择字体的字号。
(4)  在工具栏中,增加3个按钮,分别设定字符为黑体,斜体,增加下划线。
(5)  在工具栏中,增加1个按钮,用ColorDialog对话框选择字体的颜色。
(6)  如何实现全选菜单项。
(7)  RichTextBox控件的属性Modified可以指示用户是否修改文本框控件的内容。请修改4.7节程序,使用属性Modified判断用户是否修改了RichTextBox控件中文本内容。
(8)  在查找对话框中,增加两个多选框,选择是否允许反向查和区分大小写,并实现反向查找和不区分大小写查找。
(9)  在实现打开文件和另存为功能时,使用属性InitialDirectory和属性DefaultExt。
(10)  RichTextBox控件的属性SelectionAlignment表示段落的对齐方式,在工具栏中增加三个按钮,分别实现段落的左对齐(HorizontalAlignment.Left)、右对齐(HorizontalAlignment.Right)、中间对齐(HorizontalAlignment.Center)。(提示:3个按钮应是互斥的,用分隔符表示3个按钮是一组。工具条按钮属性Style设置为ToolBarButtonStyle.Separator则按钮将显示为一个按钮分隔符,而不是按钮。)
(11)  RichTextBox控件的属性SelectionCharOffset可以设定选中的字符为上下标,可以为一个整数,为0表示正常字符,负数表示下标,正数表示上标。请在工具条中增加三个按钮,分别实现上下标功能。
(12)  请实现完整的单文档编辑器,具有前边介绍的单文档编辑器的功能。
(13)  请实现完整的多文档编辑器,具有前边介绍的单文档编辑器的功能。
(14)  请实现完整的选项卡式多文档文本编辑器,具有前边介绍的单文档编辑器的功能。

  
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
vb界面设计
C#程序设计简明教程-第4章_window窗体开发
C#winform中怎么将程序最小化到系统托盘
vb.net入门--NotifyIcon 组件的使用
[转载]C#窗体间的数据传值
C#控件一览表 前所未有的震撼(太详细了)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服