Click here to Skip to main content
Licence 
First Posted 10 Jul 2002
Views 155,562
Bookmarked 79 times

Autocomplection in RichEdit Control

By | 11 Jul 2002 | Article
A control that allows to use an autocomplection feature in RichEdit controls as the one in Visual Studio

Sample Image - AutocomplectionCtrl.gif

CAutocomplectionCtrl is a control designed to add the auto completion feature in a CRichEditCtrl. You can easily modify the code to add the auto completion feature in a CRichEditView.

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 words 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 displays only 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

AfxInitRichEdit();

in the Initinstance() function of your application.

Then you must define your dictionary using the AddKeyword() funcion; usually you'll do that in the OnInitDialog function. In the sample application I read the words from a file, so resulting code is:

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

Well, your work is done :)

If you like you can specify some options...

Option functions

void Enable(BOOL);

You can enable or disable the auto completion feature; by default it's enabled.

void ShowListBox(BOOL);

You can select if to display the listbox or not

void ListAllWords(BOOL);

You can select if to display in the listbox all known words, or only the matching ones

void TrapEnter(BOOL);

Pressing Enter, the selected word is confirmed.

If 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

void CaseSensitive(BOOL);

You can select if the matching function must be case sensitive or not.

void AutoLearn(BOOL);

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...

void LearnOnDblClick(BOOL);

If this feature is enabled, when the user double-clicks over a word, the control learns it.

Dictionary functions

void GetDictionary(CStringArray& dictionary);

This function fills the given CStringArray with all known words.


void ResetDictionary();

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.

Developing notes

The code compiles cleanly under the warning level 4.

Search

I chose to insert word in alphabetic order and to find them using a binary search, so the search function is O(log(n)).

Case sense

Word matching can be case sensitive or not case sensitive. Instead of checking anytime or duplicate the code I decided to use function pointers...

Word recognition

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...)

History

12 July 2002 - First public release

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Paolo Vernazza

Web Developer

Italy Italy

Member



Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
GeneralThis is not working for Japanese text PinmemberMember 9328191:56 4 Jun '10  
GeneralIncorrect twips conversion PinmemberDan East18:46 14 Dec '07  
GeneralVC8 compilation issues : error C2065: 'i' : undeclared identifier [modified] Pinmembercarlosrt2:27 27 Sep '06  
Generalpb with download Pinmemberhiko-seijuro21:41 26 Jun '05  
Hi i can't download the source and the demo. Is it normal ?
 
thx
Questionhow to add image Pinsussnevis3:29 9 Jul '04  
GeneralSelect list item with mouse PinmemberAdrian Gibbons4:03 3 Feb '04  
GeneralRe: Select list item with mouse Pinmembersammyc19:33 3 Jun '04  
GeneralRe: Select list item with mouse PinmemberAdrian Gibbons23:32 3 Jun '04  
GeneralRe: Select list item with mouse Pinmembersammyc22:06 3 Jun '04  
GeneralProblem with scrolling Pinmemberarikgreen14:15 6 Sep '03  
Generaldo not appear inside a text Pinmembermmueller8:14 22 May '03  
Generalbug with tabs Pinmembermmueller7:41 22 May '03  
GeneralRe: bug with tabs PinsussGanesan Subramaniam3:44 15 Jan '04  
GeneralListbox disapears PinmemberSkipla12:14 20 Feb '03  
GeneralRe: Listbox disapears Pinmembersammyc19:36 3 Jun '04  
Generalbug: list box leaves artifacts Pinmemberhector801120:18 1 Feb '03  
QuestionHow to implement in CRichEditView? PinmemberRickGavin20:42 5 Aug '02  
AnswerRe: How to implement in CRichEditView? PinmemberPaolo Vernazza1:30 7 Aug '02  
GeneralRe: How to implement in CRichEditView? Pinmemberallelimo3:23 18 Nov '02  
GeneralRe: How to implement in CRichEditView? PinmemberAdrian Gibbons2:05 11 Dec '03  
AnswerRe: How to implement in CRichEditView? Pinmemberworldtree118:26 13 Apr '06  
GeneralThis is Great PinmemberColin Davies19:32 14 Jul '02  
Questionhow to show the list?? Pinmemberbenben3:52 14 Jul '02  
AnswerRe: how to show the list?? PinmemberPaolo Vernazza14:36 14 Jul '02  
Generalbusted image Pinmemberbryce16:00 11 Jul '02  

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Mobile
Web01 | 2.5.120528.1 | Last Updated 12 Jul 2002
Article Copyright 2002 by Paolo Vernazza
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid