0%

用C# Winform写个英汉词典

简介

平日里我们学习,生活中可能都要用到各种词典,许多人可能觉得 词典是个多么神奇的东西.

其实 一本简单的词典软件要写出来很简单, 当然 功能强大 智能的词典软件 就另当别论了.

那么,我们今天就来写一款 英汉词典翻译软件 吧 :)

原理

这里 主要用到了 一个泛型字典 Dictionary<string, string> 通过他的键key作为词典搜索的英文单词 来找到其相对应的值Value(中文意思)

查找方式是 通过输入文本框的 TextChanged 事件 进行自动搜索 泛型字典里对应的中文意思(Value值)

当然 不可能每个单词 我这里都能搜索到 为此,在本地没有搜索到的情况下

这里新增了一个在线搜索功能 (当然是默认为 5秒时间内 文本框没有输入内容的时候[默认为已经确认为要查找的单词]

才触发的-这里用了timer的tick计时事件)

使用 LinkLabel 的功能 将在线翻译网站 ICIBA.com(爱词霸的链接显示出来) 当然链接附加了 当前未搜索到的单词

只需要点击该链接 就能直接获取到 爱词霸网站 该单词的中文翻译了 :)

此外, 经过学友@June的推荐 参考了下June的学习笔记以及阿东东先生的博文-C#WinformTextbox猜想输入

在这里添加了一个 输入单词 智能提示的功能(输入某个不完整的单词 获取相应的智能提示列表) 如下图

img

首先让我们开始做 界面设计

img

在程序里 我们需要调用 英汉词典.txt 文本文件, 我们可以直接拷贝 粘贴该文件到 项目下面

但如果 直接粘贴 该文本文件到项目下的话 我们需要调用其绝对路径 比如

D:\study\博客园cnblog\博客日志\英汉词典\英汉词典\英汉字典\英汉词典.txt

这样有个缺点, 一旦 D:...\英汉字典\ 下的 英汉词典.txt 被转移了 我们项目程序 就无法找到该文本文件了, 同理 如果你将你的该项目程序打包 发给你的朋友

在他电脑上也无法找到 文本文件 因为该文本仅存在于 你电脑的 D:...\英汉字典\ 目录下

所以 我们需要 将其绝对路径 设置为相对路径

这里介绍一个 调用相对路径的办法 请看 Visual Studio 项目下 设置文件路径为 相对路径

文本词典内容

img

英汉词典.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会自动提供相应的下拉列表来 匹配你的输入

img

img

img

img

当输入某些 特殊词汇 查找不到的时候

img

img

点击链接 直接跳转到 ICIBA.com 翻译页面

img

这样一个英汉词典就完成了 ~~~~ :)

附上源代码 英汉词典.zip

转自:https://www.cnblogs.com/longwu/archive/2011/11/16/2251009.html