- 说明:这是武汉理工大学计算机学院【可视化编程C#】课程的第四次实验:多文本编辑器
- >>点击查看WUTer计算机专业实验汇总
- 谨记:纸上得来终觉浅,绝知此事要躬行。
综合应用C#的MDI窗体设计方法,掌握各控件设计方法,MenuStrip、ContextMenuStrip、ToolStrip、StatusStrip等,以及文件管理操作等。
设计一个多文档界面的Windows应用程序,能够实现对文档的简单处理,包括:打开、关闭、保存文件,复制、剪切、粘贴、撤销等文本处理功能,同时能实现打印。
下图压缩包中的是我自己写的程序源代码,点击此处下载
还有一份是同学的,点击此处下载
1、新建一个Windows窗体应用,文件名:窗体和控件综合设计;
2、分析:根据实验要求,首先需要创建一个父窗体,父窗体包含对富文本编辑的相关功能菜单,然后子窗体是富文本输入编辑框(关于父窗体与子窗体可参考此处),其中还需要实现查找与替换功能,所以需要设计这三个主要的界面。
相关界面设计如下:
父窗体设计:
Name:FormBack;属性IsMdiContainer设置为“True”。其他见下图:
富文本编辑窗体设计:
窗口名称为:FormRichText;富文本(RichText)编辑界面名称使用默认名称(richTextBox1),属性Dock值设置为:Fill(铺满窗口),属性Modifiers值设置为:Public。其他见下图:
查找与替换界面设计:
窗口Name:FormFind,属性“TopMost”设置为“true”;
“向上”单选框Name:radioUp;
“向下”单选框Name:radioDown,属性值“Checked”设置为“True”(即初始状态为向下查找);
“区分大小写”勾选框Name:checkCase。其他按钮默认值。详情见下图:
1、FormBack.cs:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 窗体和控件综合设计
{
public partial class FormBack : Form
{
public FormBack()
{
InitializeComponent();
}
int documentCount = 1; //文档计数
public FormRichText formRichText; //定义编辑窗体变量
//新建txt文件按钮:
private void 新建NCtrlNToolStripMenuItem_Click(object sender, EventArgs e)
{
NewFile(); //程序实现代码在后边
}
//打开txt文件按钮
private void 打开OCtrlOToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFile();//程序实现代码在后边
}
//保存txt文件
private void 保存ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (documentCount != 1)
Save(); //程序实现代码在后边
}
//另存为txt文件
private void 另存为AToolStripMenuItem_Click(object sender, EventArgs e)
{
SaveAs();
}
private void 退出XToolStripMenuItem_Click(object sender, EventArgs e)
{
Close();
}
private void 撤销UCtrlZToolStripMenuItem_Click(object sender, EventArgs e)
{
FormRichText formRichText = (FormRichText)this.ActiveMdiChild;
formRichText.richTextBox1.Undo();
}
private void 剪切TCtrlXToolStripMenuItem_Click(object sender, EventArgs e)
{
FormRichText formRichText = (FormRichText)this.ActiveMdiChild;
formRichText.richTextBox1.Cut();
}
private void 复制CCtrlCToolStripMenuItem_Click(object sender, EventArgs e)
{
FormRichText formRichText = (FormRichText)this.ActiveMdiChild;
formRichText.richTextBox1.Copy();
}
private void 粘贴PCtrlVToolStripMenuItem_Click(object sender, EventArgs e)
{
FormRichText formRichText = (FormRichText)this.ActiveMdiChild;
formRichText.richTextBox1.Paste();
}
private void 删除LDelToolStripMenuItem_Click(object sender, EventArgs e)
{
FormRichText formRichText = (FormRichText)this.ActiveMdiChild;
if (formRichText.richTextBox1.SelectedText.Length > 0)
{
formRichText.richTextBox1.SelectedText = "";
}
}
//新建文档
private void NewFile()
{
formRichText = new FormRichText();
formRichText.MdiParent = this;//设置子窗体的父文档
formRichText.Text = "文档" + documentCount++;//文档号
formRichText.Show();//显示子窗体
formRichText.isSaved = false;
}
//打开文件
private void OpenFile()
{
string str;
formRichText = new FormRichText();//实例化子窗体对象
formRichText.MdiParent = this; //设置子窗体的父文档为当前主窗体
//设置打开文件对话框要打开的文件类型的初始值
openFileDialog1.Filter = "文本文件 (*.txt) |*.txt|富文本 (*.rtf)|*.rtf|全部文件 (*.*)|*.*";//设置打开文件对话框要打开的文件类型
if (openFileDialog1.ShowDialog() != DialogResult.Cancel)
{
str = openFileDialog1.FileName;//读打开文件的文件名
formRichText.Text = str;//文件的文件名显示在窗体的标题
MessageBox.Show(str + "打开成功!");
formRichText.Show();//显示子窗体
formRichText.richTextBox1.LoadFile(openFileDialog1.FileName, RichTextBoxStreamType.PlainText);
formRichText.isSaved = true;
//formRichText.richTextBox1.LoadFile(@str, RichTextBoxStreamType.RichText); //通过富文本框的LoadFile 方法,将打开的文件内容读出并显示在富文本框中
}
}
//保存文件
private void Save()
{
String str;
FormRichText formRichText = (FormRichText)this.ActiveMdiChild;
//如果文档未改动过,返回
if (!formRichText.isChanged)
{
MessageBox.Show("文本内容未发生改变!");
return;
}
//如果文档保存过(也就是不需要另存为)
if (formRichText.isSaved)
{
formRichText = (FormRichText)this.ActiveMdiChild; //获取当前窗口
str = formRichText.Text.Trim();
formRichText.richTextBox1.SaveFile(str, RichTextBoxStreamType.PlainText);
formRichText.isChanged = false;
}
//否则,另存为
else
{
SaveAs();
}
}
//另存为
private void SaveAs()
{
string str;
formRichText = (FormRichText)this.ActiveMdiChild;
saveFileDialog1.DefaultExt = "txt";
saveFileDialog1.Filter = "文本文件 (*.txt)|*.txt|全部文件 (*.*)|*.*";
if (saveFileDialog1.ShowDialog(this) == DialogResult.OK)
{
str = saveFileDialog1.FileName;
MessageBox.Show(str);
if (str != "")
{
formRichText.richTextBox1.SaveFile(str, RichTextBoxStreamType.PlainText);
formRichText.isSaved = true;
formRichText.isChanged = false;
}
else
{
MessageBox.Show("请输入文件名!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
}
private void 字体ToolStripMenuItem_Click(object sender, EventArgs e)
{
formRichText = (FormRichText)this.ActiveMdiChild;
FontDialog fontDialog = new FontDialog();
if (fontDialog.ShowDialog() != DialogResult.Cancel)
{
formRichText.richTextBox1.SelectionFont = fontDialog.Font;//将当前选定的文字改变字体
}
}
private void 字体颜色CToolStripMenuItem_Click(object sender, EventArgs e)
{
formRichText = (FormRichText)this.ActiveMdiChild;
ColorDialog colorDialog = new ColorDialog();
if (colorDialog.ShowDialog() != DialogResult.Cancel)
{
formRichText.richTextBox1.SelectionColor = colorDialog.Color;//将当前选定的文字改变字体
}
}
private void 查找FCtrlFToolStripMenuItem_Click(object sender, EventArgs e)
{
//FindPosition = 0;
formRichText = (FormRichText)this.ActiveMdiChild;
FormFind formFind = new FormFind(formRichText);
formFind.Show();
}
private void 替换RCtrlHToolStripMenuItem_Click(object sender, EventArgs e)
{
formRichText = (FormRichText)this.ActiveMdiChild;
FormFind formFind = new FormFind(formRichText);
formFind.Show();
}
private void 帮助HToolStripMenuItem_Click(object sender, EventArgs e)
{
About about = new About();
about.Show();
}
private void 层叠ToolStripMenuItem_Click(object sender, EventArgs e)
{
this.LayoutMdi(MdiLayout.Cascade);
}
private void 水平平铺ToolStripMenuItem_Click(object sender, EventArgs e)
{
this.LayoutMdi(MdiLayout.TileHorizontal);
}
private void 垂直平铺ToolStripMenuItem_Click(object sender, EventArgs e)
{
this.LayoutMdi(MdiLayout.TileVertical);
}
private void 全选ACtrlAToolStripMenuItem_Click(object sender, EventArgs e)
{
FormRichText formRichText = (FormRichText)this.ActiveMdiChild;
formRichText.richTextBox1.SelectAll();
}
private void FormBack_Load(object sender, EventArgs e)
{
}
}
}
2、FormRichText.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 窗体和控件综合设计
{
public partial class FormRichText : Form
{
public bool isChanged = true;
public bool isSaved ; //文档是否被保存过
public FormRichText()
{
InitializeComponent();
}
public Font SelectionFont { get; internal set; }
internal void SaveFile(string fileName, RichTextBoxStreamType plainText)
{
throw new NotImplementedException();
}
private void FormRichText_Load(object sender, EventArgs e)
{
}
private void richTextBox1_TextChanged(object sender, EventArgs e)
{
isChanged = true;
}
}
}
3、FormFind.cs:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 窗体和控件综合设计
{
public partial class FormFind : Form
{
FormRichText parentForm; //定义包含富文本框的窗体变量
private String strSearch = ""; // 表示要查找的字符串
private String strReplace = "";// 表示要替换成的字符串
private int searchPos = 0, lastSearchPos = 0;// 前者表示当前的查找位置,后者表示记录上次的查找位置
private bool find;
public FormFind(FormRichText parent)
{
this.parentForm = parent;
InitializeComponent();
}
private void FormFind_Load(object sender, EventArgs e)
{
}
private void label1_Click(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
SearchText();
}
private void button2_Click(object sender, EventArgs e)
{
ReplaceText();
}
private bool SearchText()
{
strSearch = findText.Text;//查找的文本
strReplace = replaceText.Text;//替换的文本
if (checkCase.Checked)// 表示区分大小写查找
{
if (radioDown.Checked) // 表示向下查找
{
searchPos = parentForm.richTextBox1.Find(strSearch, searchPos, parentForm.richTextBox1.Text.Length, RichTextBoxFinds.MatchCase);
}
else// 表示向上查找
{
this.searchPos = this.parentForm.richTextBox1.Find(this.strSearch, 0,searchPos, RichTextBoxFinds.MatchCase | RichTextBoxFinds.Reverse);
}
}
else// 不区分大小写进行查找
{
if (this.radioDown.Checked)// 表示向下查找
{
this.searchPos = this.parentForm.richTextBox1.Find(this.strSearch, searchPos,this.parentForm.richTextBox1.Text.Length,RichTextBoxFinds.None);
}
else// 表示向上查找
{
this.searchPos = this.parentForm.richTextBox1.Find(this.strSearch, 0,searchPos, RichTextBoxFinds.Reverse);
}
}
if (this.searchPos < 0)//如果未找到
{
// if (ShowNotFind)//如果要提示未找到信息
// {
// MessageBox.Show("指定的文本未找到", "字处理", MessageBoxButtons.OK,
// MessageBoxIcon.Information);
// }
this.searchPos = this.lastSearchPos;
//回到上次查找位置
find = false;//表示未找到
}
else//找到文本
{
if (this.radioDown.Checked)
//如果是向下查找,设置新的查找位置,继续向下查找
{
this.searchPos += this.strSearch.Length;
//新的查找位置是本次开始的查找位置加上查找到文本的长度
}
else//如果是向上查找,设置新的查找位置,继续向前查找
{
this.searchPos -= this.strSearch.Length;
}
// this.parentForm.Focus();// 使主窗体获得焦点
}
this.lastSearchPos = this.searchPos;
//开始查找,把查找位置保存
return find;
}
private void ReplaceText()
{
this.strSearch = this.findText.Text;//查找的文本
this.strReplace = this.replaceText.Text;//替换的文本
if (!SearchText())//调用查找方法查找是否存在
{
if (this.parentForm.richTextBox1.SelectedText.Length > 0)
{
//如果找到,则进行替换
this.parentForm.richTextBox1.SelectedText = this.strReplace;
}
}
}
}
}
至此,项目还有很多不足之处。