<!-- Download Links -->
<!-- Article image -->
<!-- Add the rest of your HTML here -->
CAutocomplectionCtrl is a control designed to
the auto completion feature in a
CRichEditCtrl. You can easily
modify the code to add the auto completion feature in a
You can specify options such as displaying all known words or only the matching ones.
User can start the auto completion feature pressing
Ctrl+space; he can confirm the selected word pressing space, Enter or a non-alpha
char; he can use up, down, pgUp, pgDown, home, end, Ctrl+Space or mouse-wheel
to switch between the
in the list; he can use left, right to modify the
matching part of the word.
Using the control
Using ClassWizard add a variable in your dialog class; the
variable must be a
CAutocomplectionCtrl control; if the ClassWizard
CRichEdit select it, and change it to
CAutocomplectionCtrl in the .h file.
Remember to include "Autocomplection.h" in your .h file and to
insert the line
Initinstance() function of your
Then you must define your
dictionary using the
AddKeyword() funcion; usually you'll do that
OnInitDialog function. In the
sample application I read the words from a file, so resulting code is:
Well, your work is done :)
like you can specify some options...
You can enable or disable the auto completion feature; by
default it's enabled.
You can select if to display the listbox or not
You can select if to display in the listbox all known words, or only the
Pressing Enter, the selected word is confirmed.
TrapEnter is set to FALSE,
when pressing Enter, the control will add a new line char, if
TrapEnter is set
to TRUE, the new line char will not be displayed
You can select if the matching function must be case
sensitive or not.
That feature isn't very useful; if enabled, when the user
types an unknown word, the control will add it to the dictionary; that could be
nice if the user never mistakes typing words...
If this feature is enabled, when the user double-clicks
over a word, the control learns it.
void GetDictionary(CStringArray& dictionary);
This function fills the given
with all known words.
This function empties the dictionary.
BOOL AddKeyword(const CString& str);
This function adds the specified word in the dictionary.
BOOL IsKeyword(const CString& str);
This function checks if the specified word is in the dictionary.
The code compiles cleanly under the warning level 4.
I chose to insert word in alphabetic order and to find them using
a binary search, so the search
function is O(log(n)).
Word matching can be case sensitive or not case sensitive. Instead of checking anytime or duplicate the code I decided to use
Word recognition is done looking for the left-nearest "space" character. You can easily change your word recognition
modifying the line
while (from && buffer[from]!=' ')
with a such line
while (from && buffer[from]!=' ' && buffer[from]!='(' && buffer[from]!='=')
Further improvements (aka TODO)
The learn feature could be improved; anyhow the applicative context
suggests different improvement modalities: e.g., you could want to learn only frequent typed words, or only the # nearest words, or....
You could like to display an icon near the word (yes, like
Visual Studio)... so you should replace the
CArrayString with an array class and
a class containing the string and an ID specifying the icon.
Sometimes (when there are many matching words) filling
CListBox is slow. It could be useful to replace the
CListBox with a faster one (maybe a owner data listbox...)
12 July 2002 - First public release