65.9K
CodeProject 正在变化。 阅读更多。
Home

RichEdit 控件中的自动完成功能

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.96/5 (19投票s)

2002年7月11日

公共领域

3分钟阅读

viewsIcon

204011

downloadIcon

6733

一种控件,允许在 RichEdit 控件中使用自动完成功能,就像 Visual Studio 中的一样。

Sample Image - AutocomplectionCtrl.gif

CAutocomplectionCtrl 是一个用于在 CRichEditCtrl 中添加自动补全功能的控件。您可以轻松修改代码,在 CRichEditView 中添加自动补全功能。

您可以指定选项,例如显示所有已知单词或仅显示匹配的单词。

用户可以通过按 Ctrl+空格键启动自动补全功能;可以通过按空格键、回车键或非字母字符来确认选择的单词;可以使用上、下、PgUp、PgDown、Home、End、Ctrl+空格或鼠标滚轮在列表中切换单词;可以使用左、右箭头修改单词的匹配部分。

使用控件

使用 ClassWizard 在您的对话框类中添加一个变量;变量必须是一个 CAutocomplectionCtrl 控件;如果 ClassWizard 仅显示 CRichEdit,请选择它,并在 .h 文件中将其更改为 CAutocomplectionCtrl

请记住在您的 .h 文件中包含 "Autocomplection.h" 并插入以下行

AfxInitRichEdit();

在您的应用程序的 Initinstance() 函数中。

然后您必须使用 AddKeyword() 函数定义您的词典;通常您会在 OnInitDialog 函数中执行此操作。在示例应用程序中,我从文件中读取单词,因此生成的代码是

while (file.ReadString(keyword))
	m_edit.AddKeyword(keyword);

好吧,您的工作完成了 :)

如果您愿意,您可以指定一些选项...

选项函数

void Enable(BOOL);

您可以启用或禁用自动补全功能;默认情况下,它是启用的。

void ShowListBox(BOOL);

您可以选择是否显示列表框

void ListAllWords(BOOL);

您可以选择是否在列表框中显示所有已知单词,或仅显示匹配的单词

void TrapEnter(BOOL);

按回车键,将确认所选单词。

如果将 TrapEnter 设置为 FALSE,则按回车键时,控件将添加一个换行符,如果将 TrapEnter 设置为 TRUE,则不会显示换行符

void CaseSensitive(BOOL);

您可以选择匹配功能是否区分大小写。

void AutoLearn(BOOL);

该功能不是很有用;如果启用,当用户键入未知单词时,控件会将其添加到词典中;如果用户从不错过键入单词,这可能很好...

void LearnOnDblClick(BOOL);

如果启用此功能,当用户双击一个单词时,控件会学习它。

词典函数

void GetDictionary(CStringArray& dictionary);

此函数使用所有已知单词填充给定的 CStringArray


void ResetDictionary();

此函数清空词典。


BOOL AddKeyword(const CString& str);

此函数在词典中添加指定的单词。


BOOL IsKeyword(const CString& str);


此函数检查指定的单词是否在词典中。

开发笔记

代码在警告级别 4 下干净地编译。

搜索

我选择按字母顺序插入单词,并使用二分查找来查找它们,因此搜索函数是 O(log(n))。

大小写敏感

单词匹配可以区分大小写或不区分大小写。我决定使用函数指针而不是随时检查或复制代码...

单词识别

单词识别是通过查找最近的“空格”字符来完成的。您可以轻松地更改您的单词识别,修改以下行

while (from && buffer[from]!=' ')
使用这样的行
while (from && buffer[from]!=' ' && buffer[from]!='(' && buffer[from]!='=')

进一步改进(又名 TODO)

学习功能可以改进;无论如何,应用上下文表明不同的改进方式:例如,您可能只想学习经常键入的单词,或者只学习 # 个最近的单词,或者...

您可能希望在单词附近显示一个图标(是的,就像 Visual Studio 一样)... 所以您应该用一个数组类和一个包含字符串和指定图标 ID 的类来替换 CArrayString

有时(当有很多匹配的单词时),填充 CListBox 速度很慢。用更快的替换 CListBox 可能会很有用(也许是一个所有者数据列表框...)

历史

2002 年 7 月 12 日 - 首次公开发布

© . All rights reserved.