已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
桂林电子科技大学综合设计说明书用纸 数据结构与算法 课程设计说明书 题 目: 单词拼写检查器 学 院: 计算机科学与工程 专 业: 信息安全 姓 名: 李培聪 学 号: 1000360218 指导教师: 张瑞霞 2012 年 0 9 月 08 日 桂林电子科技大学综合设计说明书用纸 目 录 引言 .1 1、系统概述 2 2、需求分析 2 3、详细设计 4 4、系统特色及关键技术 9 5、结论 8 参考文献 13 桂林电子科技大学综合设计说明书用纸 第 0 页 引言引言 开发背景 NotePad(记事本)是一个简单实用的文本编辑软件,它通过对 TXT 格式文件的操 作来实现文本的创建和编辑。Windows 操作系统为我们提供了一个功能完整的记事本程 序,具有新建,打开,保存等系统功能与复制,粘贴,剪切,撤销,查找等基本编辑功 能。然而,随着用户不断增强的对软件易用性的要求,需要记事本具有更友好的操作和 功能。对于经常输入英文的用户,就迫切希望拥有一款可以对单词进行拼写检查和英文 自动提示输入功能的记事本。于是,这样一款带有“英文助手”功能的增强型记事本程 序应运而生。 设计目标 参照 Windows 记事本程序的相关设计,模仿着进行一款增强版的记事本程序。对原 有的记事本功能进行改进,增加“拼写检查”与“英文自动提示输入”功能。具体目标 如下: (1)必须是图形界面,且与 windows 记事本保持相同界面风格。 (2)需要支持常规文档编辑 (3)具有英文单词的拼写检查能力。 (4)具有自动提示输入功能(仅限于英语单词) 。 (5)实现某种数据结构,用于高效地访问字典中的单词。 运行演示 图 1-1 运行演 示 桂林电子科技大学综合设计说明书用纸 第 1 页 “拼写检查器拼写检查器”一个增强的记事本软件一个增强的记事本软件 一、系统概述 带“英文助手”的增强版的记事本程序,是对原有的记事本功能进行改进,增加 “拼写检查”与“英文自动提示输入”功能。原有的记事本程序仅实现基本的文字编辑 功能,不够人性化。新系统将大大降低英文用户操作的复杂性,实现更多的功能,拼写 检查功能极大地提高了英语文章通篇单词的准确性,自动提示功能极大地方便了用户的 英文输入。 “拼写检查”与“英文自动提示输入”功能作为记事本模块的子模块进行调 用。当用户需要使用英文助手的时候,可以手动启用。这样既方便了英文输入用户的快 捷输入,又不会对普通用户产生干扰。 软件采用高效的检索算法,使“拼写检查”与“英文自动提示输入”效率奇高,用 户在使用时基本感受不出检索的时间代价。清爽的用户界面极大地提高了舒适性,令文 本编辑用户倍感轻松。 二、需求分析 2.1 系统分析 2.1.1 任务 创建用户界面的记事本程序,风格模仿 windows 记事本。主窗口进行文本文档的 编辑,并且含有一组菜单。“拼写检查”与“英文自动提示输入”分别作为两个对话 框进行子模块功能调用。需要附带一个强大的英文词典,以确保拼写检查的准确性。 同时,要设计一种高效的数据结构来存放体积巨大的英文字典库,以确保单词检索的 效率。 2.1.2 原则 系统性系统性:程序是作为统一整体存在的,因此,系统设计中界面风格要一致,操作方 法一致,系统的代码要统一。 可靠性可靠性:系统稳定性好,运行正确,对非法操作进行提示与控制。 高效性高效性:保证时间复杂性尽可能小。 2.1.3 系统功能描述 新系统作为 NotePad (记事本)的增强版,首先就必须拥有记事本的基础功能 记事本功能模块。 对于记事本功能记事本功能,有必要和原版记事本保持高度一致,具有如下功能: (1)TXT 文档的打开与保存。 桂林电子科技大学综合设计说明书用纸 第 2 页 (2)粘贴板的操作“剪切”、“复制”、“粘贴”、“删除”。 (3)查找和替换。 (4)设置字体与自动换行 “拼写检查拼写检查”功能功能作为子模块,以对话框的形式进行调用,具有如下功能: (1)启动拼写检查时直接进行第一次检查。 (2)拼写检查对话框显现时,仍可以对文本文档进行编辑。 (3)在不关闭对话框的情况下可以对编辑后的文本进行“重新检查” 。 (4)双击错误单词列表中的某个错误单词项目后,可以在文本编辑界面中自动 定 位到选中的错误单词,并高亮显示。 “英文自动提示输入英文自动提示输入”功能功能也以对话框的形式进行实现,具有如下功能: (1)输入单词的前缀部分,自动联想所有对应的后半部分,并显示在单词候选 框里面。 (2)双击候选框中单词自动将此单词插入到文本编辑界面的光标所在位置。 2.2 原理分析与数据需求 因为计算机并不具备判断“哪些单词正确,哪些单词错误”的能力,所以无法直 接通过某些语句或函数调用来实现“拼写检查”与“英文自动提示输入”功能。假设 计算机能够拥有地道的英国人的那种英文水平,那么我想也不需要有本程序的存在了。 如何让计算机去判断一个单词的拼写正确性,这正是本程序要解决的核心问题所 在。以目前 IT 科技发展的现状来看,现在我们只能通过“把输入的单词与单词库每 一个单词进行比较”这种方式来证明“这个单词是拼写正确的单词” 。正因此,为确 保准确性,我们需要一个强大的英文单词库资源的支持。为确保高效性,我们还需要 一个合适的数据结构来存放单词库的数据以配合快速的检索算法。 考虑到方便后期对字典进行维护,我选择了以 TXT 文本格式保存字典数据,并把 这个 TXT 文档作为项目的自定义资源封装到生成的 EXE 文件中。这样,程序就等于自 带了一个“字典库” 。这个“字典库”里存放了 11 万个英文单词,足以应对平时正常 书写所包含的单词。 当我们进行“把输入的单词与单词库每一个单词进行比较”这种操作。将带来字 符串的大量搜索操作。于是需要我们从数据结构的选择和算法的设计上下功夫确保检 索效率。在这里我选用 Trie 树来存储英文词典。Trie 树俗称字典树、单词查找树, 是应对单词检索操作的最优秀数据结构。具体的数据结构与算法说明将在详细设计里 给予详解。 2.3 开发环境 Microsoft Visual Studio 2008 SP1 With MFC 桂林电子科技大学综合设计说明书用纸 第 3 页 三、详细设计 本程序的设计严格遵循如下开发流程: 注:“分析系统需求”以及“收集资源”已经在之前给出,其中收集的字典资源 dict.txt 存放在 NotePad 工程的 res 目录中。 分析 系统 需求 收集 资源 设计 数据 结构 设计 系统 界面 编辑 代码 运行 并测 试 图 3-1 开发流程图 桂林电子科技大学综合设计说明书用纸 第 4 页 3.1 数据结构 根据本程序的需求,对于大量的英文单词字符串的检索操作,我们需要使用 Trie 树 这种数据结构。 Trie 树,又称字典树、单词查找树、前缀树,是一种树形结构,是一种哈希树的变 种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串) ,所以经常被搜索引 擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率 比哈希表高。 Trie 树利用字符串的公共前缀来节约存储空间,是一种用于快速检索的多叉树结构。 其基本性质可以归纳为: (1)根节点不包含字符,除根节点意外每个节点只包含一个字符。 (2)从根节点到某一个节点,路径上经过的字符连接起来,为该节点对应的字符串。 (3)每个节点的所有子节点包含的字符串不相同。 下图 3-1 是一个 Trie 结构的示意图: 由于本工程采用 MFC 创建,故采用类的形式定义抽象数据类型 ADT: 在这个 Trie 结构中,保存了 A、to、tea、ted、ten、i、in、i nn 这 8 个字符串。每个结点的值 与路径值相同,方便了前缀查询。 图 3-1-1 Trie 树结构 桂林电子科技大学综合设计说明书用纸 第 5 页 class CTrieTree private: struct CTrieTree_node /Trie树节点结构体作为Trie树类的内部成员 char* data; /data将用来存放这个结点所对应的字符串 CTrieTree_node* branch26; /子树26个分别对应26个英文字母 CTrieTree_node(); * root; public: CTrieTree():root(NULL); /Trie树类的构造函数 CTrieTree(CTrieTree int insert(char* word, char* entry); /向Trie树里添加单词的方法 int search( char* word, char* entry ); /在Trie树里查找单词是否存在的方法 int query( char* word, CListBox /向CListBox动态添加单词的查询方法 int traversal(CTrieTree_node *head, CListBox /用于query函数的节点遍历递归函数 ; 这是本程序实现的 Tire 树类,其中有三个基础的重要操作,我们对它们进行彻底分析: 1 1、插入单词方法(插入单词方法(CTrieTree:insertCTrieTree:insert) int CTrieTree:insert( char* word, char* entry) int result = 1, position = 0; char char_code;/用来存放子树索引号 if ( root = NULL ) root = new CTrieTree_node; CTrieTree_node *location = root; while( location!=NULL location = location-branchchar_code;/创建子节点后将指针指向子节点 position+; word+; if (location-data != NULL) result = 0;/假如此单词存在,则不修改data数据 else location-data = new charstrlen(entry)+1; wsprintf(location-data,“%s“,entry);/为关键字赋值 return result; 插入单词方法插入单词方法 算法分析:对于一个已经实例化的字典树对象,经过构造函数的初始 桂林电子科技大学综合设计说明书用纸 第 6 页 化(构造函数将各内部成员赋初值 NULL)后,就成了一个初始的空的字典树 (root=NULL) 。插入操作执行时,先检查是否字典树为空 if(root=NULL),若为空,则 先创建一个根结点 root = new CTrieTree_node,不为空则继续执行插入操作。插入的原 理是从字符串的第一个字符开始读取,层层创建子节点。读取到一个字符后,首先要进 行索引号转换,原理是将*word-“A/a“并存放在 char_code 中,这样,字母 a-z 就分别对 应了 0-25 这样的索引号,然后进行创建子节点的操作 location-branchchar_code = new CTrieTree_nod。之后,开始读取剩下的字符进行循环、当子树建立完毕后, location 将指向这个单词最终结点,这时,就可以为 data 赋值 location-data = entry,此时,插入操作完成。 实际上 CTrieTree:insert 这个方法,可以通过不同于参数 word 的参数 enrry 为每 个结点的 data 赋值任何形式的关键字,但是因为我们需要进行根据前缀的搜索,因此, 在实际使用中我们将每个结点的 data 设置为当前单词以方便快速查找,即:使用相同的 word 参数和 entry 参数。这个在程序进行加载字典的时候调用此方法时有所体现。 2 2、查找单词方法(查找单词方法(CTrieTree:searchCTrieTree:search) int CTrieTree:search( char* word, char* entry ) int position = 0; char char_code;/用来存放子树索引号 CTrieTree_node *location = root; /从根节点开始 while( location!=NULL position+; word+; if ( location != NULL return 1; else return 0; 查找单词方法查找单词方法 算法分析:查找的原理是从传入的字符串中字符串的第一个字符开始 读取,并从根节点 root 开始查找,按照 location = location-branchchar_code规则 循环将 location 指针指向最后一个符合拼写规范的结点,这个结点可能是正确拼写的单 词所在结点,也可能是字符串读取完之后指向的结点。当 location 指针完成最后的指向 后,进行 if(location!=NULL char char_code; /用来存放子树索引号 CTrieTree_node *location = root; /从根节点开始 while( location!=NULL position+; word+; traversal(location,lst); /递归地在单词树里查找所有匹配的单词并添加到ListBox里 return 1; int CTrieTree:traversal(CTrieTree_node *head, CListBox if(location=NULL)return 0; lst.AddString(location-data); /向ListBox里添加查找到的单词 for(int i =0;ibranchi,lst); /递归所有子树 return 1; 桂林电子科技大学综合设计说明书用纸 第 8 页 用前缀搜索单词的方法用前缀搜索单词的方法 算法分析:给定一个单词前缀,通过参数将字符串传递给方 法的后,从中字符串的第一个字符开始读取,并从根节点 root 开始查找,按照 location = location-branchchar_code规则循环将 location 指针指向最后一个符合拼写规范 的结点,这个结点可能是正确拼写的单词所在结点,也可能是字符串读取完之后指向的 结点。这点和 search 方法类似,只是,前缀搜索算法定位到最后一个字母结点后,不判 断这个字符串是否是正确的单词,而是遍历 location 指针最后指向的那个字母结点以下 所有的子结点,查找存在的 data 值(拼写正确的单词) ,并将所有 data 值添加到指定的 listbox 控件里。traversal 方法就是遍历指定结点所有子节点的方法,traversal 采用 递归策略,for(int i=0;ibranchi,lst)语句 就是递归便利的核心算法,递归的返回语句为 if(location=NULL)return 0。当结点存 在,则使用 lst.AddString(location-data)语句,把 data 值添加到 listbox 里。细心 的读者可能会问“你这个算法不健壮,lst.AddString 这条语句之前为什么不加个判断 data 是否为空的 if(location-data!=NULL)?” 。这是因为 ClistBox 对象的 AddString 算法本身就已经自带了判断为空的能力,增加额外的一条 if 无疑降低了算法 的效率,特别是当子节点特别的多的时候,递归深度会相当高。正是基于此目的,我才 没有增加判断。 至此,数据结构的设与分析完成,接下来我们开始进行界面与代码的设计。 桂林电子科技大学综合设计说明书用纸 第 9 页 3.2 窗体与代码设计 首先我们使用 VS2008 新建一个项目 Notepad,选择“MFC 应用程序” ,在打开的 “MFC 应用程序向导”中按依次显示的页面进行如下选择(其它界面无需更改,直接下一 步): 应用程序类型应用程序类型 :选择“单文档” 用户界面功能:用户界面功能:将“状态栏”取消并将“工具栏”更改为“无” 生成的类:生成的类:选择“CNotepadView”之后,将基类改为“CEditView” 然后点完成。恭喜你,你现在已经生成了一个完美的记事本程序了。编译执行后,你将 得到和下图一样的记事本程序: 其实,需要生成一个支持 TXT 格式的记事本并不难,对于习惯 SDK 写界面、没用过 MFC 的读者来说,以上就是一次“出神入化”的实践。对于一些习惯编写控制台应用程 序的同学,这次实践更会颠覆价值观:一个图形界面记事本竟然点了几下两分钟就做出 来了。这个自动生成的记事本拥有丰富功能,它包含了记事本最基础的功能。 “打开” 、 “保存”等操作均已自动实现,我们接下来需要做的就是增加“拼写检查”与“英文自 动提示输入”功能。 考虑到功能丰富的界面说明并非本说明书的核心价值所在,故在接下来的内容中,只 对核心的“拼写检查”与“英文自动提示输入”对话框进行详解,对于实际项目中的 “关于” 、 “帮助”等对话框的实现就不再赘述。还有对于实际项目中的“设置字体” 、 “自动换行”等功能就不在报告里详解,有兴趣的读者可以自行翻阅 NotePad 项目中的相 关源文件进行学习。 MFC 应用程序无非就是“拖拖控件,改改属性,写写响应” ,根据这条神律,在接下 来的“拼写检查”与“英文自动提示输入”对话框添加中,我将这种思想的应用发挥到 了极致。读者亦可以充分体会这种思想所带来的便捷性。 图 3-2-1 MFC 生成的记事本 桂林电子科技大学综合设计说明书用纸 第 10 页 添加对话框添加对话框 我们通过编辑 Notepad.rc 资源文件为主窗口添加对话框,在 dialog 项目上点右键选择 插入对话框,于是,一个新对话框就自动生成了。通过属性页可以为对话框修改 ID,这 个 ID 标明了资源的索引号,很重要。在这项目中我们至少需要生成两个对话框,分别实 现“拼写检查”与“英文自动提示输入”。在 notepad 项目中这两个对话框被我分别命 名 ID 为 IDD_SPELL_CHECK 和 IDD_AUTO_COMPLETE。然后分别对这两个对话框添加类,分 别定义类名为 SpellCheckDlg 和 AutoCompleteDlg,这两个类都是派生自 CDialog,意 为对话框。添加对话框类的具体方法是对着每个对话框点右键,选择“添加类”,输入 类名,就会自动生成了。添加类之后,会自动生成以类名为名称的一组头文件源文件。 为对话框添加控件为对话框添加控件 分别打开 Notepad.rc 中的两个对话框,为这两个对话框添加控件: IDD_SPELL_CHECK 需要增加一个 listbox 列表框,用来存放检测到的错误单词列表。添 加完成后就需要对着这个 listbox 列表框添加一个对象,方法是对着这个 listbox 点右 键,选择“添加变量”,输入变量名之后(Notepad 项目里设置为 m_mistake),IDE 就 会自动在 SpellCheckDlg.h 中的 SpellCheckDlg 类的成员中加入一个 CListBox 型的 m_mistake 成员。 同理,为 IDD_AUTO_COMPLETE 添加控件,这里需要一个 listbox 和一个 editbox,editbox 控件用来输入单词的前缀,listbox 用来输出搜索到的单词。之后为 这两个控件添加对象,分别命名为 m_AutoList 和 m_AutoEdit 作为 AutoCompleteDlg 类 的内部成员。 添加菜单添加菜单 添加的两个对话框需要通过点击菜单进行调用,因此我们需要增加两项菜单: 我们通过编辑 Notepad.rc 资源文件来编辑主窗口的菜单,打开 Menu 里的 IDR_MAINFRAME。添加菜单“英文助手” ,再添加两条子菜单“拼写检查” 、 “智能输入” 分别命名 ID 为 ID_SPELL_DLG、ID_AUTO_DLG。 现在,所有的界面设计均已完成,以下是本 notepad 项目的设计: 桂林电子科技大学综合设计说明书用纸 第 11 页 接下来,我们要进行事件响应的编写。接下来,我们要进行事件响应的编写。 首先我们需要对主菜单进行事件响应的编写,以实现按下菜单选项,打开某项对话框的 目的。为达到此目的,我们需要对 MainFrm.h 和 MainFrm.cpp 进行编辑。 1、在 MainFrm.h 声明事件响应方法。 class CMainFrame : public CFrameWnd / 其它操作 protected: afx_msg void OnSpellCheckDlg(); / 响应“拼写检查”菜单按下 afx_msg void OnAutoCompleteDlg(); / 响应“智能输入”菜单按下 DECLARE_MESSAGE_MAP() / 消息映射 ; 2、在 MainFrm.cpp 实现消息映射与事件响应方法。 / 映射消息的函数 IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd) BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) . / OnSpellCheckDlg方法生成“拼写检查”对话框 ON_COMMAND(ID_SPELL_DLG, OnSpellCheckDlg) / 菜单ID_SPELL_DLG按下 / OnAutoCompleteDlg方法生成“英文智能提示输入”对话框 ON_COMMAND(ID_AUTO_DLG, OnAutoCompleteDlg) / 菜单ID_AUTO_DLG按下 END_MESSAGE_MAP() void CMainFrame:OnSpellCheckDlg() / 生成“拼写检查”对话框 图 3-2-2 拼写检查、智能输入对话框 桂林电子科技大学综合设计说明书用纸 第 12 页 SpellCheckDlg *dlg = new SpellCheckDlg ; /创建非模态的“英文智能提示输入”对话框实例 dlg-Create(IDD_SPELL_CHECK ); dlg-ShowWindow(SW_SHOW); void CMainFrame:OnAutoCompleteDlg() / 生成“英文智能提示输入”对话框 AutoCompleteDlg *dlg = new AutoCompleteDlg ; /创建非模态的“英文智能提示输入”对话框实例 dlg-Create(IDD_AUTO_COMPLETE); dlg-ShowWindow(SW_SHOW); 注:在对话框的生成中使用了 dialog-Create()方法而未使用更简单的 dialog-DoModal() 方法是因为 dialog-DoModal()方法会锁定父窗口,我们需要的是不锁定,故使用了稍微 复杂的 dialog-Create()方法。 进行这两项操作之后,菜单响应就编写完毕,现在当按下菜单按钮,就可以实现对话框 的生成了。 然后我们通过对文档类 CDocument 进行改写,来实现字典库 dict.txt 的加载: 1、在 NotepadDoc.h 中为 CNotepadDoc 类增加字典树成员和加载字典方法 class CNotepadDoc : public CDocument private: CTrieTree m_AlphabetTree;/创建字典树m_AlphabetTree public: CTrieTree /获取字典树指针的方法 CHandleResm_handleRes;/创建资源句柄 void LoadDictionary(void);/加载字典的方法 ; 2、在 NotepadDoc.cpp 中为给出加载字典方法的具体实现 CNotepadDoc:CNotepadDoc() LoadDictionary();/ 构造文档的时候加载字典 CTrieTree /返回字典树 void CNotepadDoc:LoadDictionary(void) /加载字典的方法 HINSTANCE hInst = AfxGetResourceHandle(); /查找资源句柄 HRSRC hRes = FindResource(hInst,MAKEINTRESOURCE(IDR_TEXT1),_T(“TEXT“);/查找dict.txt资源句柄 HGLOBAL hResData = LoadResource(hInst,hRes); /获得资源数据的句柄 桂林电子科技大学综合设计说明书用纸 第 13 页 char *position=(char*)LockResource(hResData); /临时字符串定位变量 char *pword=position;/字符串变量,记录了每一行的单词信息 while(*position!=0 m_AlphabetTree.insert(pword,pword);/将单词插入到字典中 pword=position+2; position+; FreeResource(hResData); / 释放资源 包含 11 万个单词的资源名为 dict.txt。在本项目里,我把 dict.txt 作为一个自定义资源包含 在了 EXE 文件中,这样每次运行程序时会自动对其进行读取,并添加至字典树数据结构 里。FindResource(hInst,MAKEINTRESOURCE(IDR_TEXT1),_T(“TEXT“)这条语句解释了 如何加载自定义资源。读取到的单词将插入到 CNotepadDoc 类中字典树成员 m_AlphabetTree 里,在插入单词到字典树中的时候,我将单词作为关键字插入到了字典 树里。即 m_AlphabetTree.insert(pword,pword)的后面两个参数相同,这样做的目的是为了 方便之后的前缀搜索。在之前的数据结构分析中已经说明。LoadDictionary()方法执行完 毕后,字典库就被完整的加入到了字典树里面了。 接下来我们将进行这个项目中最为关键的设计“拼写检查”与“英文自动提示输入” 对话框的事件响应。这两个对话框的响应决定了这个项目的最直观的功能感受。也是本 程序最精彩的功能体现。 我们先处理“拼写检查”对话框的事件响应。 1、在 SpellCheckDlg.h 中声明各个事件响应方法 class SpellCheckDlg : public CDialog . protected: virtual BOOL OnInitDialog(); /对话框初始化操作 DECLARE_MESSAGE_MAP() public: CListBox m_mistake; /“拼写检查”对话框中的列表框对象实例 long m_list_index1000; long m_list_len1000; /定义错误单词位置数组序列 void SpellCheck(); /拼写检查方法的定义 afx_msg void OnBnClickedOk(); /“拼写检查”对话框中“重新检查”的响应 桂林电子科技大学综合设计说明书用纸 第 14 页 afx_msg void OnLbnSelchangeListMistake(); /“拼写检查”对话框中单击ListBox项目、定位错误单词的响应 ; 2、在 SpellCheckDlg.cpp 中实现各个事件响应 BOOL SpellCheckDlg:OnInitDialog() / 初始化对话框 CDialog:OnInitDialog(); SpellCheck(); /初始化对话框时进行第一次拼写检查 return TRUE; void SpellCheckDlg:SpellCheck() /进行拼写检查的关键性代码 CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()-m_pMainWnd; /获取Frame指针以便找到CEdit CMDIChildWnd *pChild = (CMDIChildWnd *) pFrame-GetActiveFrame(); CEditView *pView =(CEditView *)pChild-GetActiveView(); CNotepadDoc * pDC =(CNotepadDoc *) pView-GetDocument();/获取CNotepadDoc指针 CEdit /获取CEdit指针 CString tempStr, tempWord,tempRecord, temp; /存放要查找的字符串和用来格式化tempRecord的临时字符串 char entry100; long indexEnd = 0; int m_list_num=1; /用来记录错误单词号 for (int i = 0; i = a /高亮显示最后一个错误单词 /格式化字符串,为错误单词添加提示信息 temp.Format(“第 %d 行的单词“%s ”拼写错误“,i+1,(LPSTR)(LPCTSTR)tempWord); m_mistake.AddString(temp);/添加错误单词到listbox m_list_indexm_list_num=indexEnd;/将错误单词的位置信息记录到数组 桂林电子科技大学综合设计说明书用纸 第 15 页 m_list_lenm_list_num=tempWord.GetLength(); m_list_num+; tempWord.Delete(0, tempWord.GetLength(); tempRecord.Delete(0, tempRecord.GetLength(); indexEnd+; if (tempWord.GetLength() if (!pDC-GetAlphabetTree().search(LPSTR)(LPCTSTR)tempWord,entry) /检测最后一项 edit.SetSel(indexEnd-tempWord.GetLength(),indexEnd);/定位并高亮显示最后一个错误单词 /格式化字符串,为错误单词添加提示信息 temp.Format(“第 %d 行的单词“%s ”拼写错误“,i+1,(LPSTR)(LPCTSTR)tempWord); m_mistake.AddString(temp);/添加错误单词到listbox m_list_indexm_list_num=indexEnd;/将错误单词的位置信息记录到数组 m_list_lenm_list_num=tempWord.GetLength(); m_list_num+; tempWord.Empty(); tempRecord.Empty(); tempStr.Empty(); void SpellCheckDlg:OnBnClickedOk()/“拼写检查”对话框中“重新检查”的响应 m_mistake.ResetContent();/清空ListBox之前检查到的内容 SpellCheck();/再次进行拼写检查 void SpellCheckDlg:OnLbnSelchangeListMistake()/“拼写检查”对话框中单击ListBox项目、定位错误单词的响应 CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()-m_pMainWnd; /获取Frame指针以便找到CEdit CMDIChildWnd *pChild = (CMDIChildWnd *) pFrame-GetActiveFrame(); CEditView *pView =(CEditView *)pChild-GetActiveView(); CEdit /获取CEdit指针 edit.SetSel(m_list_indexm_mistake.GetCurSel()+1- m_list_lenm_mistake.GetCurSel()+1,m_list_indexm_mistake.GetCurSel()+1); /定位选中的错误单词并高亮显示 当对话框生成的时候,对话框就通过 SpellCheckDlg:OnInitDialog()事件调用 SpellCheck()开始进行一次拼写检查,当“重新检查”按钮被激活即 SpellCheckDlg:OnBnClickedOk()事件响应时,将清空之前的检查情况再次进行拼写检查。 桂林电子科技大学综合设计说明书用纸 第 16 页 拼写检查的原理是:首先通过一系列的操作获取 CEdit /初始化函数 DECLARE_MESSAGE_MAP()/消息映射 public: /“英文智能提示输入”对话框中按钮、编辑框、列表框对象实例 CButton m_AutoInput; CEdit m_AutoEdit; CListBox m_AutoList; afx_msg void OnEnChangeEditAuto();/单词输入框单词发生变化时的响应 afx_msg void OnBnClickedOk();/“输入按钮”的响应 afx_msg void OnLbnSelchangeList1();/ listbox框中项目的单击响应 afx_msg void OnLbnDblclkList1();/listbox框中项目的双击响应 void InsertAutoCompleteWord();/向文本文档编辑区域插入单词的具体实现 BOOL m_Select_Change;/m_Select_Change 的作用是防止ListBox选中项目时重新进行单词搜索 ; 2、在 MainFrm.cpp 实现消息映射与事件响应方法。 BOOL AutoCompleteDlg:OnInitDialog() /对话框初始化 CDialog:OnInitDialog(); 桂林电子科技大学综合设计说明书用纸 第 17 页 m_Select_Change=false;/m_Select_Change 的作用是防止ListBox选中项目时重新进行单词搜索 return TRUE; void AutoCompleteDlg:OnBnClickedOk()/“英文智能提示输入”对话框中“输入按钮”的响应 InsertAutoCompleteWord();/ “输入”按钮按下时将单词添加至文本文档编辑页面 void AutoCompleteDlg:OnEnChangeEditAuto() /“英文智能提示输入”对话框中单词输入框单词发生变化时的具体响应 if(m_Select_Change=false)/为listbox添加项目,动态从字典中获取内容 m_AutoList.ResetContent();/清空listbox CString str; m_AutoEdit.GetWindowText(str);/获取输入框的内容 CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()-m_pMainWnd; /获取Frame指针以便找到 CEdit CMDIChildWnd *pChild = (CMDIChildWnd *) pFrame-GetActiveFrame(); CEditView *pView =(CEditView *)pChild-GetActiveView(); CNotepadDoc * pDC =(CNotepadDoc *) pView-GetDocument();/获取CNotepadDoc指针 /输入两个字母以上开始进行智能联想,将单词添加至 if(str.GetLength()=2 )pDC-GetAlphabetTree().query(LPSTR)(LPCTSTR)str,m_AutoList); m_Select_Change=false; /m_Select_Change 的作用是防止ListBox选中项目时重新进行单词搜索 void AutoCompleteDlg:OnLbnSelchangeList1()/ listbox框中项目的单击响应 / listbox选取发生变化时,将编辑框的文字替换为所选 m_Select_Change=true; CString str; if(m_AutoList.GetCurSel()=0) m_AutoList.GetText(m_AutoList.GetCurSel(),str);/获取listbox选中项目 m_AutoEdit.SetWindowText(str);/设置编辑框的文字 void AutoCompleteDlg:OnLbnDblclkList1()/listbox框中项目的双击响应 InsertAutoCompleteWord();/双击listbox时激活输入操作 void AutoCompleteD
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年药品保存制度试题及答案
- 中国保险市场竞争格局与前景
- 基金项目经理招聘题库及答案
- 互联网架构师秋招面试题及答案
- 公务员面试流言面试题及答案
- 海尔集团秋招笔试题及答案
- 公务员面试秸秆面试题及答案
- 公务员考试省考言语试题及答案
- 2025年文化和旅游部直属事业单位招聘21人参考题库带答案详解(完整版)
- 2026年广东水利电力职业技术学院单招职业技能测试必刷测试卷汇编
- 甘肃开放大学2025年《地域文化(本)》形成性考核1-3终考答案
- 中国五矿秋招面试题及答案
- 2025年(完整)汉字听写大会竞赛试题库(附答案)
- 2025年潜江市事业单位人才引进55人考试笔试参考题库附答案解析
- 水电系统安装施工方案
- 荒山承包合同补充协议
- 建筑装饰工程项目总结及经验分享
- 2025年医学检验副高职称答辩题库及答案
- 2025“才聚齐鲁成就未来”山东文旅云智能科技有限公司招聘2人笔试历年典型考点题库附带答案详解3套试卷
- 2025-2030民办中小学师资队伍建设研究及管理优化与发展策略报告
- 村干部考公务员试题及答案
评论
0/150
提交评论