简介
平日里我们学习,生活中可能都要用到各种词典,许多人可能觉得 词典是个多么神奇的东西.
其实 一本简单的词典软件要写出来很简单, 当然 功能强大 智能的词典软件 就另当别论了.
那么,我们今天就来写一款 英汉词典翻译软件 吧 :)
原理
这里 主要用到了 一个泛型字典 Dictionary<string, string> 通过他的键key作为词典搜索的英文单词 来找到其相对应的值Value(中文意思)
查找方式是 通过输入文本框的 TextChanged 事件 进行自动搜索 泛型字典里对应的中文意思(Value值)
当然 不可能每个单词 我这里都能搜索到 为此,在本地没有搜索到的情况下
这里新增了一个在线搜索功能 (当然是默认为 5秒时间内 文本框没有输入内容的时候[默认为已经确认为要查找的单词]
才触发的-这里用了timer的tick计时事件)
使用 LinkLabel 的功能 将在线翻译网站 ICIBA.com(爱词霸的链接显示出来) 当然链接附加了 当前未搜索到的单词
只需要点击该链接 就能直接获取到 爱词霸网站 该单词的中文翻译了 :)
此外, 经过学友@June的推荐 参考了下June的学习笔记以及阿东东先生的博文-C#WinformTextbox猜想输入
在这里添加了一个 输入单词 智能提示的功能(输入某个不完整的单词 获取相应的智能提示列表) 如下图
首先让我们开始做 界面设计
在程序里 我们需要调用 英汉词典.txt 文本文件, 我们可以直接拷贝 粘贴该文件到 项目下面
但如果 直接粘贴 该文本文件到项目下的话 我们需要调用其绝对路径 比如
D:\study\博客园cnblog\博客日志\英汉词典\英汉词典\英汉字典\英汉词典.txt
这样有个缺点, 一旦 D:...\英汉字典\ 下的 英汉词典.txt 被转移了 我们项目程序 就无法找到该文本文件了, 同理 如果你将你的该项目程序打包 发给你的朋友
在他电脑上也无法找到 文本文件 因为该文本仅存在于 你电脑的 D:...\英汉字典\ 目录下
所以 我们需要 将其绝对路径 设置为相对路径
这里介绍一个 调用相对路径的办法 请看 Visual Studio 项目下 设置文件路径为 相对路径
文本词典内容
英汉词典.txt 下载
代码如下(附 新增的智能提示代码)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
| public partial class frmDictionary : Form { public frmDictionary() { InitializeComponent(); this.Load += (s, e) => { InitializeTimer(); }; //窗体加载的时候 初始化计时器 } //new一个泛型字典来装载 英汉词典.txt里的内容(键值对) Dictionary<string, string> dic = new Dictionary<string, string>();
//----------------------------新增代码---------------------------// //new一个 泛型list 用来装载智能提示的单词 List<string> lsSmart = new List<string>(); //----------------------------新增代码---------------------------//
//读取 绝对路径下的英汉词典.txt的每一行数据 采用的是系统默认的Encoding编码格式 //string[] strArr = File.ReadAllLines(@"D:\study\博客园cnblogs\博客日志\C#日志\英汉词典\英汉词典\英汉词典.txt", Encoding.Default);
//读取 英汉词典.txt的相对 路径 string[] strArr = File.ReadAllLines(@"英汉词典.txt", Encoding.Default);
//在窗体加载的时候自动运行 private void frmDictionary_Load(object sender, EventArgs e) { //遍历每一行 //每行有2个数 英文单词 和 中文翻译 for (int i = 0; i < strArr.Length; i++) { //使用Split方法 移除空的单个字符 string[] strArr1 = strArr[i].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
//如果 泛型字典的键key值里 不包含数组里strArr1第0个数 //避免重复添加 if (dic.Keys.Contains(strArr1[0]) == false) { //则将数组里的键(英文单词) 和值(中文翻译) 添加到泛型字典里 dic.Add(strArr1[0], strArr1[1]);
//----------------------新增代码-------------------------------// lsSmart.Add(strArr1[0]); //将每行 数组里的第0个元素 即英文单词 添加到泛型list中 //----------------------新增代码-------------------------------//
} } //----------------------新增代码-------------------------------// // C#封装了一个AutoCompleteStringCollection 类 用于完成某些 窗体控件 自动补全 功能的字符串集合 AutoCompleteStringCollection strings = new AutoCompleteStringCollection(); // 将获取所有英文单词的 list泛型转换成数组 添加到 strings里 strings.AddRange(lsSmart.ToArray()); txtInput.AutoCompleteCustomSource = strings; //然后赋给文本框的 自动补全 所需的资源 属性 txtInput.AutoCompleteSource = AutoCompleteSource.CustomSource; //指定 CustomSource 为数据源 txtInput.AutoCompleteMode = AutoCompleteMode.Suggest; //启动自动补全模式 //----------------------新增代码-------------------------------//
}
//在文本框的TextChanged 事件下进行 键值查询 private void txtInput_TextChanged(object sender, EventArgs e) { //如果泛型字典里的包含有key 与文本框输入相同的话 //则在 下面的文本框里显示结果Value if (dic.Keys.Contains(txtInput.Text.Trim())) { //如果输入文本框的内容 存在于泛型字典的键key中 //则显示该键相对应的值 并赋给文本框 txtResult.Text = dic[txtInput.Text.Trim()]; //由于此时搜索到了翻译结果 所以请求在线搜索变为false linkWebSearch.Visible = false; timer.Stop(); TimeLength = 0; } //如果输入的数据为空 else if (txtInput.Text.Trim() == "") { //提示 输入单词 txtResult.Text = "请输入你要查询的单词"; //此时没有进行查询 所以请求在线搜索变为false linkWebSearch.Visible = false; timer.Stop(); TimeLength = 0; } else { //否则显示正在搜索中 txtResult.Text = "正在搜索..."; timer.Start(); //开始计时 } }
//这里 调用了 LinkLable的 click事件 private void linkWebSearch_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { //显示出 网络链接 http://www.iciba.com/ 后面加上 当前在没有搜索到的单词 //点击后 直接在线搜索 http://www.iciba.com/单词 System.Diagnostics.Process.Start("explorer.exe", "http://www.iciba.com/" + txtInput.Text.Trim()); }
//定义一个初始化正在搜索时间为0 public int TimeLength = 0;
public Timer timer; /// <summary> /// 初始化计时器 /// </summary> public void InitializeTimer() { timer = new Timer(); timer.Interval = 1000; //间隔为1秒 timer.Tick += (s, e) => { ShowOnlineSearch(); }; }
/// <summary> /// 判断正在搜索的时间 如果超过5秒则启动在线搜索 /// </summary> public void ShowOnlineSearch() { TimeLength++; //当时间到5秒的时候 if (TimeLength >= 5) { //将txtResult文本框的 内容清空 txtResult.Text = ""; //在线翻译网站链接显示出来 linkWebSearch.Visible = true; //显示LinkLabel的文本内容 linkWebSearch.Text = "没找到? 试下在爱词霸在线翻译里查找:" + "\r\n" + txtInput.Text.Trim() + " :)"; //计时器停止计时 timer.Stop(); TimeLength = 0; //lblTimer.Text = TimeLength.ToString(); } else { //否则 网站链接不显示 linkWebSearch.Visible = false; //lblTimer.Text = TimeLength.ToString(); } } }
|
新增效果测试:
当输入一个不完整的单词 textbox会自动提供相应的下拉列表来 匹配你的输入
当输入某些 特殊词汇 查找不到的时候
点击链接 直接跳转到 ICIBA.com 翻译页面
这样一个英汉词典就完成了 ~~~~ :)
附上源代码 英汉词典.zip
转自:https://www.cnblogs.com/longwu/archive/2011/11/16/2251009.html