一.引子:
这是我们以小组的形式共同制作的记事本项目。项目的目的是仿照Windows系统上的文本文档,实现其中一些基本的功能,如新建和保存等。下面我将分享以下我们的想法和遇到的问题,欢迎大家提出意见或是更好的看法。
二. 项目的基本组成:
具体的构思:
我们把记事本当作是一个主窗体,让其拥有两个子窗体 格式 和 关于
在菜单栏添加标签文件和文件下的下拉菜单
想要实现的功能
(1) 新窗口
(2) 打开
(3) 保存 与 另存为
(4) 格式(对字体进行修改)
(5) 关于
具体实现的方法
(1)新窗口:new一个主窗体并将其显示出来
private void New_Click(object sender, EventArgs e)
{
FrmParents frmParents = new FrmParents();
frmParents.Show();
}
(2)打开:使用 open file 类来查找文件的路径,使用字符串的截断来来取出文件的名称并将其显示伪文件名
private String fileString = "";
private String textString = "";
private String filePath = "";
private void Open_Click(object sender, EventArgs e)
{
// 打开时,先清空文本框中的内容
textBox1.Clear();
OpenFileDialog file = new OpenFileDialog
{
Filter = "txt文件(*.txt)|*.txt"
};
if (file.ShowDialog() == DialogResult.OK)
{
filePath = file.FileName;
StreamReader sr= new StreamReader(filePath, Encoding.GetEncoding("GB2312"));
fileString = sr.ReadToEnd();
// 用于退出和点击主窗体右上角的关闭判断的执行
textString = fileString;
textBox1.Text = textString;
// 关闭数据流
sr.Close();
}
this.Text = filePath.Substring(filePath.LastIndexOf('\\')+1)+" - 记事本";
}
(3)保存与另存为
// 保存
private void Save_Click(object sender, EventArgs e)
{
// 判断文件路径是否存在
if (filePath == "")
{
// 不存在 创建一个存储文件的框架
SaveFileDialog file = new SaveFileDialog
{
Filter = "txt文件(*.txt)|*.txt"
};
if (file.ShowDialog() == DialogResult.OK)
{
filePath = file.FileName;
StreamWriter sw = new StreamWriter(filePath, false, Encoding.GetEncoding("GB2312"));
fileString = textString;
sw.Write(fileString);
sw.Flush();
sw.Close();
}
}
else
{
// 存在 直接写入现有的文件中
StreamWriter sw = new StreamWriter(filePath, false, Encoding.GetEncoding("GB2312"));
fileString = textString;
sw.Write(fileString);
sw.Flush();
sw.Close();
}
this.Text = "记事本";
}
// 另存为
private void As_Click(object sender, EventArgs e)
{
SaveFileDialog file = new SaveFileDialog
{
Filter = "txt文件(*.txt)|*.txt"
};
if (file.ShowDialog() == DialogResult.OK)
{
filePath = file.FileName;
StreamWriter sw = new StreamWriter(filePath, false, Encoding.GetEncoding("GB2312"));
fileString = textString;
sw.Write(fileString);
sw.Flush();
sw.Close();
}
}
(4)格式 (已优化)
在主窗体调用FontDialog插件 不在使用创建的子窗体
// 点击格式会触发的事件
private void Style_Click(object sender, EventArgs e)
{
// 要想更改字体的颜色, fontDialog1.ShowColor 必须在fontDialog1.ShowDialog前调用加载
fontDialog1.ShowColor = true;
fontDialog1.ShowDialog();
textBox1.Font = fontDialog1.Font;
textBox1.ForeColor = fontDialog1.Color;
}
(5)关于 新建子窗体
注册一个点击事件,当点击按钮时,弹出子窗体
6. 遇到的bug以及解决方法:
(1)文本框溢出问题
原因是读取文档内字符串时,缺少修饰符“\0”从而导致堆栈的溢出问题
解决方案: 添加一个中间变量testString来判断文件内容是否有进行过更改
(2)无法使用格式获取的系统文字格式
原因:最早我们用的自己设计的子窗体,并同过获取了系统的文字格式,但是无法调用
解决方案: 在在主窗体上添加fontDialog控件
// 以下是获取系统部分文字格式的代码,大家可以看一下
// 获取字体列表
InstalledFontCollection fonts = new InstalledFontCollection();
foreach (FontFamily family in fonts.Families)
{
// 在窗体上添加的控件comboBox
ComboBoxFonts.Items.Add(family.Name);
}
// 获取字体样式
foreach (int i in Enum.GetValues(typeof(FontStyle)))
{
ListItem listitem = new ListItem(Enum.GetName(typeof(FontStyle), i), i.ToString());
ComboBoxFontStyle.Items.Add(listitem);
}
// 获取字体大小
// 注意!这个获取的并不是字号,只是字体的大小 Large, Samll之类的
foreach (int i in Enum.GetValues(typeof(FontSize)))
{
ListItem listitem = new ListItem(Enum.GetName(typeof(FontSize), i), i.ToString());
ComboBoxFontSize.Items.Add(listitem);
}
// 获取字体颜色
foreach (int i in Enum.GetValues(typeof(FontColor)))
{
ListItem listitem = new ListItem(Enum.GetName(typeof(FontColor), i), i.ToString());
ComboBoxFontColor.Items.Add(listitem);
}