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都已经有一个相对 ...
随机推荐
- 深入MySQL源码 学习方法 何登成专家
MYSQL 技术圈 有哪些做得好,又注重分享的公司: Oracle MySQL, MariaDB, Percona,Google, FB, Twitter, Taobao, NetEase… 有哪些值 ...
- 浅谈C/C++中的static和extern关键字 转
原文:http://developer.51cto.com/art/201104/256820.htm static是C++中常用的修饰符,它被用来控制变量的存贮方式和可见性.extern, &quo ...
- BootStrap2学习日记5---列表
常用列表标签有3中如下:<ul><li><ol><li><dl><dt><dd> 例子: <div class ...
- C#面向对象(一) 封装
一.什么叫做面向对象封装? 封装的概念:隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读取和修改的访问级别. 二.面向对象封装有什么好处(为什么要封装)? 封装的目的:是增强安全性和简化 ...
- iaas,paas,saas理解
IaaS.PaaS.SaaS多次看到这几个单词,今天仔细看看来, 这几个词和云计算相关:1,iaaS,Hardware-as-a-Service,信息,硬件服务,服务器,存储和网络硬件,网络存储,带 ...
- DedeCMS更新文章同步发布到新浪微博
如果在网站推广过程中能利用好微博这个工具的话,将会给网站的推广工作带来巨大的便利.下面以dede程序为例讲讲如何将网站内容自动同步到新浪微博. 在新浪微博的工具中有个自动关联博客的功能,利用好这个功能 ...
- Linux 内核模块设计
一. 内核模块 1. 头文件 Linux/init.h 和 Linux/module.h 2. 装载内核 insmod 对应的转载函数 module_init(); 3. 卸载内核 rmm ...
- git 一个文件还原到某个提交的commit
git checkout ${commit} /path/to/file 参考文献中1的参考链接中的git-checkout(1) Manual Page 中的Name: git-checkout - ...
- Win7 32bit(x86)/64bit(x64) 完整安装版(非GHOST版本)
Windows7 32bit 旗舰iso格式完整安装镜像 百度云盘:http://pan.baidu.com/s/1bpjLPs Windows7 64bit 旗舰iso格式完整安装镜像 百度云盘:h ...
- 不可小觑的“alt”
定义和用法 alt 属性是一个必需的属性,它规定在图像无法显示时的替代文本. 假设由于下列原因用户无法查看图像,alt 属性可以为图像提供替代的信息: 网速太慢 src 属性中的错误 浏览器禁用图像 ...