RichEdit 控件中的自动完成功能






4.96/5 (19投票s)
一种控件,
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 日 - 首次公开发布