Need CRichEdit Syntax Coloring Example
Chet Murphy -- cmurphy@modelworks.com
Wednesday, October 09, 1996
[Mini-digest: 3 responses]
Karen ,
> Environment: VC++ 4.1, Win 95
>
> I have a CRichEditView in which I need to
> do coloring of specific key words. I believe
> that I can do this with strictly plain text using
> character formatting and do not need to deal with rtf.
> Is there an example that someone could point me to?
> Also, the coloring must occur when the user types
> in key words, such as in the Visual C++ editor.
> I have MSDN.
I tried doing syntax coloring with CRichEditView. In my approach I
created a RTF stream by parsing raw text and adding RTF encoding for
the words that needed to be syntax colored. I also used an interactive
parser to syntax color text entered by the user. All of this worked
reasonability well although it was a little slow even on a fast
machine. The one problem that I could not solve was keeping syntax
colored text readable when selecting text. In the end I gave up and
wrote my own text editor from scratch.
> Is it always necessary to pair the CRichEditView
> with a CRichEditDoc?
No.
Chet Murphy
ModelWorks Software - Editors for Java, JavaScript, VBScript, HTML and VRML
cmurphy@modelworks.com
http://www.modelworks.com/express
-----From: "MHENRY.UMI.COM"
Environment: VC++ 4.0, Win 95
Karen,
Funny you should ask. I spend all day writing syntax coloring views. I have
a project in which users can load any one of 6 different file formats which
are all colored differently. My needs are a bit complex, but if you only need
to color key words it's a piece of cake.
1. Trap the OnChar event and get the current line.
2. Scan back to the start of the word and see if it's a keyword by looking it
up in a CStringToPtr map.
Just store NULL for the "pointers" in the map and use it as a hash
table.
3. If the user types a syntax color the current and previous words.
If the user types color the last word on the previous line also.
You'll also need to handle OnPaste(), OnCut() and OnClear().
4. Use the standard CRichEditCtrl::SetSel() and
CRichEditCtrl::SetSelectionCharFormat() to change the color. Note: it seems
to be faster if you GetSelectionCharFormat() to test to see if you want to
change the color of the text before you actually change it.
As far as examples of syntax coloring, it sounds like what I do is much more
complex than you need. I need to color comments and filenames other various
annoyingly complex things. I use a state table generated by lex and scan the
line, using a hash table to look up keywords.
You can search on the web for an editor called "Elvis 2.0", a vi clone with
syntax coloring that comes with source code. But it probably does more than
you need to do as well. And it doesn't use a CRichEditView.
>in key words, such as in the Visual C++ editor.
I've spent a lot of time playing with the Visual C++ editor to figure out how
they do their syntax coloring. I'm pretty sure they do not use a
CRichEditCtrl. Anyway, their method is pretty terrible; it's very easy to
fool, especially with numbers. I think Microsoft needs to hire me to redo it
;-)
>Is it always necessary to pair the CRichEditView
>with a CRichEditDoc? If not, what is the scenario
>where one would just use a CDocument?
I think a CRichEditDoc has to be paired with the CRichEditView. Anyway, why
wouldn't you want to?
--matt
/~~~~~~~~~~~~~~~~~~~~~~~~~~~
Matthew Henry -- UMI
mhenry@umi.com (Work)
mhenry1384@aol.com (Home)
~~~~~~~~~~~~~~~~~~~~~~~~~~/
-----From: "Luke Stephens"
Look at the Wordpad source code on the VC++ CD.
It's located in msdev\samples\mfc\ole\wordpad.
I think it has what you are looking for.
Luke Stephens
luker@tfs.net
Michael Iles -- michaeli@dra.com
Friday, October 11, 1996
I have written a CRichEditCtrl-derived class that does simple syntax
colouring. The only difference between mine and the ones described by
others here is that mine takes the words to be coloured from a string
resource and I run them through my own simple finite-state-machine
instead of using lex (or flex or whatever) to generate the state table
for me.
It's very simple to trap keystrokes and colour the one or two affected
words (as described by others), but the tricky part I came across is that
with rich edit controls the user can drag text around with the mouse and
I had to implement an OLE interface map to be notified when this had
happened. (People in this forum helped me to figure this out... Thanks!)
I would be happy to provide my source or respond to questions. In
retrospect (as always) it's quite easy and involves only a hundred or so
lines of code.
Mike Iles
(michaeli@dra.com)
| Вернуться в корень Архива
|