C#编写记事本(高仿)
近一周写的关于记事本的代码,高仿记事本。本人C#入门不久,其中存在代码冗余,但懒得修改了。
经测试运行正常。
一、主窗体设计及代码

namespace BestEditor
{
public partial class Main : Form
{
private bool isTextChanged;
private string path;//记录文件路径(刚新建的文件路径为"",打开的文件路径为原路径) public Main()
{
InitializeComponent();
this.Text = "无标题 - 记事本";
path = "";
} /// <summary>
/// 初始化窗体时调用
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Main_Load(object sender, EventArgs e)
{
//初始化,撤销、剪切、复制、删除 不可用
撤消UToolStripMenuItem.Enabled = false;
剪切TToolStripMenuItem.Enabled = false;
复制CToolStripMenuItem.Enabled = false;
删除LToolStripMenuItem.Enabled = false; if (richTextBoxBoard.Equals(""))
{
查找FToolStripMenuItem.Enabled = false;
查找下一个NToolStripMenuItem.Enabled = false;
}
else
{
查找FToolStripMenuItem.Enabled = true;
查找下一个NToolStripMenuItem.Enabled = true;
} if (Clipboard.ContainsText())
粘贴PToolStripMenuItem.Enabled = true;
else
粘贴PToolStripMenuItem.Enabled = false; toolStripStatusLabel2.Text = "第 1 行,第 1 列";
} private void 新建NToolStripMenuItem_Click(object sender, EventArgs e)
{
//如果输入框文字发生变动
if (isTextChanged)
{
saveFileDialog1.FileName = "*.txt";
DialogResult dr = MessageBox.Show("是否将更改保存到 " + this.Text + "?", "记事本",
MessageBoxButtons.YesNoCancel);
if (dr == DialogResult.Yes)
{
//获取或设置指定要在 SaveFileDialog 中显示的文件类型和说明的筛选器字符串
saveFileDialog1.Filter = @"文本文档(*.txt)|*.txt|所有格式|*.txt;*.doc;*.cs;*.rtf;*.sln";
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
richTextBoxBoard.SaveFile(saveFileDialog1.FileName, RichTextBoxStreamType.PlainText);
richTextBoxBoard.Text = "";
path = "";
}
}
else if(dr == DialogResult.No)
{
richTextBoxBoard.Text = "";
path = "";
}
}
else
{
richTextBoxBoard.Text = "";
this.Text = "无标题 - 记事本";
path = "";
}
} /// <summary>
/// 输入框发生变化时触发
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void richTextBoxBoard_TextChanged(object sender, EventArgs e)
{
isTextChanged = true;
} private void 打开OToolStripMenuItem_Click(object sender, EventArgs e)
{
if (isTextChanged)
{
saveFileDialog1.FileName = "*.txt";
DialogResult dr = MessageBox.Show("是否将更改保存到 " + this.Text + "?", "记事本",
MessageBoxButtons.YesNoCancel);
if (dr == DialogResult.Yes)
{
//获取或设置指定要在 SaveFileDialog 中显示的文件类型和说明的筛选器字符串
saveFileDialog1.Filter = @"文本文档(*.txt)|*.txt|所有格式|*.txt;*.doc;*.cs;*.rtf;*.sln";
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
richTextBoxBoard.SaveFile(saveFileDialog1.FileName, RichTextBoxStreamType.PlainText);
Text = saveFileDialog1.FileName.Substring(saveFileDialog1.FileName.LastIndexOf("\\")+)+
" - 记事本";
}
}
} openFileDialog1.FileName = ""; if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
path = openFileDialog1.FileName;
Text = path.Substring(path.LastIndexOf("\\") + ) + " - 记事本";
Console.WriteLine("path={0}",path);
richTextBoxBoard.LoadFile(path, RichTextBoxStreamType.PlainText);
isTextChanged = false;
}
} private void 保存SToolStripMenuItem_Click(object sender, EventArgs e)
{
if (!("".Equals(path)))
{
richTextBoxBoard.SaveFile(path, RichTextBoxStreamType.PlainText);
isTextChanged = false;
}
else
{
saveFileDialog1.Filter = @"文本文档(*.txt)|*.txt|所有格式|*.txt;*.doc;*.cs;*.rtf;*.sln";
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
richTextBoxBoard.SaveFile(saveFileDialog1.FileName, RichTextBoxStreamType.PlainText);
path = saveFileDialog1.FileName;
this.Text = path.Substring(path.LastIndexOf("\\") + ) + " - 记事本";
isTextChanged = false;
}
}
} private void 另存为AToolStripMenuItem_Click(object sender, EventArgs e)
{
saveFileDialog1.Filter = @"文本文档(*.txt)|*.txt|所有格式|*.txt;*.doc;*.cs;*.rtf;*.sln";
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
richTextBoxBoard.SaveFile(saveFileDialog1.FileName, RichTextBoxStreamType.PlainText);
path = saveFileDialog1.FileName;
this.Text = path.Substring(path.LastIndexOf("\\") + ) + " - 记事本";
isTextChanged = false;
}
} private void 页面设置UToolStripMenuItem_Click(object sender, EventArgs e)
{
pageSetupDialog1.Document = printDocument1;
pageSetupDialog1.ShowDialog();
} private void 打印PToolStripMenuItem_Click(object sender, EventArgs e)
{
printDialog1.Document = printDocument1;
printDialog1.ShowDialog();
} private void 退出XToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Close();
} private void 撤消UToolStripMenuItem_Click(object sender, EventArgs e)
{
richTextBoxBoard.Undo();
} private void 编辑EToolStripMenuItem_Click(object sender, EventArgs e)
{
if (richTextBoxBoard.CanUndo)
撤消UToolStripMenuItem.Enabled = true; if (richTextBoxBoard.SelectionLength > )
{
剪切TToolStripMenuItem.Enabled = true;
复制CToolStripMenuItem.Enabled = true;
删除LToolStripMenuItem.Enabled = true;
}
else
{
剪切TToolStripMenuItem.Enabled = false;
复制CToolStripMenuItem.Enabled = false;
删除LToolStripMenuItem.Enabled = false;
} if (richTextBoxBoard.Equals(""))
{
查找FToolStripMenuItem.Enabled = false;
查找下一个NToolStripMenuItem.Enabled = false;
}
else
{
查找FToolStripMenuItem.Enabled = true;
查找下一个NToolStripMenuItem.Enabled = true;
} if (Clipboard.ContainsText())
粘贴PToolStripMenuItem.Enabled = true;
else
粘贴PToolStripMenuItem.Enabled = false;
} private void 剪切TToolStripMenuItem_Click(object sender, EventArgs e)
{
richTextBoxBoard.Cut();
} private void 复制CToolStripMenuItem_Click(object sender, EventArgs e)
{
richTextBoxBoard.Copy();
} private void 粘贴PToolStripMenuItem_Click(object sender, EventArgs e)
{
richTextBoxBoard.Paste();
} private void 删除LToolStripMenuItem_Click(object sender, EventArgs e)
{
richTextBoxBoard.SelectedText = "";
} /// <summary>
/// 不同窗体之间通讯
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void 查找FToolStripMenuItem_Click(object sender, EventArgs e)
{
Search search = new Search();
search.Owner = this;
search.Show();
} private void 查找下一个NToolStripMenuItem_Click(object sender, EventArgs e)
{
Search search = new Search();
search.Owner = this;
search.Show();
} private void 替换RToolStripMenuItem_Click(object sender, EventArgs e)
{
Change change = new Change();
change.Owner = this;
change.Show();
} private void 转到GToolStripMenuItem_Click(object sender, EventArgs e)
{
Goto gt = new Goto();
gt.Owner = this;
gt.Show();
} private void 全选AToolStripMenuItem_Click(object sender, EventArgs e)
{
richTextBoxBoard.SelectAll();
} private void 时间日期DToolStripMenuItem_Click(object sender, EventArgs e)
{
string front = richTextBoxBoard.Text.Substring(, richTextBoxBoard.SelectionStart);
string back = richTextBoxBoard.Text.Substring(richTextBoxBoard.SelectionStart,
richTextBoxBoard.Text.Length - richTextBoxBoard.SelectionStart);
richTextBoxBoard.Text = front + DateTime.Now.ToString() + back;
} private void 自动换行WToolStripMenuItem_Click(object sender, EventArgs e)
{
if (richTextBoxBoard.WordWrap)
{
自动换行WToolStripMenuItem.Checked = false;
richTextBoxBoard.WordWrap = false;
}
else
{
自动换行WToolStripMenuItem.Checked = true;
richTextBoxBoard.WordWrap = true;
}
} private void 字体FToolStripMenuItem_Click(object sender, EventArgs e)
{
fontDialog1.ShowDialog();
richTextBoxBoard.SelectionFont = fontDialog1.Font;
} /// <summary>
/// 控制底部状态栏显示与否
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void 状态栏SToolStripMenuItem_Click(object sender, EventArgs e)
{
if (状态栏SToolStripMenuItem.Checked)
{
状态栏SToolStripMenuItem.Checked = false;
statusStrip1.Visible = false;
}
else
{
状态栏SToolStripMenuItem.Checked = true;
statusStrip1.Visible = true;
}
} /// <summary>
/// 输入框光标位置变化时触发
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void richTextBoxBoard_SelectionChanged(object sender, EventArgs e)
{
string[] str = richTextBoxBoard.Text.Split('\r', '\n');
int row = , column = , pos = richTextBoxBoard.SelectionStart; foreach(string s in str)
Console.WriteLine(s);
Console.WriteLine("pos={0}",pos); for (int i = ; pos - str[i].Length > ; i++)
{
pos = pos - str[i].Length - ;
row = i + ;
}
column = pos + ;
toolStripStatusLabel2.Text = "第 " + row + " 行,第 " + column + " 列";
} private void 关于记事本AToolStripMenuItem_Click(object sender, EventArgs e)
{
AboutBox ab = new AboutBox();
ab.Show();
} private void 查看帮助HToolStripMenuItem_Click(object sender, EventArgs e)
{
//调用系统内部的notepad.chm文件
} /// <summary>
/// 点击窗体右上角关闭按钮触发
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Main_FormClosing(object sender, FormClosingEventArgs e)
{
if (isTextChanged)
{
if (!("".Equals(path)))
{
DialogResult dr = MessageBox.Show("是否将更改保存到"+path+"?","记事本",
MessageBoxButtons.YesNoCancel);
if (dr == DialogResult.Yes)
richTextBoxBoard.SaveFile(path, RichTextBoxStreamType.PlainText);
else if (dr == DialogResult.No)
e.Cancel = false;
else
e.Cancel = true;//不关闭
}
else
{
DialogResult dr = MessageBox.Show("是否将更改保存到 无标题?", "记事本",
MessageBoxButtons.YesNoCancel);
if (dr == DialogResult.Yes)
{
saveFileDialog1.Filter = @"文本文档(*.txt)|*.txt|所有格式|*.txt;*.doc;*.cs;*.rtf;*.sln";
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
richTextBoxBoard.SaveFile(saveFileDialog1.FileName, RichTextBoxStreamType.PlainText);
else
e.Cancel = true;
}
else if (dr == DialogResult.No)
e.Cancel = false;
else
e.Cancel = true;
}
}
}
}
}
二、查找子窗体设计及代码

namespace BestEditor
{
public partial class Search : Form
{
private RichTextBox rtb = new RichTextBox(); public Search()
{
InitializeComponent();
} /// <summary>
/// 初始化时得到主窗口的通讯数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Search_Load(object sender, EventArgs e)
{
Main main = (Main)this.Owner;
this.rtb = main.richTextBoxBoard;
} /// <summary>
/// 取消
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
this.Close();
} private void button1_Click(object sender, EventArgs e)
{
string str = rtb.Text;//文件内容
string subSearch = textBox1.Text;//查找内容
string initString = subSearch;
int pos = rtb.SelectionStart;//光标位置 if (!checkBox1.Checked)
{
str = str.ToLower();
subSearch = subSearch.ToLower();
} if (radioButton1.Checked)//向上查找
{
if (rtb.SelectionLength > )
pos = pos + rtb.SelectionLength - ; str = str.Substring(, pos);
if (subSearch != "" && (pos = str.LastIndexOf(subSearch, pos)) != -)
{
//输入框得到焦点并选中查找的内容
rtb.Focus();
rtb.SelectionStart = pos;
rtb.SelectionLength = subSearch.Length;
}
else
MessageBox.Show("找不到\"" + initString + "\"", "记事本",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
if (rtb.SelectionLength > )
pos = pos + ;
if (subSearch != "" && (pos = str.IndexOf(subSearch, pos)) != -)
{
rtb.Focus();
rtb.SelectionStart = pos;
rtb.SelectionLength = subSearch.Length;
}
else
MessageBox.Show("找不到\"" + subSearch + "\"", "记事本",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
}
三、替换子窗体设计及其代码

namespace BestEditor
{
public partial class Change : Form
{
private RichTextBox rtb = new RichTextBox(); public Change()
{
InitializeComponent();
} private void Change_Load(object sender, EventArgs e)
{
Main main = (Main)this.Owner;
this.rtb = main.richTextBoxBoard;
button1.Enabled = false;
button2.Enabled = false;
button3.Enabled = false;
} /// <summary>
/// 查找下一个
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
string str = rtb.Text;
string subSearch = textBox1.Text;
string initString = subSearch;
int pos = rtb.SelectionStart; if (!checkBox1.Checked)
{
str = str.ToLower();
subSearch = subSearch.ToLower();
} if (rtb.SelectionLength > )
pos = pos + ;
if ((pos = str.IndexOf(subSearch, pos)) != -)
{
rtb.Focus();
rtb.SelectionStart = pos;
rtb.SelectionLength = subSearch.Length;
}
else
MessageBox.Show("找不到\"" + initString + "\"", "记事本",
MessageBoxButtons.OK, MessageBoxIcon.Information);
} private void textBox1_TextChanged(object sender, EventArgs e)
{
bool flag = textBox1.Text != "";
button1.Enabled = flag;
button2.Enabled = flag;
button3.Enabled = flag;
} /// <summary>
/// 取消
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button4_Click(object sender, EventArgs e)
{
this.Close();
} /// <summary>
/// 替换
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
string str = rtb.Text;
string subSearch = textBox1.Text;
string initString = subSearch;
string changeTo = textBox2.Text;
string front;
string dest;
string back;
int pos = rtb.SelectionStart; if (!checkBox1.Checked)
{
str = str.ToLower();
subSearch = subSearch.ToLower();
} if (rtb.SelectionLength > )
{
if (rtb.SelectedText.Equals(subSearch))
{
//将文本框字符串分段,替换后再组合
front = rtb.Text.Substring(,pos);
dest = changeTo;
back = rtb.Text.Substring(pos + subSearch.Length, rtb.Text.Length - pos - subSearch.Length);
rtb.Text = front + dest + back;
}
pos = pos + ;
} if ((pos = str.IndexOf(subSearch, pos)) != -)
{
rtb.Focus();
rtb.SelectionStart = pos;
rtb.SelectionLength = subSearch.Length;
}
else
MessageBox.Show("找不到\"" + initString + "\"", "记事本",
MessageBoxButtons.OK, MessageBoxIcon.Information);
} /// <summary>
/// 全部替换
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button3_Click(object sender, EventArgs e)
{
string str = rtb.Text;
string subSearch = textBox1.Text;
string changeTo = textBox2.Text;
string front;
string dest;
string back;
int pos = ; if (!checkBox1.Checked)
{
str = str.ToLower();
subSearch = subSearch.ToLower();
} while ((pos=str.IndexOf(subSearch,pos))!=-)
{
front = rtb.Text.Substring(, pos);
dest = changeTo;
back = rtb.Text.Substring(pos + subSearch.Length, rtb.Text.Length - pos - subSearch.Length);
rtb.Text = front + dest + back;
if (!checkBox1.Checked)
str = rtb.Text.ToLower();
}
}
}
}
四、转到子窗体设计及其代码

namespace BestEditor
{
public partial class Goto : Form
{
private RichTextBox rtb = new RichTextBox(); public Goto()
{
InitializeComponent();
} private void Goto_Load(object sender, EventArgs e)
{
Main main = (Main)this.Owner;
this.rtb = main.richTextBoxBoard;
} private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if ((e.KeyChar < || e.KeyChar > ) && e.KeyChar != && e.KeyChar != )
{
e.Handled = true;
MessageBox.Show("只能接收数字","记事本",MessageBoxButtons.OK,MessageBoxIcon.Error);
}
} private void button2_Click(object sender, EventArgs e)
{
this.Close();
} /// <summary>
/// 确定
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
int row = int.Parse(textBox1.Text);
int pos = ;
string[] str = rtb.Text.Split('\r', '\n'); if (row < || row > str.Length)
MessageBox.Show("行数超出范围", "记事本 - 跳行", MessageBoxButtons.OK);
else
{
for (int i = ; i < row; i++)
pos = pos + str[i-].Length + ;
this.Close();
rtb.Focus();
rtb.SelectionStart = pos;
}
}
}
}
五、“关于”对话框
直接插入“关于”对话框即可

代码下载链接:
http://pan.baidu.com/s/1o6mJtSu
Ps:
编写过程中有参考到以下代码:http://blog.csdn.net/mathewsking/article/details/3645753,在此谢谢博主的思路启发!
C#编写记事本(高仿)的更多相关文章
- Qt编写高仿苹果MAC电脑输入法(支持触摸滑动选词)
最近有个朋友找我定制一个输入法,需要高仿一个苹果MAC电脑的输入法,MAC操作系统的审美无疑是相当棒的,于是乎直接拿以前的输入法高仿了一个,由于之前有做过输入法这块的开发,而且改进了四年,各种需求都遇 ...
- 微信小程序开发日记——高仿知乎日报(下)
本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP 要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该 ...
- 微信小程序开发日记——高仿知乎日报(中)
本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该教 ...
- 用vue2 +vue-router2 + es6 +webpack 高仿饿了么app(干货满满)
#高仿饿了么app商家详情 (vue2 +vue-router2 + es6 +webpack ) ##demo [demo 地址](http://liangxiaojuan.github.io/ ...
- Android DrawerLayout 高仿QQ5.2双向侧滑菜单
1.概述 之前写了一个Android 高仿 QQ5.0 侧滑菜单效果 自定义控件来袭 ,恰逢QQ5.2又加了一个右侧菜单,刚好看了下DrawerLayout,一方面官方的东西,我都比较感兴趣:另一方面 ...
- iOS高仿app源码:纯代码打造高仿优质《内涵段子》
iOS高仿app源码:纯代码打造高仿优质<内涵段子>收藏下来 字数1950 阅读4999 评论173 喜欢133 Github 地址 https://github.com/Charlesy ...
- 利用JQ实现的,高仿 彩虹岛官网导航栏(学习HTML过程中的小记录)
利用JQ实现的,高仿 彩虹岛官网导航栏(学习HTML过程中的小记录) 作者:王可利(Star·星星) 总结: 今天学习的jQ类库的使用,代码重复的比较多需要完善.严格区分大小写,在 $(" ...
- Android 高仿腾讯旗下app的 皮肤加载技术
http://www.cnblogs.com/punkisnotdead/p/4968851.html 以前写的这篇文章 可以高仿出 知乎 新浪微博等 绝大多数app的换肤技术,但是遗漏了腾讯的效果, ...
- Android ActionBar应用实战,高仿微信主界面的设计
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/26365683 经过前面两篇文章的学习,我想大家对ActionBar都已经有一个相对 ...
随机推荐
- Ruby on Rails Tutorial 第三章 静态页面
1.生成静态页面 $ rails generate controller StaticPages home help #生成主页和帮助页面的路由.控制器及静态页面 $ rails destroy ...
- Apache 学习笔记(心得)
http://blog.csdn.net/btbtd/article/details/288027#2 # 分类:# 01.常规设置# 02.虚拟主机# 03.<Directory> + ...
- 判断脚本,图片,CSS,iframe等是否加载完成
1.图片 <img id="MyImg" src="src"/>jquery实现:$("#MyImg").load(functi ...
- Rating
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission ...
- ie6 7 8 9 firefox的css兼容问题
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 字体的大小(pt)和像素(px)如何转换?
px:相对长度单位.像素(Pixel). pt:绝对长度单位.点(Point). 1in = 2.54cm = 25.4 mm = 72pt = 6pc 具体换算是: Points Pixels Em ...
- 使用 collectionView 实现表头,区头,区尾
UICollectionView 的使用是跟表的使用是一样,瀑布流的布局会比表的效果更好,这里说一下 collectionView 设置表头, 区头,区尾 设置表头可以约束 collectionVie ...
- 关于win7系统中所有exe文件都被以word方式打开的解决方法
手残一刻,电脑桌面所有的软件快捷方式都变成了word的打开方式,鼠标右键选中某exe文件也没打开方式那个选项, 第一次尝试: 在控制面板——默认程序中修改默认打开方式,但是没有找到解决方法
- hdu 1195 广度搜索
这题我们可以用优先队列,每次弹出队列中操作次数最少的一个,那么当找到匹配数时,该值一定是最优的.需要注意的时,加个vi[]数组,判读当前数是否已经存在于队列中.我做的很烦啊~~~ #include&l ...
- 写css动画
<!doctype html><html lang="en"> <head> <meta charset="UTF-8" ...