原文:http://hi.baidu.com/combojiang/blog/item/6e65d6f322f81bce0a46e0c0.html
- E7 D( j L7 A R6 w3 @; ~7 l+ V / _4 P- i' [( B: s5 {4 C. ~7 W
在读这篇教程之前先提醒你,这是一个复杂的主题:不适合初学者。这是最后一篇RichEdit 控件教程。5 Z! P7 ?7 e0 m1 F1 p1 ^
1 I% ?5 ~! i! {5 ~. x1 r7 ]
理论:
& _: Y$ a& a! R9 {语法高亮显示对那些编写文本编辑器的人来说是一个热点主题。最好的解决方法是编写一个定制的Edit控件,这也是很多商业软件所使用的方法。然而,对于那些没什么时间来编写这么一个控件的人来说,次策就是改写现有的控件使之符合我们的需要。
5 P: O) k* ^. X$ _& \/ @& ~[size=-1]让我们看一看,到底 [size=-1]RichEdit [size=-1]控件提供了什么功能来帮助我们实现语法高亮。现在我应该声明,下面的方法不是一个[size=-1]“[size=-1]正确[size=-1]”[size=-1]方法:我只是给你们指出那些缺陷。 [size=-1]RichEdit [size=-1]控件提供了[size=-1]EM_SETCHARFORMAT [size=-1]消息,是你可以用来改变正文颜色。乍一看,这个消息好象是一个完美的解决方法[size=-1]([size=-1]我之所以知道是因为我也是其中的一个受骗者[size=-1])[size=-1]。然而靠近看看,将会发现有几个不合意的地方: - [size=-1]EM_SETCHARFORMAT [size=-1]仅仅对选定的正文或者控件中所有的正文有影响。如果你想改变正文颜色(高亮显示某一个特定的词),你必须先选定它。
- [size=-1]EM_SETCHARFORMAT [size=-1]执行速度很慢。
- [size=-1]RichEdit [size=-1]控件中的插入点位置处理也有一点问题。
% ]* {# ]6 h: o1 |# i2 U# e [size=-1]通过上面的讨论,你可以看到使用 [size=-1]EM_SETCHARFORMAT [size=-1]是一个错误的选择,我会给你演示 [size=-1]"[size=-1]相当正确[size=-1]" [size=-1]的选择。0 R) d; B2 I$ w# g' A
[size=-1]我现在使用的方法是[size=-1]“[size=-1]即时语法高亮[size=-1]”[size=-1],我只高亮显示可见部分的正文。因此高亮显示的速度跟文件的大小根本是无关的。无论是多大的文件,在某一时刻只有一小部分是可见的。
4 X f8 u# H7 \% N' A[size=-1]怎么样实现?答案很简单:
- {1 M2 T0 L. {7 W3 E( B" b- [size=-1]子类化[size=-1]RichEdit[size=-1]控件并在你自己的窗口处理函数中处理 [size=-1]WM_PAINT [size=-1]消息。
- [size=-1]当收到 [size=-1]WM_PAINT [size=-1]消息时,它调用[size=-1]RichEdit[size=-1]控件原来的窗口过程,让它正常地更新屏幕。
- [size=-1]之后,我们将要高亮显示的词用不同的颜色来覆盖掉。
9 h# v7 @% U; R( b# ^, f [size=-1]当然了,路也不是这么容易走的:仍然有两个次要的问题需要矫正,不过上面的方法工作起来很好。显示速度令人很满意。
5 x3 {5 q1 Q: ]+ e0 S- ?[size=-1]现在让我们集中在细节上。子类化处理是很简单的,不需要很多注意力。真正复杂的部分是:我们必须找到一个快速的方法来搜索那些需要高亮的词。更复杂的那些在某个注释块里的 不 需要高亮显示的词。
# J* m7 ^ z# J[size=-1]我使用的方法可能不是最好的,但是它工作的很好。我敢肯定你可以找到更快的方法。不管怎么说,先看看我下面的方法:
' M% Z( [7 W2 j" q2 q- [size=-1]我创建一个有[size=-1]256[size=-1]元素的双字[size=-1](DWORD)[size=-1]数组,全部初始化为[size=-1]0[size=-1]。每一个元素对应一个可能的 [size=-1]ASCII [size=-1]字符,数组名叫 [size=-1]CppSyntaxArray[size=-1]。例如,第[size=-1]21[size=-1]个元素代表[size=-1]ASCII 20h ([size=-1]空格字符[size=-1])[size=-1]。我将他们作为快速查询表使用:譬如,假定我有一个词 [size=-1]"include"[size=-1],我从词中分离出第一个字符 [size=-1](i) ,[size=-1]并以响应索引查找数组。如果该元素为[size=-1]0[size=-1],我就立刻知道需要高亮的词是没有以 [size=-1]"i" [size=-1]开头的。如果该元素非[size=-1]0[size=-1],它就包含一个指针,指向一个 [size=-1]WORDINFO [size=-1]结构的链表。里面包含了需要高亮词的信息。
- [size=-1]我读取需要高亮显示的词,并为每个词创建一个 [size=-1]WORDINFO [size=-1]结构。+ v5 \/ q2 f2 q7 J$ i' S1 m0 C
typedef struct WORDINFO
: A: b8 j" k$ H{3 M. N( D9 Z% y
DWORD WordLen; //词的长度,用来快速比较
( y4 M8 K9 @% E. | LPTSTR pszWord; //词的指针
$ n8 H; T$ l- t. F9 K COLORREF Color; //颜色值
' q" K0 ]. ~$ h! Q! R: u WORDINFO * NextLink; //下一个 WORDINFO 结构; ]: a; ] b! h- [% j
}WORDINFO;$ w. U( K* q- b% J9 B! v7 k: [
[size=-1]正如你所看到的,我使用词的长度来作为第二个快速比较方法。如果词中的第一个字符匹配后,我们下一个比较的是词的才长度。[size=-1]CppSyntaxArray [size=-1]中的每一个元素包含了一个指针,指向一个相关的[size=-1]WORDINFO [size=-1]数组[size=-1].[size=-1]例如,代表字符 [size=-1]"i" [size=-1]的元素将会包含一个指向以[size=-1]"i"[size=-1]开头的词的链表。 [size=-1]Color [size=-1]成员指向一个[size=-1]DWORD,[size=-1]包含用来做高亮显示该词的颜色值。[size=-1]pszWord [size=-1]指向要高亮显示的词。是小写形式的。
, s) @( p8 c8 Y6 U8 p# b - [size=-1]链表的内存是从堆([size=-1]heap)[size=-1]中分配的,速度快,容易清除,也就是说根本不用清楚。+ a5 ^1 D. W2 N/ ^# d
[size=-1]高亮词列表保存在文件 [size=-1]"wordfile.txt"[size=-1]中,我通过 [size=-1]GetPrivateProfileString API [size=-1]函数来访问。我提供了多达[size=-1]10[size=-1]种不同的语法颜色,从 [size=-1]C1 [size=-1]到 [size=-1]C10[size=-1]。颜色数组名叫 [size=-1]CppColorArray[size=-1]。每一个 [size=-1]WORDINFO [size=-1]结构的 [size=-1]Color [size=-1]成员都指向 [size=-1]CppColorArray [size=-1]中的某一个元素。因此闲时很容易改变语法颜色:你只需要改变 [size=-1]CppColorArray [size=-1]中的元素的值,这样所有使用那种颜色高亮的词就立刻使用新颜色显示。
" G4 p6 Z! M; ]# y; Q1 k3 [例子:见光盘FirstWindow33#include "Windows.h"
- }$ x& d9 O% [#include "tchar.h". E8 c' i8 w5 V9 D- ~; n
#include "Richedit.h"
3 e7 t6 x5 C# _" d#include "shlwapi.h"
, e9 |( a* @" i2 _5 |8 F% ?; b#pragma comment(lib,"shlwapi.lib"). ]2 ]( G7 ?" j; {' z; d, F& z
9 s" c8 s4 O' K
typedef struct WORDINFO
9 K& s/ m, y0 b{: j) w+ k1 m- E; e' B K9 v
DWORD WordLen; //the length of the word: used as a quick comparison9 b4 O3 K- l6 f( M. T" N/ k8 j
LPTSTR pszWord; //pointer to the word, z2 [% v" h2 @2 G
COLORREF Color; //point to the dword that contains the color used to hilite the word U# K/ N2 n, m( ]# [; z
WORDINFO * NextLink; //point to the next WORDINFO structure! S0 C( _/ b0 f4 V! f
}WORDINFO;
5 t1 u$ c# o6 U& v! ], G7 |
& G8 i, L" J: L#define IDR_MAINMENU 101
: o# o* H! ~% d* i* p1 M#define IDM_OPEN 40001
" Y) u5 ]9 i, w3 c f5 a#define IDM_SAVE 400022 _2 t2 M7 R$ R5 X
#define IDM_CLOSE 40003
: r! ?9 \6 ~3 j7 }9 \#define IDM_SAVEAS 40004
. V5 S4 L, f. ]( V#define IDM_EXIT 40005& w2 o+ c& g! p2 G3 Z# l
#define IDM_COPY 40006
/ @1 A7 h# c# n2 [8 [ a#define IDM_CUT 40007" p. c- w7 P% O3 |
#define IDM_PASTE 40008! @1 G, Z2 n/ l; v
#define IDM_DELETE 40009
! D1 k+ Q f, x: V& y#define IDM_SELECTALL 40010
8 g1 _* y. l4 `' l. k1 D#define IDM_OPTION 400119 w# j+ o9 w5 _6 N8 z' N( [3 b) F/ L7 B
#define IDM_UNDO 40012( z" I3 ` {; e$ l, L4 G
#define IDM_REDO 400133 ~, `, f( |( y- t1 L9 g' B
#define IDD_OPTIONDLG 101
[, N4 l( x9 ~; W- w#define IDC_BACKCOLORBOX 1000
) K' A; i' {) i9 y6 v& e) y* @#define IDC_TEXTCOLORBOX 1001
$ B' i ^% q. U) A0 U* D, A7 `$ R#define IDR_MAINACCEL 105
. B D4 t, x) |! |% w1 @$ y9 P#define IDD_FINDDLG 102
8 ~( `3 N8 ]* G& |" A; D#define IDD_GOTODLG 103# u/ l$ L& X/ B* J, c4 M
#define IDD_REPLACEDLG 104& o% m6 v, L' H4 f4 H
#define IDC_FINDEDIT 10008 _" ^5 g3 J/ P+ W; s$ Q
#define IDC_MATCHCASE 1001
2 C% e5 a* J3 N6 y8 N: v#define IDC_REPLACEEDIT 1001+ c3 c' f% o, j, Q3 X- m
#define IDC_WHOLEWORD 1002! D, S( A8 T# [9 V0 B
#define IDC_DOWN 1003
' x! F0 O- U* h% A$ x#define IDC_UP 10049 `/ D$ g8 N/ V8 f) ~
#define IDC_LINENO 1005
. W+ _9 g% M, ~1 ~3 c* m( g#define IDM_FIND 40014
2 X. x+ D. ?) J6 b6 v#define IDM_FINDNEXT 40015, m- y( p! a1 j3 a) r( a3 p( H K
#define IDM_REPLACE 40016
5 B- N/ o6 H. @, \3 b& ~$ z3 N#define IDM_GOTOLINE 40017
2 ^# E4 `+ O% A& R/ [2 b#define IDM_FINDPREV 40018
. U; m. A, R. V#define RichEditID 300* N" J, h. H$ M
* \. x) p! N4 w. w! ~3 }* _
' G5 {5 L7 Y0 q0 Q0 P, C# f" M- |
TCHAR ClassName[] = _T("IczEditClass");
. S. F, L' f+ FTCHAR AppName[] = _T("IczEdit version 3.0");
7 B- m+ U" k: l$ _. V/ r5 H' |TCHAR RichEditDLL[] = _T("riched20.dll");0 N' S& x9 q; J6 A4 D
TCHAR RichEditClass[] = _T("RichEdit20A");' v2 X" A7 L" {: i) B- _% P
TCHAR NoRichEdit[] = _T("Cannot find riched20.dll");
* W; y( P }5 G( `5 u7 w0 x, R. J$ XTCHAR CppFilterString[] = _T("asm source code(*.asm)\0*.asm\0All Files (*.*)\0*.*\0");. Q; s0 C- ^7 k' M7 X4 v
TCHAR OpenFileFail[] = _T("Cannot open the file");: S% }1 W8 t0 q0 t) G8 D
TCHAR WannaSave[] = _T("The data in the control is modified. Want to save it?");
& w# W! b& s$ @9 q& y* d+ E! z8 I1 |& F, ]4 J: H
BOOL FileOpened = FALSE;
# G+ y5 h# r d4 N8 KCOLORREF BackgroundColor = RGB(255,255,255) ; N2 y( q( o0 l& r
COLORREF TextColor = RGB(0,0,0);
9 \. S1 w' t& }8 jHWND hSearch;& T$ g! A) G" k: y
HACCEL hAccel;; A! Y, f" V. n; \
TCHAR FileName[256];; d1 A# n7 B4 q. P. N6 ~
TCHAR AlternateFileName[256];, S0 T4 {* ], K" y6 I. Y
DWORD CustomColors[16];4 m f U; K3 Z5 F% l
HINSTANCE g_hInstance;
7 N7 S7 ~1 ~" N5 b \HMODULE hRichEdit;
3 n& R2 w2 w. ]) WHWND hwndRichEdit;
) a! @- \& |' s: |9 QTCHAR FindBuffer[256];
; X* ^* ^) Q9 \TCHAR ReplaceBuffer[256];
6 h" e4 M6 z) C: K' c; E5 I# cDWORD uFlags;9 K0 m u- x: l, {) x5 R9 S
FINDTEXTEX findtext;3 M6 U4 Z' f1 `: t/ ^8 s7 A' V
# u0 ], G% [2 y! q6 {# X4 t0 M
TCHAR WordFileName[] = _T("\\wordfile.txt");
" w& z0 E4 G! K0 zTCHAR CppSection[] = _T("AsmSection");
% m1 I; n! K# f: e6 cTCHAR C1Key[] = _T("C1");
2 K6 j6 X6 j' `' n3 JTCHAR C2Key[] = _T("C2");
& @3 i; W6 f) i1 P5 _TCHAR C3Key[] = _T("C3");
' q7 T* I0 g0 r) K) c: CTCHAR C4Key[] = _T("C4");
$ f; B1 I1 L! v$ N: UTCHAR C5Key[] = _T("C5");3 b/ i* S4 E: [& W) T4 f* A, s
TCHAR C6Key[] = _T("C6");
1 M: `7 V' a+ i) a8 Z: FTCHAR C7Key[] = _T("C7");+ b2 y% F! ]$ K! P) C9 a- i
TCHAR C8Key[] = _T("C8");# B8 k U$ u; x4 L) G& F/ ^
TCHAR C9Key[] = _T("C9");
3 c4 Y( \" z6 B9 W( O# ]TCHAR C10Key[] = _T("C10");
3 r' ?0 s: Z m3 r, |4 {TCHAR ZeroString[] = _T("\0");; m X( R& K' F' ^
COLORREF CppColorArray[] = {
( \, u+ [4 @% D b7 D1 R: n RGB(0,0,0xff),RGB(0x50,0x5f,0x80),RGB(0xff,0,0),RGB(0,0x6f,0x66),5 d4 O8 G/ Q% f% ^( ]! f# H
RGB(0xf0,0x44,0),RGB(0x54,0x87,0x5f),RGB(0,0,0xff),RGB(0,0,0xff),
8 h/ L, Z* t! d9 u. X# X, w RGB(0,0,0xff),RGB(0,0,0xff)- \2 U' O+ I0 z, K$ X& x/ u' g; C
};
5 m% Y5 h& t* q. s2 d
! ~; M* @" W8 Q% P1 p- C# M, rCOLORREF CommentColor = RGB(0,0x80,0x80);
! f, }0 m9 f9 u7 cDWORD CppSyntaxArray[256];
" s1 Y8 O9 t; ]& s& v4 t3 EWNDPROC OldWndProc;
* K8 a# a8 `! G5 r9 m J0 a# tDWORD RichEditVersion;
& p* l& `0 y& L+ h+ xHANDLE hMainHeap;1 L: u5 _# |, u9 n
LONG CALLBACK NewRichEditProc( HWND hWnd,
% s. C2 s) X7 M5 K UINT Msg, 7 n' C$ l, b; v7 q
WPARAM wParam,
8 W0 }2 D+ y, f, o1 i3 t9 R( E LPARAM lParam
$ @% J9 K% W: y6 r$ p& E; D)- Q7 t2 g7 a$ j6 p
{/ Q6 D( ^% k' \
HDC hdc;
2 C% ]9 B$ D* T- p( S, I HFONT hOldFont;
. u, v' F6 E0 X R) J! Q) m J DWORD FirstChar;3 z% c; T! J) k
RECT rect;
9 ?8 L/ q4 M: R TEXTRANGE txtrange;
/ L8 g- c4 R) D TCHAR buffer[1024 *10];- v9 |% b& a1 \6 l0 n
HRGN hRgn;; V& R' d1 g9 i
HRGN hOldRgn;
- y# l" ?* @ a3 {! k$ b9 v: x8 S6 B RECT RealRect;, \( c) e1 W% {1 s, ~: ^: E! L& H
DWORD BufferSize;' \% n% ]9 K1 V
LPTSTR pString;( @% r4 W+ o, b: g0 T
& V% F1 O' W7 G8 Y, q3 _% f% x2 \
switch(Msg)1 J' H5 l" H; O* W! x8 u
{
# t0 @. j+ E4 ]% m# ~5 Y; A: ` case WM_PAINT:
( }2 p/ }" c' x2 `8 x$ i, g4 K {$ u& g- Z0 l& n
HideCaret(hWnd);9 i9 b8 B2 E1 r( x
int nRet = CallWindowProc(OldWndProc,hWnd,Msg,wParam,lParam);% ]) H2 g- E! G, B6 m3 U" x/ p
hdc = GetDC(hWnd);
+ a. _: g i. e* P" l5 g SetBkMode(hdc,TRANSPARENT);# ]+ o- b, b( A' \8 a
SendMessage(hWnd,EM_GETRECT,0,(LPARAM)&rect);
! d# I# o$ x2 A( d2 z: { int nPos = SendMessage(hWnd,EM_CHARFROMPOS,0,(LPARAM)&rect); f+ H7 `; h" x: T" P+ V" q
- R4 o7 I" P: k int nLine = SendMessage(hWnd,EM_LINEFROMCHAR,nPos,0);3 X; j8 e/ k$ u
int nIndex = SendMessage(hWnd,EM_LINEINDEX,nLine,0);$ r! `) v, s3 L G8 j+ ^* L- c- {
txtrange.chrg.cpMin = nIndex;
& n% ?0 {) o9 ]4 D9 g) O8 R) Z FirstChar = nIndex;
( u* C8 R! b; [3 N5 ?' q int nNextPos = SendMessage(hWnd,EM_CHARFROMPOS,0,(LPARAM)&rect.right);6 t) i& A4 U4 Z2 Q4 s
txtrange.chrg.cpMax = nNextPos;
' E8 k0 O% U& s RealRect.left = rect.left;
& t9 x. O6 @* h8 o9 ~ RealRect.top = rect.top;
% d4 W3 w0 Q. g0 }$ d. f RealRect.right = rect.right;
9 g" x# h/ o( E. L, o RealRect.bottom = rect.bottom;
: o( o% Z: z I hRgn = CreateRectRgn(RealRect.left,RealRect.top,RealRect.right,RealRect.bottom);& b0 _4 J3 I! L+ t9 L
hOldRgn = (HRGN)SelectObject(hdc,hRgn);/ K: \0 I* J7 o# k+ q
SetTextColor(hdc,CommentColor);
8 ^/ r! m! E8 w- W5 L/ R" }0 d2 B; P. M
txtrange.lpstrText = buffer;# [' V9 A$ j$ Q' l" x
BufferSize = SendMessage(hWnd,EM_GETTEXTRANGE,0,(LPARAM)&txtrange);% \- r* s% I6 A8 W1 d8 E
pString = buffer;; N* K9 O+ i& U
while(pString - buffer < BufferSize)
5 l: {- w$ `; z5 }: |/ V {) }' e: H( G9 F* p. D
pString = strchr(pString,_T(';'));2 b5 s: y4 a' z9 |
0 w& u& A$ {4 G. h
if(pString != NULL)/ ~% R4 V" W% ~) F! ]! G, x' X
{
$ _8 I; t6 f& e
0 P- Q* |7 V$ ~' |) U txtrange.chrg.cpMin = pString - buffer + FirstChar;% }3 i& |6 T5 o0 s# N R
LPTSTR pTemp = strchr(pString,_T('\r'));( {4 T. D5 K7 l) a
if(pTemp != NULL)
! D# a8 }8 [* ~, i& y7 S z; l; f7 n: Z {
1 Q; ?4 Q% a) ~2 R *(pTemp) = _T('\0');
, x& W) z2 p8 Y- _ }+ N6 ~7 c1 e, K9 p$ u' u
else
, f: O$ ?7 Z& q5 B, P% K pTemp = buffer + BufferSize;* J7 a# u! } V8 J
4 g# A7 R8 P4 @. k( N
txtrange.chrg.cpMax = pTemp - buffer + FirstChar;
5 l4 |# p6 I* i1 n/ D. Q
3 y3 B% o- @/ u' @7 f int nLen = txtrange.chrg.cpMax - txtrange.chrg.cpMin;
" X$ k8 r8 C' I3 Z( i5 Y4 v4 }% d+ [7 H
LPTSTR pstr = pString;0 u$ Z8 V9 v6 W. `: q
while(nLen > 0)% E& y" h- n) g( C! y+ M( X
{( @/ y& A4 _4 M
if(*pstr == 9)
6 m% ]- A/ i6 l: \6 J- W *pstr = _T('\0');1 N: D' s- K6 y
5 \1 u& v' W% J7 l pstr ++;
. g/ e9 n( K5 K! O& } nLen --;
" I3 N4 N! O9 a1 V6 D }8 J* @3 O3 U! M0 O7 T9 M+ M
4 l$ x* y! q7 O7 Y9 S% z8 K; H int nMyLen = txtrange.chrg.cpMax - txtrange.chrg.cpMin;
" u# w2 p5 |" J/ l- |' I) m/ N LPTSTR pMyStr = pString;
; V; A; W$ G" d; Q( S7 x9 ?* Y+ F while(nMyLen > 0)
7 H' Z7 [1 S/ T9 _5 u+ r {& M) G5 ]$ s# R8 p* x8 b( N8 s
int nstrlen = lstrlen(pMyStr);% J9 f- x7 L% K+ c# r4 p
if(*pMyStr != _T('\0'))
' N. e, v3 w0 d$ p" J {
- ^( [0 U, V/ ~3 r+ G) U$ u- K7 ^" r+ y if(RichEditVersion == 3)6 u/ Q" b9 a$ ?( ~( `, ^$ J: o
SendMessage(hWnd,EM_POSFROMCHAR,(WPARAM)&rect,(pMyStr - buffer + FirstChar));
0 h' S+ k5 Q. H# l' K else
, S- B1 W5 z9 ]. ?( z$ u {
& ]* N# W# S: j* o; I" S; K int nWidth = SendMessage(hWnd,EM_POSFROMCHAR,(pMyStr - buffer + FirstChar), 0);7 p$ ?# x% C$ D
rect.left = LOWORD(nWidth) ;/ }. n6 g7 S& t- O( a6 u, v- V
rect.top = HIWORD(nWidth);" U6 V, v4 J. S$ ^
}
; i6 \2 w9 |7 Z2 ~' Z. b0 N8 Q; ~8 C9 o0 n5 d
DrawText(hdc,pMyStr,-1,&rect,0);8 k! s8 l4 U% @& z6 f" J6 g) C Q
pMyStr += nstrlen;
* n8 F1 m) Q# N3 x! c nMyLen -= nstrlen;. ?/ B) {0 C9 R( g) P
}
+ Y; T+ L" z$ u* t, x/ _- U else& } L4 a) O# m0 f, I
{
m" n# X- Z4 ] G; a" E. x pMyStr++;. c0 H- q$ k P Z% c
nMyLen--;
' K. |! g5 g1 h, {: E$ V* H% h X }
& L T3 ]( }5 M9 r+ u }8 F1 I4 t7 p$ B
; k/ S" R, K& P. }" U6 I RtlZeroMemory(pString,(txtrange.chrg.cpMax - txtrange.chrg.cpMin));
6 t6 ~* L' M. W7 i6 r. ~2 O
; y" a6 U ^9 c7 H+ s pString += (txtrange.chrg.cpMax - txtrange.chrg.cpMin +1);
8 M8 e2 [7 W ? }% l6 g! ^& `' e9 k* G1 w8 Y3 I/ d
else( z$ \, R9 W- `: g
break;. j% m5 M, t5 c! m6 N" _
2 B E3 v; G4 h! P! I' F
}3 x u" ?+ i! {- S
6 y2 m% w! R0 h/ u& C7 R; s L
int nMyBufferLen = BufferSize;
9 d. P1 l+ \0 ~" G, V# y) a6 [: @ LPTSTR pMyBuffer = buffer;
8 D0 U9 C7 d/ _. T while(nMyBufferLen > 0)' l e+ k, w% N1 ]& i8 R
{
% O3 q! {% o0 x6 k5 Z! x% {
0 |1 ]9 C j% w) T2 t3 ^ if(*pMyBuffer == _T(' ') || *pMyBuffer == _T('\r') ||
' p9 b; j: l* T Q3 }+ Z) c( l *pMyBuffer == _T('/') || *pMyBuffer == _T(',') ||4 G8 {' }) I# z% v1 s) @
*pMyBuffer == _T('|') || *pMyBuffer == _T('+') ||9 O$ w+ L$ G! H+ l3 b
*pMyBuffer == _T('-') || *pMyBuffer == _T('*') ||
8 R; t/ G" E6 F: j) H *pMyBuffer == _T('&') || *pMyBuffer == _T('<') ||8 P7 O* t* o( s1 |/ s1 \5 |; }( [
*pMyBuffer == _T('>') || *pMyBuffer == _T('=') ||2 f- c7 E8 F9 I5 d3 g3 Q
*pMyBuffer == _T('(') || *pMyBuffer == _T(')') ||" I _ R. y5 c- U
*pMyBuffer == _T('{') || *pMyBuffer == _T('}') ||
0 i; B; x ~8 }7 X U1 P$ I5 `+ P *pMyBuffer == _T('[') || *pMyBuffer == _T(']') ||
3 }$ c7 z: I7 c5 }7 [ *pMyBuffer == _T('^') || *pMyBuffer == _T(':') ||2 T. s; N3 X) I8 j6 S
*pMyBuffer == 9 )" v8 k; |# u1 j9 Z% w% q4 Q
{
% Q- b+ p5 l. U( l9 _ *pMyBuffer = _T('\0');/ _: }# u2 d% Q
}
8 _% G1 [3 e- E+ \+ G/ C7 e$ v. W pMyBuffer++;/ @" j3 f7 o4 Y' z( r. ~
nMyBufferLen --;
) ]4 V* U3 a8 r0 B! b& } }
" ?9 }( z- [9 d/ G% f0 ^
: }. [, V- ^$ g int nBuffLen = BufferSize;' ^; z. s5 S: X: s$ f
LPTSTR pMyBuff = buffer;
& o5 b8 s% T( ^0 r m, p while(nBuffLen > 0)
# Z% A" @2 Q9 w/ m5 H5 B- V {1 c* B* ?# o7 ^
if(*pMyBuff != 0)
0 \4 J; v7 @. K: r5 {. { {
7 }( h4 f7 y5 J; b int nlen1 = lstrlen(pMyBuff);, f& q4 W8 t5 S' z/ C2 A
CHAR cChar = *pMyBuff;6 b' {" \: K- T, ^& b
if(cChar >= _T('A') && cChar <= _T('Z'))
: ^3 s7 @: B3 G. @6 H {5 @9 m* z9 U) R- j( [5 ~" F2 ?1 T
cChar -= _T('A');
8 P. m4 {; Y+ [) i/ A/ L$ Z cChar += _T('a');
' y" s0 V$ o6 A: L4 H6 U! E }; ]# H" Q5 Y8 Q0 `
6 J8 E+ l0 P4 b
if(CppSyntaxArray[cChar] != NULL)
6 s5 A7 Q, l% |4 b. |9 f& t( C+ J# f {2 }9 S+ J* L5 Q$ w, n
WORDINFO *pWdInfo = (WORDINFO *)CppSyntaxArray[cChar];
. @# O1 r/ u+ z1 a; t while(pWdInfo != NULL)" f& Y$ ~. n. H8 y" X
{0 R- S; P0 \7 G1 P3 T3 O# H
if(nlen1 == pWdInfo->WordLen)! V( w$ @7 y) V9 _% Y Y
{
" a$ k4 V0 L( `8 V7 d$ R$ N if(lstrcmpi(pWdInfo->pszWord,pMyBuff) == 0)
) a6 @$ W! h/ Q {0 S3 E* v0 b% L" R2 Z8 R$ V+ Z4 m
if(RichEditVersion == 3)
! H' l9 r f6 V! q2 S8 Q5 |, s {
* ^3 ? }' A! J3 S, r* t" Y" h SendMessage(hWnd,EM_POSFROMCHAR,(WPARAM)&rect,(pMyBuff - buffer + FirstChar));
7 G! N9 a Q2 b5 a* C6 @' k }( R. F( f! T0 i
else$ S# s: s. u& R) S/ R6 I
{1 K$ T- W5 `' ^0 D. {, ~: R* q# y- u q
int nDim = SendMessage(hWnd,EM_POSFROMCHAR,(pMyBuff - buffer + FirstChar),0);
& K) z) C: Z2 Z r5 P; c( N rect.left = LOWORD(nDim );
# p/ c! D: N. Q' W8 b rect.top = HIWORD(nDim);
" H& Y6 M h+ H, \ }1 x. [3 T% Y/ a* O; q
. l2 ~0 M$ ]# E$ j4 S+ @6 ?3 w SetTextColor(hdc,pWdInfo->Color);' S/ A5 y) B! E
DrawText(hdc,pMyBuff,-1,&rect,0);
" j$ b4 }) W" w, | break;
; \* Q5 |3 m6 S1 l, l$ e9 c' _ }
/ k& A9 t e0 j! v% Y" {* E. c% d2 i }
( u% K# ]' D0 W `7 r1 R4 g pWdInfo = pWdInfo->NextLink;( {: J: O" A5 E" ]/ `
}
. B% \7 u( S, r- D }
/ c k# q, H3 W) |3 y
" X5 |2 ^: [6 _+ z, z6 a pMyBuff += nlen1;
3 b' s9 }4 L9 n9 w7 L% Q; H& W nBuffLen -= nlen1;
/ k5 v- |+ {4 W; z8 H/ I }4 o! Z* w3 s- o2 m X, N% N; H
else0 v6 U0 G5 y7 i. h; z
{
- y( ^9 q% M1 o1 w0 M4 [) Q pMyBuff++;; t' B" G2 l% I. @- H; Z
nBuffLen--;$ J) m( Y: q* t
}! A! F$ _& H9 C. e I2 } N" Q
}3 N. L1 m c+ [
) H1 U5 {0 u; u1 ?5 _6 @, S4 [ SelectObject(hdc,hOldRgn);& P' i: v/ y2 d: A# [2 C4 j
DeleteObject(hRgn);
+ x0 o" F8 b: l; v7 }2 H% v SelectObject(hdc,hOldFont);3 S+ ]/ F+ d" V1 M$ v! S
ReleaseDC(hWnd,hdc);
- B4 z0 v8 `0 N! ?& d* T ShowCaret(hWnd);$ M# E# \2 p: f8 X4 ~( O" q3 S
return nRet;
9 k t; B$ l! d3 z3 {1 E$ D4 ^6 X. p9 K% k! O
}
' B& Q h+ C: [) _- Q break;7 f2 q b# y) M7 a6 m/ E1 W! [1 Z
case WM_CLOSE:. ?9 r+ H- }0 x( z
SetWindowLong(hWnd,GWL_WNDPROC,(long)OldWndProc);+ d [: L3 [1 n# F! N/ K
break;
0 b: I* \5 @) `6 W- w' j default:3 N4 ?6 I7 l9 [2 n, l. h* Z
return CallWindowProc(OldWndProc,hWnd,Msg,wParam,lParam);: q7 x" C9 d# ]% L9 _5 J @
}
_4 P3 g6 g% W8 B
6 M6 ?! F2 F- @( b, y' S% F, |9 I9 p return 0;
# G3 W/ ?2 z+ d# w( j/ K3 Y+ O9 i2 v} |