一、实验要求
1、实验目的:
(1)综合运行各种控件,进一步熟悉可视化编程方式,特别是熟悉使用Windows的编程环境和风格。
(2)综合运用C#.NET提供的标准控件,如:菜单控件、公共对话框控件、RichTextBox控件、ToolStrip控件制作小型应用系统。
2、实验内容:
(1)参考系统提供的写字板功能,编写一个小型的文字编辑工具。
(2)对该文档编辑器,至少完成以下功能:
文件:(新建、打开、保存、退出)
编辑:(复制、剪切、粘贴、全选)
格式:(自动换行、字体、颜色),格式的设置功能要区分是设置当前块的格式还是设置所有内容的格式;
界面设计时应有工具栏,弹出菜单,状态栏等功能来提高操作的便利性;
二、设计思路
1、概要设计:
(1)总体设计思路:
采用MDI设计思想,实现一个主窗体,多个子窗体操作;
主窗体只是一个容器,子窗体是实现操作的主体;
主窗体显示的是子窗体的操作,所有功能都放在子窗体上,实现主次的分层;
每篇文档是放在一个独立的子窗体上进行编辑的;
子窗体的操作是独立的,之间互不影响;
关闭主窗体,会执行依次关闭各子窗体的操作;
(2)程序结构和所包含的操作:
主窗口:
菜单栏:
文件:新建、打开、保存、另存为、退出;
编辑:撤销、还原、剪切、复制、粘贴、查找/替换、全选;
格式:自动换行、字体;
查看:窗体布局;
帮助:关于程序;
快捷方式栏:新建、打开、保存、另存为、复制、剪切、粘贴、撤销、还原、居中、左 对齐、右对齐、查找;
文字编辑栏:文字样式、字体、字体大小、加粗、斜体、下划线、字体颜色;
其它:目录树、分隔栏、panel、imageList,timer等;
子窗口:
菜单栏(合并):查找/替换、自动换行;
状态栏:光标位置、操作状态、进度条;
右键菜单栏:撤销、复制、剪切、粘贴、保存、另存为;
其它:colorDialog、fontDialog、timer等;
查找窗口:
标签页、查找文字输入框、替换文字输入框、查找按钮、替换按钮、取消按钮等;
About窗口:
Panel、pictureBox、timer等;
(3)窗体功能:
主窗口:
所有子窗口的父容器,实现所有操作的接口;
子窗口:
方法的主体、定义并实现大部分的操作,所有函数的入口,并传递给主窗体调用;
查找窗口:
运行并执行当前活动子窗口的查找和替换工作,被子窗口调用;
About窗口:
一个类似欢迎窗口的作用,用于程序退出时显示一些特别效果用的,没什么大功能;
2、数据类型:
(1)主要调用的系统函数:
主窗口:
OpenFileDialog openFile = new OpenFileDialog();//打开文件对话框
SaveFileDialog saveFile = new SaveFileDialog();//保存文件对话框
private MdiClient mdiClient;//当前窗体的客户区域
TreeNode tRoot = new TreeNode("我的电脑", 0, 0);//加载目录树
子窗口:
HorizontalAlignment.Center; //居中
HorizontalAlignment.Left; //左对齐
HorizontalAlignment.Right; //右对齐
Undo();//撤销
Redo();//还原
SelectAll();//全选
Copy();//复制
Cut();//剪切
Paste();//粘贴
FontStyle.Bold ;//加粗
FontStyle.Italic; //斜体
FontStyle.Underline; //下划线
colorDialog1.ShowDialog();//颜色对话框
fontDialog1.ShowDialog();//文字样式对话框
3、程序的基本结构:
主窗口 |
子窗口 |
子窗口 |
子窗口 |
子窗口 |
About窗口 |
查找窗口
|
4、详细设计:
主要函数及其功能的实现
加载目录树
private void InitialTreeView()
{ //设置树根并加载;
TreeNode tRoot = new TreeNode("我的电脑", 0, 0);
this.treeView1.Nodes.Add(tRoot);
foreach (string driver in Directory.GetLogicalDrives())
{//加载所有硬盘到树上
TreeNode cRoot = new TreeNode(driver, 1, 1);
tRoot.Nodes.Add(cRoot);
AddDirs(cRoot);
}
tRoot.Expand();
}
private void AddDirs(TreeNode node)
{//加载目录
try
{
DirectoryInfo curDir = new DirectoryInfo(GetPathFromNode(node));
DirectoryInfo[] childDir = curDir.GetDirectories();
FileInfo[] childFile = curDir.GetFiles();
string name;
for (int i = 0; i < childDir.Length; i++)
{//加载目录信息
name = childDir[i].Name;
if (!name.Equals(".") && !name.Equals(".."))
{
node.Nodes.Add(new TreeNode(name, 2, 2));
}
}
for (int i = 0; i < childFile.Length; i++)
{//加载文件信息
name = childFile[i].Name;
node.Nodes.Add(new TreeNode(name, 3, 3));
}
}
catch { }
}
private string GetPathFromNode(TreeNode node)
{//获取子结点
if (node.Parent == null || node.Parent.Text == "我的电脑")
return node.Text;
return Path.Combine(GetPathFromNode(node.Parent), node.Text);
}
打开文件
public void fileOpen(string filename)
{
try
{//执行打开操作;
catch (Exception)
{ //打开失败,返回错误信息 }
}
保存文件
public bool Save()
{
if (//文件已经存在)
{
//直接按原路径保存;return true;
}
else
{
if (//另存为操作成功)
return true;
else
return false;
}
}
public bool SaveAs()
{
//设置默认信息
if (//点击保存按钮)
{
//执行保存操作;return true;
}
else
return false;
}
是否保存
public DialogResult IsSave()
{//弹出保存提示框;}
#endregion
#region//退出
public bool ExitFile()
{
if (//文档有改动)
{
//返回是否要保存提示框
if (//要保存)
{
if (//失败保存)
return false;
else
return true;
}
if (//取消)
return false;
}
return true;
}
查找
public void SearchText()
{
//获取当前活动子窗口
//获取起始位置
if (editor != null)
{
if (editor.SelectionLength > 0)
start += editor.SelectionLength;
int end = editor.Find(this.txt_searchContent.Text, start, RichTextBoxFinds.MatchCase);//调用查找函数
if (end < 0)
{
MessageBox.Show("已到文件结尾,查找结束!", "查找结束对话框");
start = 0;
btn_search.Text = "查找";
btn_replaceAll.Enabled = false;
btn_replace.Enabled = false;
}
else
{
btn_search.Text = "查找下一个";
btn_replace.Enabled = true;
btn_replaceAll.Enabled = true;
}
}
else //文本内容为空
{
MessageBox.Show("文本没有内容!", "查找结束对话框");
btn_search.Text = "查找";
btn_replaceAll.Enabled = false;
btn_replace.Enabled = false;
}
}