一、前言
这应该算是C#窗体界面编程的一个小实验把
二、实现
首先先拉一个窗体,再拖一些控件(menuStrip,contextMenuStrip,timer,richTextBox)
然后界面暂时设置成这个样子。
相应的属性、热键、快捷键自己设定好,细心点,需要点时间,应该不难。
完成了界面的设置和属性的设定,基本完成了1/3
接下来就是功能的实现。
【0】当加载窗体UI的时候
//注意设置的私有成员名称,后面将会用到,名字可以自己设定
private OpenFileDialog od = new OpenFileDialog();
private SaveFileDialog sd = new SaveFileDialog();
private bool richboxTextHasChanged = false;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
od.FileName = "";
od.Filter = "TXT FILE(*.txt)|*.txt";
sd.Filter = "TXT FILE(*.txt)|*.txt";
label2.Text = "时间:" + DateTime.Now.ToLongTimeString().ToString();
timer1.Enabled = true;
timer1.Interval = 100;
}
注意里面设置的私有成员噢,后面将会泳道。
【1】当点击新建功能的时候
private void 新建ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (od.FileName != "" && richboxTextHasChanged == true && MessageBox.Show("文本内容已更改\n是否保存修改?", "信息提示", MessageBoxButtons.OKCancel) == System.Windows.Forms.DialogResult.OK)
{//若文本改动,首先保存
richTextBox1.SaveFile(od.FileName, RichTextBoxStreamType.PlainText);
}
//不然初始化界面
od.FileName = "";
this.Text = "记事本";
this.richTextBox1.Clear();
this.richboxTextHasChanged = false;
}
【2】当点击打开功能的时候
private void 打开ToolStripMenuItem_Click(object sender, EventArgs e)
{
od.ShowDialog();//选择打开文本文件
if (od.FileName != "")
{
//将文本文件里面的内容加载到界面内
richTextBox1.LoadFile(od.FileName, RichTextBoxStreamType.PlainText);
this.Text = od.FileName + "-记事本";
}
}
【3】当点击保存功能的时候
private void 保存ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (od.FileName != "")
{
richTextBox1.SaveFile(od.FileName, RichTextBoxStreamType.PlainText);
}
else
MessageBox.Show("请先打开文本文件", "信息提示", MessageBoxButtons.OK);
}
【4】当点击另存为功能的时候
private void toolStripMenuItem1_Click(object sender, EventArgs e)
{
if (sd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
richTextBox1.SaveFile(sd.FileName, RichTextBoxStreamType.PlainText);
}
}
【5】当点击退出功能的时候
private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Dispose();
this.Close();
}
【6】当点击剪切功能的时候
private void 剪切ToolStripMenuItem_Click(object sender, EventArgs e)
{
richTextBox1.Cut();
}
【7】当点击复制功能的时候
private void 复制ToolStripMenuItem_Click(object sender, EventArgs e)
{
richTextBox1.Copy();
}
【8】当点击粘贴功能的时候
private void 粘贴ToolStripMenuItem_Click(object sender, EventArgs e)
{
richTextBox1.Paste();
}
【9】当点击字体功能的时候
private void 字体ToolStripMenuItem_Click(object sender, EventArgs e)
{//设置字体
FontDialog fd = new FontDialog();
fd.ShowDialog();
richTextBox1.Font = fd.Font;
}
【10】当点击全选功能的时候
private void 全选AToolStripMenuItem_Click(object sender, EventArgs e)
{
richTextBox1.SelectAll();
}
【11】当点击日期功能的时候
private void 时间日期DToolStripMenuItem_Click(object sender, EventArgs e)
{
richTextBox1.AppendText(System.DateTime.Now.ToString());
}
将会在文本后面追加上当前日期时间信息。
【12】当点击查看帮助功能的时候
private void 查看帮助ToolStripMenuItem_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("https://answers.microsoft.com/en-us/windows/forum/apps_windows_10");
}
这时候提供一个网址,就是会打开记事本的帮助网页。
【13】点击关于记事本的时候
private void 关于记事本AToolStripMenuItem_Click(object sender, EventArgs e)
{
//这里的AboutBox是自己编写的一个界面,调用就好,里面随便写写自己这个记事本的版本信息啥的就可以了
AboutBox.Form1 about = new AboutBox.Form1();
about.ShowDialog();
}
这里的AboutBox是自己编写的一个界面,调用这个界面就好,里面随便写写自己这个记事本的版本信息啥的就可以了。
例如:我的
ContextMenuStrip里面的功能同上一样实现,相应的拷贝一下就好了。
【14】richTextBox监听事件1
private void richTextBox1_TextChanged(object sender, EventArgs e)
{
richboxTextHasChanged = true;
}
给richTextBox设置一个事件,当文本内容改变的时候,就将richboxTextHasChanged设置为true表明文本内容有改动
【15】richTextBox监听事件2
private void richTextBox1_SelectionChanged(object sender, EventArgs e)
{
if (richTextBox1.SelectedText != "")//如果鼠标选中了文本内容
{
this.剪切ToolStripMenuItem.Enabled = true;
this.复制ToolStripMenuItem.Enabled = true;
this.剪切TToolStripMenuItem.Enabled = true;
this.复制CToolStripMenuItem.Enabled = true;
}
else//如果鼠标没有选中文本内容
{
this.剪切ToolStripMenuItem.Enabled = false;
this.复制ToolStripMenuItem.Enabled = false;
this.剪切TToolStripMenuItem.Enabled = false;
this.复制CToolStripMenuItem.Enabled = false;
}
}
有些功能只有在选中了文本的时候才能使用,我们设置一个这样的监听事件,当有文本被选中的时候,就将这些功能起作用,否则不能让这些功能起作用。
【16】右下角显示时间信息
private void timer1_Tick(object sender, EventArgs e)
{
//没隔一段时间更新下时间信息
label2.Text = "时间:"+DateTime.Now.ToLongTimeString().ToString();
}
更新时间信息,让时间及时更新。
【17】richTextBox监听事件3
//鼠标点击的时候触发
private void richTextBox1_MouseDown(object sender, MouseEventArgs e)
{
int index = richTextBox1.GetFirstCharIndexOfCurrentLine();
int line = richTextBox1.GetLineFromCharIndex(index) + 1;
int col = richTextBox1.SelectionStart - index + 1;
label1.Text = "第 " + line.ToString() + " 行,第 " + col.ToString() + " 列";
}
//首次按下某个键的时候触发
private void richTextBox1_KeyDown(object sender, KeyEventArgs e)
{
int index = richTextBox1.GetFirstCharIndexOfCurrentLine();
int line = richTextBox1.GetLineFromCharIndex(index) + 1;
int col = richTextBox1.SelectionStart - index + 1;
label1.Text = "第 " + line.ToString() + " 行,第 " + col.ToString() + " 列";
}
通过这两个监听事件,让左下角的标签时刻显示出当前正在编辑的行列数。
三、运行效果
【1】打开功能
【2】编辑文本时
【3】帮助功能
【4】关于记事本功能
其他功能不再演示(过于占版面),大概跟记事本差不多,虽然比真的记事本弱很多。
四、实验总结
通过此次实验我加深了对MenuStrip,ContextMenuStrip,RichText,FontDialog,OpenFileDialog,SaveFileDialog等控件的使用,以及对RichText的Cut、Clear、Copy、Paste等方法熟悉。
最后我实现了相应的窗体的构造,下拉框、弹出框都先构造其框架,再加上其热键和快捷键,最后实现其功能
最后不仅实现了上面老师要求的一些东西,还自己加上了时间的显示以及当前鼠标所在行列的显示
功能都相应的实现了,通过此次实验我学到了实际的操作,进步很大,也深深体会到了VS用C#编辑窗体程序真的很强大。
运行情况如上截图
最后感觉自己编写出了一个最最最简单的记事本出来了。
菜鸡进步史······runing······