原文:http://hi.baidu.com/combojiang/blog/item/6e65d6f322f81bce0a46e0c0.html
& H# Z; |8 c& [2 i
, _; x$ P4 {( p# B" N( @8 j在读这篇教程之前先提醒你,这是一个复杂的主题:不适合初学者。这是最后一篇RichEdit 控件教程。
0 ^5 R0 D) }* X- H; R/ Q, K5 ]6 r3 e, B9 c
理论: 8 C0 d5 |% ?! @& J
语法高亮显示对那些编写文本编辑器的人来说是一个热点主题。最好的解决方法是编写一个定制的Edit控件,这也是很多商业软件所使用的方法。然而,对于那些没什么时间来编写这么一个控件的人来说,次策就是改写现有的控件使之符合我们的需要。
# j. U8 H6 f) t7 Y[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]控件中的插入点位置处理也有一点问题。) Z( }: V8 Y8 `
[size=-1]通过上面的讨论,你可以看到使用 [size=-1]EM_SETCHARFORMAT [size=-1]是一个错误的选择,我会给你演示 [size=-1]"[size=-1]相当正确[size=-1]" [size=-1]的选择。) ]6 b7 k( O/ H7 [0 K7 I
[size=-1]我现在使用的方法是[size=-1]“[size=-1]即时语法高亮[size=-1]”[size=-1],我只高亮显示可见部分的正文。因此高亮显示的速度跟文件的大小根本是无关的。无论是多大的文件,在某一时刻只有一小部分是可见的。
. V9 b f! m$ T" {% p0 V c[size=-1]怎么样实现?答案很简单:
5 E% g H' N S; N- U# [6 Y- [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]之后,我们将要高亮显示的词用不同的颜色来覆盖掉。
( H- p6 Z+ `1 i3 c9 q4 W [size=-1]当然了,路也不是这么容易走的:仍然有两个次要的问题需要矫正,不过上面的方法工作起来很好。显示速度令人很满意。
) h' l' u. [- T# M( }+ S[size=-1]现在让我们集中在细节上。子类化处理是很简单的,不需要很多注意力。真正复杂的部分是:我们必须找到一个快速的方法来搜索那些需要高亮的词。更复杂的那些在某个注释块里的 不 需要高亮显示的词。
' q6 U6 y( w) Q2 d[size=-1]我使用的方法可能不是最好的,但是它工作的很好。我敢肯定你可以找到更快的方法。不管怎么说,先看看我下面的方法:& b& k/ S$ _% u( A; P
- [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]结构。" g" A4 C/ N- v
typedef struct WORDINFO
- y& B" T. a7 J9 j$ K( m{8 |& d6 ]) x5 z7 @, o" n. E- R
DWORD WordLen; //词的长度,用来快速比较
) H+ a9 }/ S2 k0 d5 C; l9 T' L LPTSTR pszWord; //词的指针) Q4 q. x* }- \2 ~" H* |
COLORREF Color; //颜色值' x" }9 W9 g; l, w$ c
WORDINFO * NextLink; //下一个 WORDINFO 结构- _& L p8 n6 t$ s+ E" S3 J. f
}WORDINFO;
$ Z: g9 g2 t1 o3 G K+ `9 r9 O[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]指向要高亮显示的词。是小写形式的。
6 N" D7 G' _, a/ }, b - [size=-1]链表的内存是从堆([size=-1]heap)[size=-1]中分配的,速度快,容易清除,也就是说根本不用清楚。. ]" O. h% j! ]3 N9 |
[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]中的元素的值,这样所有使用那种颜色高亮的词就立刻使用新颜色显示。- M+ D" y1 X. `' _! ?
例子:见光盘FirstWindow33#include "Windows.h"1 T1 H, a" \9 x8 [: I( m: U
#include "tchar.h"
/ _" t) r) _$ w7 R' p% [$ [- M#include "Richedit.h"5 ~" }) o. S' H, H/ a1 Z7 Y
#include "shlwapi.h" @, c$ ^9 N+ m# d. q
#pragma comment(lib,"shlwapi.lib")
8 \# b3 |1 d% l1 E `7 n C. v* s/ r% U9 T
typedef struct WORDINFO
. S0 }* v' v& E% i{
4 W( j2 S( C k7 {- ] DWORD WordLen; //the length of the word: used as a quick comparison
- h3 T) w# e0 X9 |) C3 r6 \1 E3 d LPTSTR pszWord; //pointer to the word) R+ {' L# M1 r) [6 d
COLORREF Color; //point to the dword that contains the color used to hilite the word g# b4 G: @& V/ k& r5 B
WORDINFO * NextLink; //point to the next WORDINFO structure, H5 S$ T7 ]" X
}WORDINFO;: |0 i, ~6 Z/ W* w
" H0 p# G6 U9 `5 ?! Z1 y( Q, p#define IDR_MAINMENU 101
: ?) L" ^4 d. Z: C#define IDM_OPEN 40001& I/ _1 [- c8 ~+ z: Z2 z0 v* k
#define IDM_SAVE 40002 S) ~ r }; c* C
#define IDM_CLOSE 40003
% L- D% H- h3 v6 p+ @+ E) K#define IDM_SAVEAS 40004
$ O1 N/ v9 f8 e) E. w3 ]* e#define IDM_EXIT 40005. n# e! w' p6 F2 z0 k% B' W7 ^0 G
#define IDM_COPY 40006, j0 n# O) s) S' u
#define IDM_CUT 40007
$ `! |8 U; h, b% Q: w$ A1 C#define IDM_PASTE 400083 L4 a8 O2 V8 F# z+ o+ K3 u$ P
#define IDM_DELETE 40009* Y# U0 A( I7 [ |7 b
#define IDM_SELECTALL 40010
1 d* H1 ^6 X6 p% m. u7 g+ r#define IDM_OPTION 40011
* P) ~; ~6 m! P0 e" p#define IDM_UNDO 40012
9 D% G! j$ q+ R7 r9 M#define IDM_REDO 40013& g9 V. D4 {: q' N2 ]3 K
#define IDD_OPTIONDLG 101
/ h9 P6 {& e6 K! x# _#define IDC_BACKCOLORBOX 1000. U2 }% U. u1 i/ @1 d! |4 ]
#define IDC_TEXTCOLORBOX 1001% s% x9 ]: |( r* Z) T
#define IDR_MAINACCEL 105
" t2 F9 l7 I. r4 ?0 S$ l2 w) v @#define IDD_FINDDLG 102
) L# \# j J h* z/ u, u5 P#define IDD_GOTODLG 103
! i/ V! Z; O) j$ M* ~9 s: |; \8 q#define IDD_REPLACEDLG 104, M. c: c$ p$ w' @/ d4 l! Q
#define IDC_FINDEDIT 1000* K( a$ {8 V4 ?8 n" Q, r2 Y
#define IDC_MATCHCASE 1001 G3 u/ ^, s% n- T/ B0 P$ D
#define IDC_REPLACEEDIT 1001
# Z: W I% g9 v8 v$ \#define IDC_WHOLEWORD 1002
# {* u2 K6 s2 q' M \#define IDC_DOWN 1003
$ C. w' _2 ^- b+ F#define IDC_UP 1004# V* }$ v _6 A
#define IDC_LINENO 1005; s! d2 }' Z+ X) B( k+ W
#define IDM_FIND 40014+ o: o1 H7 {! Y" c
#define IDM_FINDNEXT 40015
$ V3 ? w& a& a, O0 x#define IDM_REPLACE 40016
5 s5 P; N- i3 k. x0 l- |#define IDM_GOTOLINE 40017
0 N/ j/ C1 x, p2 C9 v; K#define IDM_FINDPREV 40018
( {/ \1 `+ q' H$ R/ j9 _% j& s#define RichEditID 300
+ t0 V1 ~) c& h( ]
. H3 l8 w4 {3 L; Z, I/ x
, ~/ t& @0 { @! b, V: M7 K3 @1 l. U! |/ Y
TCHAR ClassName[] = _T("IczEditClass");/ X3 T$ D/ \( B# z. g
TCHAR AppName[] = _T("IczEdit version 3.0");$ k; m. y$ a7 ]
TCHAR RichEditDLL[] = _T("riched20.dll");
! V3 P2 ~3 y9 S* ?( O! XTCHAR RichEditClass[] = _T("RichEdit20A");
0 s& g9 p. |# H3 z( zTCHAR NoRichEdit[] = _T("Cannot find riched20.dll");9 o- C g9 S- a# c& c8 \/ U
TCHAR CppFilterString[] = _T("asm source code(*.asm)\0*.asm\0All Files (*.*)\0*.*\0");
: x& E6 }: [ {8 VTCHAR OpenFileFail[] = _T("Cannot open the file");' N. }! B$ Z i
TCHAR WannaSave[] = _T("The data in the control is modified. Want to save it?");
$ R# q% _) q* t3 N# }0 B! L% p1 Q: k# P! L, M6 Y$ T; j
BOOL FileOpened = FALSE;
& D; D5 b& g: G0 i w" u; H* tCOLORREF BackgroundColor = RGB(255,255,255) ;( Y" N9 `/ r, H" \9 Q$ Z
COLORREF TextColor = RGB(0,0,0);5 y) }2 y' q' h# L, E
HWND hSearch;0 j9 d& C4 F+ K8 o
HACCEL hAccel;
+ z2 l4 Y+ y( Q) S( eTCHAR FileName[256];
9 h- y) v a7 _* k/ p* \TCHAR AlternateFileName[256];
3 `( ^' P* t% X7 p( }) ^7 @- ]DWORD CustomColors[16];- `) l @1 o% c# A
HINSTANCE g_hInstance;
( b+ ^* L+ J+ f1 F9 k G4 wHMODULE hRichEdit;
0 G2 `; {; U! T3 M3 ?- _% {$ lHWND hwndRichEdit;. w" C* `" M* h4 c. H
TCHAR FindBuffer[256];6 q' b: I" ^) b" E, W
TCHAR ReplaceBuffer[256];7 o+ Z3 m. [5 F$ o3 i3 s/ G
DWORD uFlags;0 v8 |5 M e- J
FINDTEXTEX findtext; @5 d- _. E b0 b5 g" f" P
, X9 x$ E4 ~* @* H# P* _TCHAR WordFileName[] = _T("\\wordfile.txt");7 s% x6 }: x1 }. ]; i
TCHAR CppSection[] = _T("AsmSection");
# ^& E6 U/ U6 w. {' V" VTCHAR C1Key[] = _T("C1");& Q* D4 A+ s; T" M2 \3 J; ~. ~
TCHAR C2Key[] = _T("C2");. Q9 o+ x! t: F; J, i4 q# w
TCHAR C3Key[] = _T("C3");. e9 I9 D w7 {
TCHAR C4Key[] = _T("C4");, k# S5 P; ] U! D
TCHAR C5Key[] = _T("C5"); h r* b7 X' L1 ~1 w
TCHAR C6Key[] = _T("C6");& _% T" t8 G- q2 |
TCHAR C7Key[] = _T("C7");/ g- _; \$ h. O3 @
TCHAR C8Key[] = _T("C8");4 }1 {" V4 S( d! C7 i
TCHAR C9Key[] = _T("C9");
* q" w1 D/ H6 G; MTCHAR C10Key[] = _T("C10");+ }5 g; o, `1 L$ {. C
TCHAR ZeroString[] = _T("\0");
3 F/ Q, g! S% c$ aCOLORREF CppColorArray[] = {% G" J# B2 c4 w! n, F) h3 S l
RGB(0,0,0xff),RGB(0x50,0x5f,0x80),RGB(0xff,0,0),RGB(0,0x6f,0x66),( i; Z* a9 d" d! s% ~
RGB(0xf0,0x44,0),RGB(0x54,0x87,0x5f),RGB(0,0,0xff),RGB(0,0,0xff),. d! n) B! d7 d) u
RGB(0,0,0xff),RGB(0,0,0xff)
" R" A+ _8 Q" m5 c5 J: E) ^1 E5 B1 a6 [};
0 ?$ Q! N: j6 _) m2 U/ ` ?# P/ d) O- ?4 ]; q
COLORREF CommentColor = RGB(0,0x80,0x80);+ l" s0 P# z9 F6 w+ C u" j: |
DWORD CppSyntaxArray[256];
5 s. x+ K* z% A! R0 h/ sWNDPROC OldWndProc;
) Q2 ?5 ~ c8 g0 o/ ^DWORD RichEditVersion;
. {* i1 I d2 ~" A1 ^% vHANDLE hMainHeap;0 ?1 W: m7 ~, e5 F9 ?4 u
LONG CALLBACK NewRichEditProc( HWND hWnd, - T! b4 n" p' ]% [8 g" \
UINT Msg,
! g# L$ X5 O4 o8 b# J: c WPARAM wParam, / K0 W: Z( R) W( L7 C
LPARAM lParam
1 H" X7 j1 T' a1 n1 [5 z2 E6 Y. `)
# _: k# h f; L7 h{
' k6 N" u/ U' ^2 m HDC hdc;8 ~4 {/ ^6 n! D% A0 a J
HFONT hOldFont;7 a; H2 f: x4 e: j& a" O( }
DWORD FirstChar;
* J0 H/ B2 G1 x* G$ {/ T RECT rect;
+ Q; j; O$ Y1 p( C0 _ TEXTRANGE txtrange;3 n$ [# Q- M" p* n- Z. O- ]9 i
TCHAR buffer[1024 *10];6 r0 j- `" d' l+ W1 z
HRGN hRgn;2 }. C, c& B! O8 c
HRGN hOldRgn;
: M& _) h# d' u% U, c y RECT RealRect;
& z4 t- D8 Y: s) M: p1 `; J DWORD BufferSize;" m1 U! T! I. @
LPTSTR pString;" \7 ?) V- E) h. m4 H( w8 T
, p: ~) E+ w, @, `* R
switch(Msg)" z! T( ^4 u7 K f/ r, {
{8 ]% R, P0 y2 K t) B- y
case WM_PAINT: S# R* c+ V$ p8 D
{( n+ R$ P# M' {3 {% t, l0 E* s
HideCaret(hWnd);0 B6 X1 P# @4 P
int nRet = CallWindowProc(OldWndProc,hWnd,Msg,wParam,lParam);
+ ^4 T; V7 R W v( G& O3 S- }3 p$ W hdc = GetDC(hWnd);
* Z* O0 h2 O1 R1 j9 u SetBkMode(hdc,TRANSPARENT);! @- N8 H; l5 b: a
SendMessage(hWnd,EM_GETRECT,0,(LPARAM)&rect);; {6 S( V5 |* U
int nPos = SendMessage(hWnd,EM_CHARFROMPOS,0,(LPARAM)&rect);+ P' h! j% o/ t4 F% ~% ~
! d7 y: v4 J& Z& i( q3 k
int nLine = SendMessage(hWnd,EM_LINEFROMCHAR,nPos,0);: K5 G; p6 M- b K
int nIndex = SendMessage(hWnd,EM_LINEINDEX,nLine,0);
2 p- I% a7 i" x txtrange.chrg.cpMin = nIndex;* Q k4 V& w) h0 W2 z0 s8 U0 R
FirstChar = nIndex;
+ k7 x1 A& H% _2 J$ E' O int nNextPos = SendMessage(hWnd,EM_CHARFROMPOS,0,(LPARAM)&rect.right);
" w! i+ W, q/ `3 e- X txtrange.chrg.cpMax = nNextPos;* M3 W* L6 O- g0 ~
RealRect.left = rect.left;
, U# a8 P4 _1 D' Y- X RealRect.top = rect.top;: E+ z0 v, r) v' x* m8 }
RealRect.right = rect.right;+ ?' o$ M. h2 g$ p" H
RealRect.bottom = rect.bottom;" {+ r5 O2 q1 M
hRgn = CreateRectRgn(RealRect.left,RealRect.top,RealRect.right,RealRect.bottom);. `6 p( m5 j( Q2 y
hOldRgn = (HRGN)SelectObject(hdc,hRgn);
& }% i: L% t% q8 X1 B0 }$ ~ SetTextColor(hdc,CommentColor);
2 e8 l+ {' Z. n/ x& q# Q9 ~$ c2 v7 Q2 O) u
txtrange.lpstrText = buffer;# b& h7 z: F/ V& i% Z, t
BufferSize = SendMessage(hWnd,EM_GETTEXTRANGE,0,(LPARAM)&txtrange);
, U0 K0 c5 p- |- I. N7 P; [" [ pString = buffer;+ W: m! ]. d* z: `" p) H
while(pString - buffer < BufferSize)
. \0 n1 {0 Z g d8 | {
4 D9 G& I: D d6 k( j pString = strchr(pString,_T(';'));2 w/ U: S% R# ?5 w6 b
8 v& {" ~/ C' `3 c6 d7 P; F if(pString != NULL)* X- X9 f# @+ }4 e9 W" L7 y
{
3 ?) P2 I: b5 B; M0 B1 U
( B& S: z. o3 B0 N txtrange.chrg.cpMin = pString - buffer + FirstChar;
# Z* |- P' v. I2 S, y+ a4 H; s LPTSTR pTemp = strchr(pString,_T('\r'));6 g, w5 L- F E) y$ O2 A
if(pTemp != NULL)
/ [9 j: G; Y) e4 q6 U5 k6 j {
% X0 q$ X$ p0 |2 O *(pTemp) = _T('\0');6 ~" b3 U1 Y# j$ Y1 `
}
9 R k6 R. J/ \2 i; I+ s else7 X; p& V! l: |& S
pTemp = buffer + BufferSize;
! ?/ Q1 h+ K' W0 R% j 5 y7 R9 a5 H. x+ R0 ~0 B# l
txtrange.chrg.cpMax = pTemp - buffer + FirstChar;+ d3 m& U" h1 c' q; ?& h2 m
( F7 g6 N7 ~$ A& M& b
int nLen = txtrange.chrg.cpMax - txtrange.chrg.cpMin;
" I9 u7 d" e) P& t' d; B/ ?3 c# S1 B) a$ N
LPTSTR pstr = pString;
$ |/ B9 v" F3 D, u while(nLen > 0)% ~8 |& e& M8 E# z% ^
{
* B% i0 L/ l5 Q+ U if(*pstr == 9)/ J) O" }+ K& L" V- g2 ^* ^6 i g
*pstr = _T('\0');1 H' h2 F) H; o& p8 u# | P
# o, ~5 i' X' f pstr ++;
- R \# m, S4 [' T nLen --;# I% S7 [+ d% l- H7 \
}
- ^8 t8 t( Z6 D( K' c$ M3 f
8 w& x, D2 I4 |0 Z' b4 ~% |! x int nMyLen = txtrange.chrg.cpMax - txtrange.chrg.cpMin;
- S8 O' ~% y, T7 ^. T" F LPTSTR pMyStr = pString;
+ }# }5 M' m% o$ R4 l$ w+ H3 N while(nMyLen > 0): g- g9 ^) l% A2 g" t
{
! V. V1 b/ S- {: T# w! ^! g T int nstrlen = lstrlen(pMyStr);9 `5 K, K9 Z; I# i
if(*pMyStr != _T('\0')): Z5 Z9 x. H& ?3 P7 a: d0 C5 F
{
4 k" V6 O+ j) n7 G: l6 k+ { if(RichEditVersion == 3)& _5 V' e% h1 @5 E- S7 J- S4 _/ E
SendMessage(hWnd,EM_POSFROMCHAR,(WPARAM)&rect,(pMyStr - buffer + FirstChar));/ I! { U. o, q' e3 k* t
else
; k6 P0 D4 H# J9 A* h4 G {) c% _/ u; {7 z9 V- ^6 ~/ {
int nWidth = SendMessage(hWnd,EM_POSFROMCHAR,(pMyStr - buffer + FirstChar), 0);
" \8 ?4 o x! b; u9 n+ w; A: K rect.left = LOWORD(nWidth) ;4 e, O/ i- [# H9 R0 [! x- j
rect.top = HIWORD(nWidth);5 a* P0 B% E+ Z. e* W) v6 e4 ]/ C
}1 w x" H/ q0 {
5 {7 I8 h+ j9 K/ S7 c DrawText(hdc,pMyStr,-1,&rect,0);7 g7 h! a" z$ X$ r1 c+ Q
pMyStr += nstrlen;
" Q1 |' C( F/ b) G& C# [ nMyLen -= nstrlen;: Y7 ~, W! W5 E) _; T- P8 ?1 G+ l
}
+ U: X' O8 f4 s1 v else, G& p# ?( q, i: J% E0 [: E& Z
{( p" |0 y: ^) l( _, l
pMyStr++;0 S/ T& U8 x9 u* F
nMyLen--;
- o2 ]( J, l% y- u. s3 ~ }
3 n8 n( I6 M' F1 c& a9 T$ [ }
$ C% |/ @1 t9 X; ]+ L9 R1 P; }) ^, m7 ?% L! W% H" m
RtlZeroMemory(pString,(txtrange.chrg.cpMax - txtrange.chrg.cpMin));9 s3 K' O3 U: a" @; v! I7 L
& A: U+ l4 u( E! H. u a
pString += (txtrange.chrg.cpMax - txtrange.chrg.cpMin +1);
. m, s& k |0 k2 y }/ \& M9 `. [, ^$ a& t2 h: i* e( e
else+ K$ b3 N E6 J& _" A* k
break;" L% [- [) Z/ v) a
: k. r0 B6 F% G, O' ~/ t2 n }
8 c4 U" H0 N/ z5 j! w, k
3 M+ s2 j4 ]; e- x% P5 v int nMyBufferLen = BufferSize;
0 H7 {% z& {7 z LPTSTR pMyBuffer = buffer;
/ B9 D9 k4 }3 T" u' L! {8 Z! r while(nMyBufferLen > 0)' g8 H0 W9 e6 y6 V& Y; J# k
{3 ]3 K# k( N8 ]5 U. X D
9 ?! w9 Q3 C% h& c% }/ X if(*pMyBuffer == _T(' ') || *pMyBuffer == _T('\r') ||
- ]/ a6 ]7 C6 d4 U *pMyBuffer == _T('/') || *pMyBuffer == _T(',') ||
& R7 [8 X9 r! E9 i *pMyBuffer == _T('|') || *pMyBuffer == _T('+') ||& D3 L8 j5 X0 ]% q% Q3 _
*pMyBuffer == _T('-') || *pMyBuffer == _T('*') ||
: y% d1 z% K% \" u3 o4 g. ] *pMyBuffer == _T('&') || *pMyBuffer == _T('<') ||. b' I% ]! ]; h& @
*pMyBuffer == _T('>') || *pMyBuffer == _T('=') ||0 x/ }/ T7 Q& Y4 g2 L& U2 {
*pMyBuffer == _T('(') || *pMyBuffer == _T(')') ||2 z. h$ D# s2 V0 ^$ P
*pMyBuffer == _T('{') || *pMyBuffer == _T('}') ||
. D7 |( E& A8 z: n* H' `: O *pMyBuffer == _T('[') || *pMyBuffer == _T(']') ||' _' D0 g8 _5 L
*pMyBuffer == _T('^') || *pMyBuffer == _T(':') ||( I; a& M Q; C3 v4 @, H( }
*pMyBuffer == 9 )
' e z) ]. K, p$ ? {- Y: t- @& D$ x3 z
*pMyBuffer = _T('\0');
1 G# ~4 }- F- O ~/ T } }2 I0 I4 x, s5 p0 C
pMyBuffer++; n! ~) h4 ^( |2 R% |
nMyBufferLen --;, `9 S) Y4 D! L# M, c8 f; ]/ F
}) k R1 D& Q! B6 [) d( t9 Q4 p
k5 Q' j1 M) K6 ^4 Z int nBuffLen = BufferSize;# U5 m9 k) x+ _* t* }3 c( f
LPTSTR pMyBuff = buffer;
+ w j" m! H! P. ~: G! `0 ? while(nBuffLen > 0)
& l0 w4 V- V H* e* O- ]* V3 o {
; \3 M5 m% M, D$ }! t3 `/ D; o if(*pMyBuff != 0)0 E( F8 J, N5 J
{, ]8 _1 G: K- w, ^2 I( P5 N z
int nlen1 = lstrlen(pMyBuff);/ e0 _ ]# G( ?4 u+ q% q, y
CHAR cChar = *pMyBuff;* I) D. N6 V: j+ e- c8 O6 B
if(cChar >= _T('A') && cChar <= _T('Z'))/ d0 X0 v) {" o* i
{
& t* ^, C5 y) x& p cChar -= _T('A');4 P" r U" G2 g( ?0 g* A; F
cChar += _T('a');
7 M M: X& J) b! ^( ` }
5 d$ y. r6 T3 w) k* E. m6 N
6 j5 a2 D; {1 k% g2 c- G4 w if(CppSyntaxArray[cChar] != NULL)% ]- ?6 ]% M% x
{
: l) X2 ?' j$ T3 }: x+ `6 p4 g WORDINFO *pWdInfo = (WORDINFO *)CppSyntaxArray[cChar];
$ B- n2 T4 [/ C$ U4 W while(pWdInfo != NULL)
]' k& N( g) \+ B8 `+ ?# K {
" F$ l' _: N: m7 o if(nlen1 == pWdInfo->WordLen)3 q: K7 i! m5 B6 R) a
{
. F& o5 N- g9 N. s! P* b7 A if(lstrcmpi(pWdInfo->pszWord,pMyBuff) == 0). `$ ^# E7 k0 P: c+ `( s
{4 @5 {* U7 a) h H. p
if(RichEditVersion == 3)
& ?2 b; ]6 E/ E {
5 `7 Q. z6 {) `+ h SendMessage(hWnd,EM_POSFROMCHAR,(WPARAM)&rect,(pMyBuff - buffer + FirstChar));& j5 G0 l- m6 b8 |
}
1 f0 z: J+ q, H- R( v2 |( E* X else" z. @& i) }4 L+ ^ z
{$ z: U! a7 _, D4 k
int nDim = SendMessage(hWnd,EM_POSFROMCHAR,(pMyBuff - buffer + FirstChar),0);; Z, s ?0 u) j. d5 i
rect.left = LOWORD(nDim );6 G$ b' I- _. @3 |; ]( S% G
rect.top = HIWORD(nDim);
% w6 Q9 y5 L7 b$ [ ? }6 I1 s5 O R* E
* L P4 `4 C6 L
SetTextColor(hdc,pWdInfo->Color);- Z9 d! x: ]# o8 A; ?( R
DrawText(hdc,pMyBuff,-1,&rect,0);
) t/ K+ o q: N l break;
9 `) h, K1 w/ T) L6 v1 }9 ] }- @9 A% [: G3 l; W
}! }1 F7 B I+ p; K6 X% W
pWdInfo = pWdInfo->NextLink;
6 Y1 m/ ^" S" }& S7 Y6 e2 R }
; u, p7 n" r2 S% P }
6 k. |8 h$ z7 Z0 a( z
1 Q+ c4 L# o* q, E% V9 {( U pMyBuff += nlen1;1 N, Y: T" L; h( y3 y
nBuffLen -= nlen1;
' t5 `3 ]1 ^: ]% ]' e1 ^ }0 S G, q E# d) g; d8 I1 |
else/ F0 Y6 y" Y- t. }+ N
{
l% ]# p" m5 D: s pMyBuff++;0 n3 g3 R+ T: z K% ] Q8 X/ d$ v, E9 n8 w
nBuffLen--;4 T/ j7 _! |$ R. u
}
$ K8 N3 i( c9 f$ e m9 v }
: Z- M8 S4 v- H$ B1 k8 S/ [5 A3 j( |& Y- n: `& R
SelectObject(hdc,hOldRgn);( h0 F- i' K1 y, R% o- H$ T
DeleteObject(hRgn);
6 R6 F! z; O% f) X& g2 r SelectObject(hdc,hOldFont);: E( n+ g. q( q( q3 R
ReleaseDC(hWnd,hdc);
" \$ ]- j1 c7 @/ ? i9 E3 H ShowCaret(hWnd);
$ {( m8 K, Z8 y8 s3 ` return nRet;( g) @1 g6 q" b; ?4 \* I
0 Q/ s5 ^; i' B5 L% X. |
}2 d4 e E( P$ N( ?% f; u
break;
5 j5 c6 n, U. u6 h6 s case WM_CLOSE:
! U! @5 Y5 u% }- X9 }) } SetWindowLong(hWnd,GWL_WNDPROC,(long)OldWndProc);
4 F2 t* I% k& Z! Y, f break;4 ?7 n: u2 `6 ^. H
default:+ g8 t% Y, q/ V
return CallWindowProc(OldWndProc,hWnd,Msg,wParam,lParam);
( B; n* J: j8 v& l }
. z; k" s* |6 t0 R+ J1 L# m# @. J/ f' z# S
return 0;
9 E% I% ^/ O/ ^& m9 v& s, [( b} |