目录
3.2相关功能介绍
一、项目简介
设计一个Windows应用程序——记事本,装载了MenuStrip(菜单)、ToolStrip(工具栏)、RichTextBox(高级文本框)和StatusStrip(状态栏控件)等控件,以及使用CommonDialog(公共对话框)实现对文本的存取、格式设置等操作。
项目图片样式展示:
二、记事本界面设计
2.1 创建项目
新建一个Windows窗体应用程序,并命名为“Notepad”。
2.2 按照以下参数修改此窗体的属性
属性 | 设置结果 |
---|---|
Name | munsNotepad |
Text | 记事本 |
StartPosition | CenterScreen |
Size | 904, 809 |
2.3安装控件
2.3.1 MenuStrip(菜单控件)
(1)单击窗体左边会出现工具箱→ 找到menustrip →拖动到窗体中,修改Name属性为“mnusNotepad”
(2)单击 输入【文件(F)】、【编辑(E)】、【格式(O)】、【查看(V)】和【帮助(H)】
(3)设置【文件(F)】、【编辑(E)】、【格式(O)】、【查看(V)】和【帮助(H)】的属性→
单击【文件(F)】、【编辑(E)】、【格式(O)】、【查看(V)】和【帮助(H)】找到对应的属性窗口,按照以下表格进行设置
Text属性 | Name属性 | ShortcutKeys属性 | ShowShortcutKeys属性 | |||||
编辑(&E) | tsmiEdit | None | - | |||||
撤销(&U) | tsmiUndo | Ctrl+Z | True | |||||
分隔符 | ||||||||
复制(&C) | tsmiCopy | Ctrl+C | True | |||||
剪切(&T) | tsmiCut | Ctrl+X | True | |||||
粘贴(&P) | tsmiPaste | Ctrl+V | True | |||||
分隔符 | ||||||||
全选(&A) | tsmiSelectAll | Ctrl+A | True | |||||
日期(&D) | tsmiDate | F5 | True | |||||
Text属性 | Name属性 | Check属性 | ||||||
格式(&O) | tsmiFormat | False | ||||||
自动换行(&W) | tsmiAuto | True | ||||||
字体(&F) | tsmiFont | False | ||||||
Text属性 | Name属性 | Checked属性 | ||||||
查看(&V) | tsmiView | False | ||||||
工具栏(&T) | tsmiToolStrip | True | ||||||
状态栏(&S) | tsmiStatusStrip | True | ||||||
Text属性 | Name属性 | |||||||
帮助(&H) | tsmiHelp | |||||||
关于记事本(&A) | tsmiAbout |
2.3.2 ToolStrip(工具栏控件)
单击窗体左边会出现工具箱→ 找到“ToolStrip” →拖动到窗体中
单击工具栏→右下角属性→修改Name属性为“tlsNotepad”如图所示
右击工具栏→ 插入标准项 出现图标
2.3.3 RichTextBox(多格式文本框控件)
单击窗体左边会出现工具箱→ 找到“RichTextBox” →拖动到窗体中
单击工具栏→右下角属性→修改Name属性为“rtxtNotepad”如图所示
Anchor属性选择“Top,Bottom,Left,Right”,这样当窗体大小改变时,RichTextBox控件的大小也会跟着改变
2.3.4 StatusStrip(状态栏控件)
添加StatusStrip控件,将其Name属性设为“stsNotepad”,将Dock属性设为“Bottom”再将Anchor属性设为“Bottom,Left,Right”。
右键“编辑项”,下拉列表中保留默认的选择“StatusLabel”,然后单击【添加】按钮,依次添加2个StatusLabel,并分别命名为“tssLbl1”和“tssLbl2”,再将tssLbl1的Text属性设为“就绪”, tssLbl2的Text属性设为“显示日期、时间”。
2.3.5 RichTextBox(多格式文本框控件)
从工具箱中找到OpenFileDialog直接拖入窗体中 单击属性
当用户单击记事本的【文件】→【打开】菜单项时,使用打开对话框OpenFileDialog打开文件。OpenFileDialog控件的Name属性为“odlgNotepad”,Filter属性设为“RTF文件|.rtf|所有文件|.*”。
public bool issave = false;
public bool tchange = false;
2.3.6 SaveFileDialog(保存对话框)
从工具箱中找到SaveFileDialog直接拖入窗体中 单击属性
当用户单击记事本的【文件】→【保存】(或【另存为】)菜单项时,使用保存对话框SaveFileDialog保存文件。SaveFileDialog控件的Name属性为“sdlgNotepad”,FileName属性改为“无标题”,Filter属性设为“RTF文件|*.rtf”。
2.3.7 FontDialog(字体对话框)
从工具箱中找到FontDialog直接拖入窗体中 单击属性
当用户单击记事本的【格式】→【字体】菜单项时,使用字体对话框FontDialog设置文本字体。FontDialog控件的Name属性为“fdlgNotepad”。
2.3.8 Timer(计时器控件)
从工具箱中找到Timer直接拖入窗体中 单击属性
本章介绍的记事本在状态栏中显示了时钟,这就需要使用一个Timer控件来实现。Timer控件的Name属性设为“tmrNotepad”,Enabled(激活的可行的)属性设为“True”,Interval(间隔,间距,幕间时间)属性设为“1000”,表示1秒种触发一次Tick事件,即1秒钟改变一次时钟。
三、代码编写
首先在该Form类中定义两个bool型变量,对应保存文件以及文字更改。
public bool issave = false;
public bool tchange = false;
3.1 RichTextBox代码
当向文字框内输入内容后,该段代码运行,含义为:文字已经change且未save。
private void richTextBox1_TextChanged(object sender, EventArgs e)
{
tchange = true;
issave = false;
}
3.1.1新建
private void isbsave()
{
if (issave == false && tchange == true)
{
if (MessageBox.Show("是否保存数据", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
save();
}
}
}
private void 新建ToolStripMenuItem_Click(object sender, EventArgs e)
{
isbsave();
richTextBox1.ResetText();
issave = false;
tchange = false;
fname = "";
}
其中isbsasve()函数功能在于文字框中存在内容且未保存的情况下生成如下窗口
3.1.2 打开
打开键对应执行open函数,将fname修改为该文件名,将文件内容载入文本框中。
private void open()
{
openFileDialog1.Title = "打开";
openFileDialog1.FileName = "";
openFileDialog1.Filter = "文本文件|*.txt;";
openFileDialog1.FilterIndex = 1;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
fname = openFileDialog1.FileName;
richTextBox1.LoadFile(fname, RichTextBoxStreamType.PlainText);
issave = false;
tchange = false;
}
}
private void 打开ToolStripMenuItem_Click(object sender, EventArgs e)
{
open();
}
3.1.3保存
private void 保存ToolStripMenuItem_Click(object sender, EventArgs e)
{
save();
}
private void save()
{
if (fname == "")
{
saveFileDialog1.Title = "保存";
this.saveFileDialog1.Filter = "文本文件|*.txt;";
if (this.saveFileDialog1.ShowDialog() == DialogResult.OK)
{
if (saveFileDialog1.FileName != "")
{
richTextBox1.SaveFile(saveFileDialog1.FileName, RichTextBoxStreamType.PlainText);
issave = true;
}
}
}
else
{
richTextBox1.SaveFile(fname, RichTextBoxStreamType.PlainText);
issave = true;
}
}
3.1.4另存为
private void 另存为ToolStripMenuItem_Click(object sender, EventArgs e)
{
osave();
}
private void osave()
{
saveFileDialog1.Title = "另存为";
this.saveFileDialog1.Filter = "文本文件|*.txt;";
if (this.saveFileDialog1.ShowDialog() == DialogResult.OK)
{
if (saveFileDialog1.FileName != "")
{
richTextBox1.SaveFile(saveFileDialog1.FileName, RichTextBoxStreamType.PlainText);
issave = true;
}
}
}
3.1.5退出
private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
{
Application.Exit();
}
3.2相关功能介绍
3.2.1 编辑菜单功能
该部分代码多为自带函数,较为简单,于一个代码框内放置。
private void 撤销ToolStripMenuItem_Click(object sender, EventArgs e)
{
richTextBox1.Undo();
}
private void 剪切ToolStripMenuItem_Click(object sender, EventArgs e)
{
richTextBox1.Cut();
}
private void 复制ToolStripMenuItem_Click(object sender, EventArgs e)
{
richTextBox1.Copy();
}
private void 粘贴ToolStripMenuItem_Click(object sender, EventArgs e)
{
richTextBox1.Paste();
}
private void 删除ToolStripMenuItem_Click(object sender, EventArgs e)
{
this.richTextBox1.SelectedText = "";
}
private void 全选ToolStripMenuItem_Click(object sender, EventArgs e)
{
richTextBox1.SelectAll();
}
private void 日期ToolStripMenuItem_Click_1(object sender, EventArgs e)
{
DateTime dt;
dt = DateTime.Now;
richTextBox1.AppendText(dt.Year.ToString() + "年 " + dt.Month.ToString() + "月 " + dt.Day.ToString() + "日" + dt.Hour.ToString() + "时 " + dt.Minute.ToString() + "分");
}
3.2.2 格式菜单功能
自动换行
private void 自动换行ToolStripMenuItem_Click(object sender, EventArgs e)
{
textWordWrap();
}
private void textWordWrap()
{
if (自动换行ToolStripMenuItem.Checked = !自动换行ToolStripMenuItem.Checked)
{
richTextBox1.WordWrap = true;
}
else
{
richTextBox1.WordWrap = false;
}
}
3.2.3 查看菜单功能
状态栏
private void 状态栏ToolStripMenuItem_Click(object sender, EventArgs e)
{
statusBar();
}
private void statusBar()
{
if (状态栏ToolStripMenuItem.Checked = !状态栏ToolStripMenuItem.Checked)
{
statusStrip1.Visible = true;
scriptstatus();
}
else
{
statusStrip1.Visible = false;
}
}
3.2.4 帮助菜单功能
对于记事本,使用一个新窗口显示记事本相关信息,本界面的内容可自由编辑。
private void 对于记事本ToolStripMenuItem_Click(object sender ,EventArgs e)
{
Form2 form2 = new Form2();
form2.Show();
}
3.3 工具栏代码
此部分是工具栏的点击实现
private void toolStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
int n;
n = toolStrip1.Items.IndexOf(e.ClickedItem);
switch(n)
{
case 0:
新建ToolStripMenuItem_Click(sender, e);
break;
case 1:
打开ToolStripMenuItem_Click(sender, e);
break;
case 2:
保存ToolStripMenuItem_Click(sender, e);
break;
case 3:
关于记事本ToolStripMenuItem_Click(sender, e);
break;
case 4:
剪切ToolStripMenuItem_Click(sender, e);
break;
case 5:
粘贴ToolStripMenuItem_Click(sender, e);
break;
case 7:
关于记事本ToolStripMenuItem_Click(sender, e);
break;
}
}
四、部分功能展示
关于记事本的部分功能
五、Gitee地址
https://gitee.com/fall-cherry-as-arrow/notepad/commits/master
六、小结
一开始的时候感觉都不会,但是想到老师上课和我们讲的要动脑思考,去发现其中的奥妙,这次实验报告写了很久,所以还是老师说的编程并不需要去死记硬背一些指令,而是去理解,一些指令在理解的基础上去编,会发现很简单。并且我感觉这是一个需要耐心的工作,在编程的过程会遇到各种各样的困难,如果没有耐心,就很容易打退堂鼓,那做不好这件事。要有耐心,知道有错误后,就得从头到尾反复地看,去发现错误。当你编完后,再运行成功了,你会感觉非常的快乐,就会特别有成就感。