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都已经有一个相对 ...
随机推荐
- rand值出现负数的解决方案
当rand($number)或者mt_rand($number)的时候,$number太大,超过pow(2,31) - 1;即整型最大值的时候,会出现负数. 如果只是单纯转换成整数而已的话,可以采用s ...
- 修改mac os分辨率(VMware)
转自:http://hi.baidu.com/hehonglei123/item/55591c17e7991d582a3e22a1 1. 在Mac系统中安装VMsvga2:VMsvga2_v1.2.3 ...
- Oracle数据库的导入与导出
导出 在命令行输入"exp",回车即可访问指定的数据库, 我这里需要访问远程的数据库,所以带上了IP.端口等一些参数,具体的参数详情可以输入"exp -help" ...
- Windows 10正式版官方原版ISO镜像下载
[微软官方]下载地址1:官方下载工具(32-位系统版本)官方下载工具(64-位系统版本) [MSDN]下载地址2:cn_windows_10_multiple_editions_x64_dvd_684 ...
- CentOS中查看系统资源占用情况的命令
用 'top -i' 看看有多少进程处于 Running 状态,可能系统存在内存或 I/O 瓶颈,用 free 看看系统内存使用情况,swap 是否被占用很多,用 iostat 看看 I/O 负载情况 ...
- Helpers\RainCaptcha
Helpers\RainCaptcha This class can validate CAPTCHA images with RainCaptcha. It can generate an URL ...
- 深入理解C语言中的指针与数组之指针篇(转载)
前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本所在.相信,任意一家公司如果想要考察一个人对C语言的理解,指针和数组绝对是必考的一部分. 但是之前一方面之前一直在忙各种事情 ...
- Object-c中的属性和成员变量的关系详解
很多人在初学移动开发的时候会对object-c中的合成存取方法感到疑惑,此处尝试为看到本文有缘人答疑解惑,鄙人才疏学浅,难免有疏漏谬误之处,热烈欢迎诸位看官拍砖指点. 1.合成存取方法: OC为增加开 ...
- C. Guess Your Way Out!
C. Guess Your Way Out! time limit per ...
- Android进阶笔记09:Android开发经验部分总结
1. 在Android library中不能使用switch-case语句访问资源ID:在Android library中不能使用switch-case语句访问资源ID的原因分析及解决方案 2. 不能 ...