0
点赞
收藏
分享

微信扫一扫

【可视化编程】实验4:C#窗体和控件综合设计(多文本编辑器)




  • 说明:这是武汉理工大学计算机学院【可视化编程C#】课程的第四次实验:多文本编辑器
  • 谨记:纸上得来终觉浅,绝知此事要躬行。


实验目的

  综合应用C#的MDI窗体设计方法,掌握各控件设计方法,MenuStrip、ContextMenuStrip、ToolStrip、StatusStrip等,以及文件管理操作等。

实验内容

  设计一个多文档界面的Windows应用程序,能够实现对文档的简单处理,包括:打开、关闭、保存文件,复制、剪切、粘贴、撤销等文本处理功能,同时能实现打印。

【可视化编程】实验4:C#窗体和控件综合设计(多文本编辑器)_C#

实验代码下载:

下图压缩包中的是我自己写的程序源代码,点击此处下载

【可视化编程】实验4:C#窗体和控件综合设计(多文本编辑器)_武汉理工大学_02

还有一份是同学的,点击此处下载

实验方案

1、新建一个Windows窗体应用,文件名:窗体和控件综合设计;

【可视化编程】实验4:C#窗体和控件综合设计(多文本编辑器)_富文本_03

2、分析:根据实验要求,首先需要创建一个父窗体,父窗体包含对富文本编辑的相关功能菜单,然后子窗体是富文本输入编辑框(关于父窗体与子窗体可参考此处),其中还需要实现查找与替换功能,所以需要设计这三个主要的界面。

相关界面设计如下:

父窗体设计:

Name:FormBack;属性IsMdiContainer设置为“True”。其他见下图:

【可视化编程】实验4:C#窗体和控件综合设计(多文本编辑器)_多文档编辑器_04

富文本编辑窗体设计:

窗口名称为:FormRichText;富文本(RichText)编辑界面名称使用默认名称(richTextBox1),属性Dock值设置为:Fill(铺满窗口),属性Modifiers值设置为:Public。其他见下图:

【可视化编程】实验4:C#窗体和控件综合设计(多文本编辑器)_富文本_05

查找与替换界面设计:

 窗口Name:FormFind,属性“TopMost”设置为“true”;

“向上”单选框Name:radioUp;

“向下”单选框Name:radioDown,属性值“Checked”设置为“True”(即初始状态为向下查找);

“区分大小写”勾选框Name:checkCase。其他按钮默认值。详情见下图:

【可视化编程】实验4:C#窗体和控件综合设计(多文本编辑器)_多文档编辑器_06

实验代码:

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;
}
}
}
}
}

运行参考结果:

【可视化编程】实验4:C#窗体和控件综合设计(多文本编辑器)_武汉理工大学_07

【可视化编程】实验4:C#窗体和控件综合设计(多文本编辑器)_武汉理工大学_08

【可视化编程】实验4:C#窗体和控件综合设计(多文本编辑器)_武汉理工大学_09

【可视化编程】实验4:C#窗体和控件综合设计(多文本编辑器)_C#_10

至此,项目还有很多不足之处。


举报

相关推荐

0 条评论