原文:http://hi.baidu.com/combojiang/blog/item/6e65d6f322f81bce0a46e0c0.html
' V( T9 F! m" i. k% R$ X$ v/ _ ' n; j, f4 P; z* h% C; I }2 D; T8 a7 b
在读这篇教程之前先提醒你,这是一个复杂的主题:不适合初学者。这是最后一篇RichEdit 控件教程。
2 ~, c1 B; _: x9 H* W1 f: D6 h. B
理论: / I: q/ n8 W0 h% a" k- }
语法高亮显示对那些编写文本编辑器的人来说是一个热点主题。最好的解决方法是编写一个定制的Edit控件,这也是很多商业软件所使用的方法。然而,对于那些没什么时间来编写这么一个控件的人来说,次策就是改写现有的控件使之符合我们的需要。
* P7 T, C3 O8 h6 F$ q[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]控件中的插入点位置处理也有一点问题。/ d# ^* z" M5 ~) H% d
[size=-1]通过上面的讨论,你可以看到使用 [size=-1]EM_SETCHARFORMAT [size=-1]是一个错误的选择,我会给你演示 [size=-1]"[size=-1]相当正确[size=-1]" [size=-1]的选择。5 b( _ i* N, Z$ J/ T( h
[size=-1]我现在使用的方法是[size=-1]“[size=-1]即时语法高亮[size=-1]”[size=-1],我只高亮显示可见部分的正文。因此高亮显示的速度跟文件的大小根本是无关的。无论是多大的文件,在某一时刻只有一小部分是可见的。
, A, i2 L& D0 ~[size=-1]怎么样实现?答案很简单:
2 ^2 {: R ]: P+ ?* j9 \- [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]之后,我们将要高亮显示的词用不同的颜色来覆盖掉。
0 ? i/ v2 _6 p6 L% K2 Z [size=-1]当然了,路也不是这么容易走的:仍然有两个次要的问题需要矫正,不过上面的方法工作起来很好。显示速度令人很满意。
6 N$ S S X1 M, L[size=-1]现在让我们集中在细节上。子类化处理是很简单的,不需要很多注意力。真正复杂的部分是:我们必须找到一个快速的方法来搜索那些需要高亮的词。更复杂的那些在某个注释块里的 不 需要高亮显示的词。 8 }9 F3 Y ]; ]+ N; Y) o
[size=-1]我使用的方法可能不是最好的,但是它工作的很好。我敢肯定你可以找到更快的方法。不管怎么说,先看看我下面的方法:8 t, Z% w4 O F. y2 B
- [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]结构。) ~! |# b3 ?) Q" H# M6 H: @
typedef struct WORDINFO5 C1 U4 e- m0 G* o" A& q5 t& X
{% C: g9 W; U6 l% W3 F# [
DWORD WordLen; //词的长度,用来快速比较
# x' ^/ q2 a e3 T LPTSTR pszWord; //词的指针; P# K9 ^$ [) Z2 h3 l: L5 ?
COLORREF Color; //颜色值! w, a: ]1 J: X7 G8 G
WORDINFO * NextLink; //下一个 WORDINFO 结构
I; ?" i& L, }3 C6 a; y b}WORDINFO;
Y% q1 Q1 E1 Q' G- S, r[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 ?, X$ s3 y; a! n1 u8 ^' Z
- [size=-1]链表的内存是从堆([size=-1]heap)[size=-1]中分配的,速度快,容易清除,也就是说根本不用清楚。2 q2 i. s! b" }5 h
[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]中的元素的值,这样所有使用那种颜色高亮的词就立刻使用新颜色显示。6 j& P+ j. j6 }: D+ ^- b( c
例子:见光盘FirstWindow33#include "Windows.h"
; J6 }0 Y" Z% |9 ]#include "tchar.h"
( z6 ]+ E8 o8 A, O* y+ m2 ?! b% X#include "Richedit.h"2 C5 {5 I3 F0 m* I9 q. j4 \4 |* F
#include "shlwapi.h"2 f5 p; |& U, P% g' T6 K
#pragma comment(lib,"shlwapi.lib")* c; D R4 n! a: N- v
7 z/ \! u' l, d; M$ `6 m% q- mtypedef struct WORDINFO
. w- G% Y9 F2 ?7 o# j6 G{4 J. I2 D# O7 U/ X3 U
DWORD WordLen; //the length of the word: used as a quick comparison
& J! z( b% E8 s; o) O LPTSTR pszWord; //pointer to the word" {# G& {5 `# g' V
COLORREF Color; //point to the dword that contains the color used to hilite the word9 l, X3 z+ [9 Z8 x
WORDINFO * NextLink; //point to the next WORDINFO structure
7 k5 M! p$ V. E}WORDINFO;. B/ {: W1 y& C' `- l& L# ?( E
; [ q* d5 e7 g
#define IDR_MAINMENU 101
, R% F( u; G U5 Z& v#define IDM_OPEN 40001
# \# ?: Q3 M# x2 W7 S% y& s#define IDM_SAVE 40002
. K& R' ]" m' J8 R, H* z, V#define IDM_CLOSE 40003! D- D, c2 e& p+ _ p+ n) m
#define IDM_SAVEAS 40004
) {6 S! p" T# x9 r#define IDM_EXIT 40005
- A! @8 E$ \9 I9 g#define IDM_COPY 40006 m N, u \& F9 M7 j" `- q9 W
#define IDM_CUT 40007/ P5 z" `. M& Q7 V% q, V4 ~; v
#define IDM_PASTE 40008/ z; k, n$ |- x. ]# |/ g
#define IDM_DELETE 40009$ e5 L$ f; j3 v: p/ b' v
#define IDM_SELECTALL 40010
, G1 Q% F+ [# O, V0 Y#define IDM_OPTION 40011% x0 ` V" x6 y5 ]
#define IDM_UNDO 40012& u4 S6 J; k, I- C/ x
#define IDM_REDO 40013
9 {% v6 s& N. a#define IDD_OPTIONDLG 101
6 v4 `1 \: u0 f#define IDC_BACKCOLORBOX 1000" L, C3 Q) T" b2 `
#define IDC_TEXTCOLORBOX 10014 m3 P* ^ R7 L7 Y
#define IDR_MAINACCEL 105! K2 r: w( _% Y% S6 ]. B6 V q7 r
#define IDD_FINDDLG 102
( R' d) e e' y#define IDD_GOTODLG 103* l9 ~ u3 X3 \) i8 F7 t
#define IDD_REPLACEDLG 1043 W8 {! f" i5 ~% }+ @0 P
#define IDC_FINDEDIT 1000
. A" f" ` e7 l% D- M1 j#define IDC_MATCHCASE 10017 X6 `) N R8 [3 _' W5 K: n2 S: m
#define IDC_REPLACEEDIT 1001
( {; v; y+ {4 q- q0 l2 i#define IDC_WHOLEWORD 10026 ~4 Z* { ]+ N( T7 T( i
#define IDC_DOWN 10039 B4 O! B2 l2 F! u5 w
#define IDC_UP 1004
( ~! w, ^) ~) }( Z+ b#define IDC_LINENO 1005
6 V( y- g+ x1 X" X: v#define IDM_FIND 40014% k9 n1 z+ f" x6 z# |" y
#define IDM_FINDNEXT 40015* d' A7 @5 ?3 M& t
#define IDM_REPLACE 40016% O. G# A* c" C+ K2 a
#define IDM_GOTOLINE 40017
+ n+ Z, {' H$ V1 m0 R, @. [#define IDM_FINDPREV 40018# J( |, K1 Z3 o' E/ Q$ h( A
#define RichEditID 300+ [% x& v: X, v' K
# L8 s' s9 X% i, ^( L- m
1 l2 U/ H: |/ T! } G& m; Y$ [5 n) d
TCHAR ClassName[] = _T("IczEditClass");, a" M2 n9 O2 X2 n' X/ A
TCHAR AppName[] = _T("IczEdit version 3.0");1 T; d! g0 I$ D" y y% f' V2 F
TCHAR RichEditDLL[] = _T("riched20.dll");
% E0 i, m# [0 m! }% Y2 ^4 Y3 HTCHAR RichEditClass[] = _T("RichEdit20A");
& @* W2 B7 Y8 _' C" _2 vTCHAR NoRichEdit[] = _T("Cannot find riched20.dll");
) Y2 D/ s& k; pTCHAR CppFilterString[] = _T("asm source code(*.asm)\0*.asm\0All Files (*.*)\0*.*\0");
5 Y/ a7 @# p) I w8 I8 iTCHAR OpenFileFail[] = _T("Cannot open the file");% J7 z) n8 S5 s/ t \* K9 q
TCHAR WannaSave[] = _T("The data in the control is modified. Want to save it?");
1 W* y9 n, {9 W, q4 n. V: [- {* T
, a7 X1 U( _# m: SBOOL FileOpened = FALSE;5 \; ^) i$ K4 S1 O+ V1 V
COLORREF BackgroundColor = RGB(255,255,255) ;
9 E" _( h9 s6 |6 O, cCOLORREF TextColor = RGB(0,0,0);
5 e+ s: J1 E ]- RHWND hSearch;' _' j; D7 Z- M
HACCEL hAccel;
; |) g; \. V( _# Q- p7 p. u/ [TCHAR FileName[256];* d8 s7 C: f% y0 D! i# x* g5 z
TCHAR AlternateFileName[256];
1 |$ |/ P, N! e, ?DWORD CustomColors[16];
, b* |$ h" T: T: FHINSTANCE g_hInstance;; K. O3 ~3 B7 k9 V* B/ C
HMODULE hRichEdit;) f' y4 a8 T' T# I: Y
HWND hwndRichEdit;
% B& i: ~: a" o3 ` [TCHAR FindBuffer[256];
- h8 {) o/ @6 \% i" D+ }# Z- U" ]TCHAR ReplaceBuffer[256];
2 t3 Q! F$ N. zDWORD uFlags;2 I( b0 T/ k7 x! {% }
FINDTEXTEX findtext;" E6 [, C' O) M8 n, P
; S3 t3 z7 w+ l6 w3 B0 MTCHAR WordFileName[] = _T("\\wordfile.txt");
3 b0 ]5 s& b) D) m5 F fTCHAR CppSection[] = _T("AsmSection");$ f& l; u. v9 w& V6 H% |
TCHAR C1Key[] = _T("C1");- T& E+ G5 g/ e
TCHAR C2Key[] = _T("C2");
. T* t8 g- h0 e, uTCHAR C3Key[] = _T("C3");
, a' C4 L2 J4 ?$ Q& R* H) KTCHAR C4Key[] = _T("C4");
; d) b- d, x; ?* P( B* CTCHAR C5Key[] = _T("C5");( O+ T; W* x1 D4 o& L3 e' t `) L
TCHAR C6Key[] = _T("C6");5 q2 j8 Y* d. c" o5 R' L
TCHAR C7Key[] = _T("C7");/ O6 \" G( \0 @2 G7 n. W0 R
TCHAR C8Key[] = _T("C8");
8 k) F3 Q3 x/ H9 H' uTCHAR C9Key[] = _T("C9");
! j5 A: a/ M9 s5 bTCHAR C10Key[] = _T("C10");/ W/ @$ f0 R' O7 c& c) G1 ~
TCHAR ZeroString[] = _T("\0");( L6 Q/ {2 H, M7 ^' w5 s
COLORREF CppColorArray[] = {. r! Z. j" o9 Z! D* J
RGB(0,0,0xff),RGB(0x50,0x5f,0x80),RGB(0xff,0,0),RGB(0,0x6f,0x66),, E ~6 L8 L3 ?
RGB(0xf0,0x44,0),RGB(0x54,0x87,0x5f),RGB(0,0,0xff),RGB(0,0,0xff),/ p) \5 x- b2 z/ g8 i4 A- }- H. j* e
RGB(0,0,0xff),RGB(0,0,0xff)( P6 g# {1 o1 n2 m
};2 {9 _% T7 v1 G" S
5 M9 W1 e; X/ ?: A5 h1 A: V! N- B* t3 tCOLORREF CommentColor = RGB(0,0x80,0x80);+ ^4 g/ \% c5 k2 Z5 U6 k
DWORD CppSyntaxArray[256];2 G8 W) y- c L- u, D' }
WNDPROC OldWndProc;
7 y% T1 s ]& p* V) [8 }7 ~ oDWORD RichEditVersion;
3 D4 t( a; P# HHANDLE hMainHeap;; D }5 D; w L8 o: Q) n+ d
LONG CALLBACK NewRichEditProc( HWND hWnd,
* x) B3 s* g" }/ s- G, D0 f, Y UINT Msg,
; |9 J( n* u# U3 s; _ WPARAM wParam, , w% Z' M% X6 s, M, L0 g& G
LPARAM lParam / s1 e8 s- E' b. }6 C3 g5 w
)' v7 D4 l7 |) T: M
{; `' n- |+ _4 @; D2 K4 J+ L9 e. i! P
HDC hdc;6 C k' H L$ u3 c0 }1 s
HFONT hOldFont;
& }( J# K( L4 p" r6 l* G DWORD FirstChar;
/ |# s9 u/ B; Y: S7 E) I7 ^ RECT rect;
# E+ w: J% t" n/ T5 {$ \: H TEXTRANGE txtrange;
/ Z) ^/ T5 h) M: ? TCHAR buffer[1024 *10];/ t2 K. J1 ~! h. X: w: I- g; P% ^$ t
HRGN hRgn;; @* ?2 Q, F. Y1 R
HRGN hOldRgn;/ V! h: Y/ F: K" G
RECT RealRect;
. v4 c9 N) C, g# G3 s DWORD BufferSize;
5 U5 v7 \# p! A2 s, u' y& S LPTSTR pString;* U5 W- t, h0 W, h
# s2 H" H2 B+ \( J) W( X
switch(Msg)
- S' p* K3 _9 M {
: Q# h9 N! p7 C* |* g7 E8 F case WM_PAINT:
; U2 `/ }; k' E: f0 R, q6 M+ R {/ G2 }/ C5 Z4 W' ]" x' N. J
HideCaret(hWnd);2 u/ y* q3 e5 w% K4 P) h
int nRet = CallWindowProc(OldWndProc,hWnd,Msg,wParam,lParam);
- w9 D! W. f' ]6 l7 I6 g( c! n hdc = GetDC(hWnd);- i% F. h" n2 U+ C* }
SetBkMode(hdc,TRANSPARENT);# {9 l l, K& o4 L
SendMessage(hWnd,EM_GETRECT,0,(LPARAM)&rect);
9 u+ o* a i0 T int nPos = SendMessage(hWnd,EM_CHARFROMPOS,0,(LPARAM)&rect);
5 l+ H0 q! t: X$ r- C: L+ Z7 B# n+ Y
int nLine = SendMessage(hWnd,EM_LINEFROMCHAR,nPos,0);
) W0 p R4 `" B% W int nIndex = SendMessage(hWnd,EM_LINEINDEX,nLine,0); ?7 ?* Y6 Q3 H3 \
txtrange.chrg.cpMin = nIndex;
1 K! w3 v; z. h4 H FirstChar = nIndex;
; j7 ], h8 Z+ n int nNextPos = SendMessage(hWnd,EM_CHARFROMPOS,0,(LPARAM)&rect.right);
$ R! @+ m. G! W' D( [$ Q txtrange.chrg.cpMax = nNextPos;
Y5 B3 `, n7 Y! p G; z2 O8 W; a RealRect.left = rect.left;8 V* j% N) `6 q0 P' t$ F; c5 v
RealRect.top = rect.top;* p$ W2 L- K9 @2 u# ~
RealRect.right = rect.right;
4 K' h F5 l) b; h4 s RealRect.bottom = rect.bottom;
3 G) ^' I6 m- Z" l hRgn = CreateRectRgn(RealRect.left,RealRect.top,RealRect.right,RealRect.bottom);
* w% [( b! t. d0 L& c2 n hOldRgn = (HRGN)SelectObject(hdc,hRgn);
3 Q* p! l# `( t; I' m SetTextColor(hdc,CommentColor);
- @ x7 i; Y% i
, {" ?+ ]: @( l2 s' y txtrange.lpstrText = buffer;; ~* b9 P) R7 Y& Z
BufferSize = SendMessage(hWnd,EM_GETTEXTRANGE,0,(LPARAM)&txtrange);
4 X3 T) j( ]* Q+ O6 Z. p7 Q+ a pString = buffer;# d( N5 } g/ P/ e5 n
while(pString - buffer < BufferSize)7 p N( a( @0 G, W/ E
{
$ }5 W% k7 X. D$ L3 K `& l pString = strchr(pString,_T(';'));
" l9 B4 w2 J7 M
9 y V' P0 }' R. k" u if(pString != NULL)
4 Y* B# M% x2 q; c {
6 \# r% `) `, W! Z4 N5 T* c8 N% _ . O; w% \/ r" v( X8 c
txtrange.chrg.cpMin = pString - buffer + FirstChar;
& V. M; |+ K$ T! j' X. @ LPTSTR pTemp = strchr(pString,_T('\r'));
3 s- B* d4 V5 A4 J* S' o1 C if(pTemp != NULL)
) [5 c' D# G V+ B { ' d# w# K, @1 x
*(pTemp) = _T('\0');5 y. I8 B$ m( b% d% Y
}
B# I3 C" J0 P else- @/ Q; D0 z; N+ H% a& z
pTemp = buffer + BufferSize;
" k3 A2 s7 k# X# {1 E( S 7 H# }9 S& Y( o6 |$ j% h6 l+ {! u
txtrange.chrg.cpMax = pTemp - buffer + FirstChar;
) u) j% B4 V/ g: f7 b
; Q2 Q, o! e- L, h7 M: u int nLen = txtrange.chrg.cpMax - txtrange.chrg.cpMin;; M5 \1 T& X. Q' p. `& c
) S/ K0 x7 M& Q1 W9 x0 `: w LPTSTR pstr = pString;6 C4 T9 U) W7 m6 e6 h+ n9 b
while(nLen > 0)
) l9 g% z- ?) ~ {; R' N1 e. {/ m
if(*pstr == 9)
; U1 X# {7 Q* ^7 R: E *pstr = _T('\0');
( K$ J% f% J- t . N# ]1 B# u$ a
pstr ++;. ?* v$ e( ?2 y
nLen --;
) Q8 ~0 n# Q$ S" }/ W- F/ d }# F: c, V8 w0 Q c6 Z& f& s
2 X# I, H a% _- z& z
int nMyLen = txtrange.chrg.cpMax - txtrange.chrg.cpMin;. r5 r" D8 K1 B2 w4 u" g
LPTSTR pMyStr = pString;
: r5 N- D( L0 y, M* v+ I while(nMyLen > 0): L K$ _( E' b" m- i
{
' ]- k& n4 u6 D, M! x( R m: @ int nstrlen = lstrlen(pMyStr);
" U5 }/ G9 Z- Q; b# S( C if(*pMyStr != _T('\0'))
% g6 x4 t A2 ]& r! D5 B {! a. @/ d4 ^! [6 V9 E$ K
if(RichEditVersion == 3)
8 I) A6 b' O5 o' |- y# A& q( Z SendMessage(hWnd,EM_POSFROMCHAR,(WPARAM)&rect,(pMyStr - buffer + FirstChar));( H7 m$ @8 _, n2 B# i0 f% \' X
else
A% M# N1 n+ Y" R2 v {+ X, M) \; _) O. F. |
int nWidth = SendMessage(hWnd,EM_POSFROMCHAR,(pMyStr - buffer + FirstChar), 0); w+ @) o h$ T8 w; z
rect.left = LOWORD(nWidth) ;5 g# X. T, G+ i' C/ N4 n+ H
rect.top = HIWORD(nWidth);5 a3 @% E/ b' K1 W
}
+ m- D- A/ C* a5 ]" {' j) m# W0 a: N7 k3 F
DrawText(hdc,pMyStr,-1,&rect,0);) F8 U/ ?5 N. K4 K4 {& \& W5 o- z
pMyStr += nstrlen;4 \! D. |9 a/ e( p' x3 _
nMyLen -= nstrlen;
8 c( x3 G0 E) p. Z! S! y }5 s3 k$ x* ^/ K' ~
else
: Z& e& V) }, G6 `8 K {
2 {$ N; ], N9 Y$ I$ |/ Z6 ` pMyStr++;
( [/ g6 E. E& V8 W; W1 T nMyLen--;& Z/ h: s! {* f3 A% i
}
, }! P: Y# H$ [4 r }
# n4 V6 l" i+ a6 |6 ^3 ~0 p( B( H# t1 ]& q) X B& [1 i8 L+ \
RtlZeroMemory(pString,(txtrange.chrg.cpMax - txtrange.chrg.cpMin));
! P: V& z& ?/ e! m3 ^: o $ }4 z( T0 [+ o3 h! W( Q: t: \9 N! l
pString += (txtrange.chrg.cpMax - txtrange.chrg.cpMin +1);# ~1 n. F6 G7 v% O1 G- t
}
D+ ], R( Z* T4 K1 p! v. I else
* x- \/ w8 q. ?" a' j break;
+ V* e- F" r4 z3 P7 ? - \' V6 k$ B: k6 s$ { M' A
} S k/ P5 {, o" q
# g% x, @# K4 L0 s& e4 h1 W7 I# K int nMyBufferLen = BufferSize;
]8 v+ ~1 P, e" Q1 c' `% ] LPTSTR pMyBuffer = buffer;
- Q( t$ R9 G# P' P( d9 u4 q* }2 b while(nMyBufferLen > 0)
( g" p1 ]! [! w {
: u% B* j, ^1 h' n
9 g+ \# }6 T! t* o if(*pMyBuffer == _T(' ') || *pMyBuffer == _T('\r') ||
9 ^, V a3 }% D *pMyBuffer == _T('/') || *pMyBuffer == _T(',') ||* f: O* K: _* }+ M$ u9 m
*pMyBuffer == _T('|') || *pMyBuffer == _T('+') ||$ V. J0 v6 q; X9 j: L: `
*pMyBuffer == _T('-') || *pMyBuffer == _T('*') ||# d3 A; h# \! x6 Y9 A- J9 G
*pMyBuffer == _T('&') || *pMyBuffer == _T('<') ||
5 m! f' @3 s6 n4 `3 `- l" y *pMyBuffer == _T('>') || *pMyBuffer == _T('=') ||
$ F9 [8 [- o/ e# \" m *pMyBuffer == _T('(') || *pMyBuffer == _T(')') ||
' ?* A4 o0 M( ]4 {2 ~. U) @ *pMyBuffer == _T('{') || *pMyBuffer == _T('}') ||
. ^. g. Q4 B( U *pMyBuffer == _T('[') || *pMyBuffer == _T(']') ||# Y7 B0 y' @2 ^$ K3 d
*pMyBuffer == _T('^') || *pMyBuffer == _T(':') ||" m1 M5 ]) `( Q, h. l+ b
*pMyBuffer == 9 )
$ f# S& o7 \: ]; { {3 ~8 w2 T e' k4 F k1 i
*pMyBuffer = _T('\0');
. o( ~8 P; z+ Q; F) s0 H3 t4 x }
8 N& A) P/ b2 K M/ n5 u pMyBuffer++;3 I- J6 x+ i9 _, x3 q' B L
nMyBufferLen --; R y: m, W/ ?( O: ? n- J
}
' b1 N8 t# [0 ^$ S' \: e2 M$ H6 H/ G
int nBuffLen = BufferSize;4 }, P o; [* n, f- {$ H4 h
LPTSTR pMyBuff = buffer;& q1 ?( a1 k P
while(nBuffLen > 0)& ?% H+ ]2 J# Y, q5 v
{
; J1 v j: W6 B& ]. Q6 f& A9 V' v if(*pMyBuff != 0)
8 I/ \0 i9 d# J: @& @& C: X {
' N: R8 J% Y" { int nlen1 = lstrlen(pMyBuff);
: [9 y$ m, W+ s CHAR cChar = *pMyBuff;
2 ]9 X4 G! Z6 b5 l if(cChar >= _T('A') && cChar <= _T('Z'))+ N) Z$ d% L. e8 C5 P% w9 z
{" x2 _9 k* W4 h8 `8 g
cChar -= _T('A');% u- d$ L# M C% T0 f7 T. ^
cChar += _T('a');3 v2 q2 U: @& P8 N) O
}
j8 S) u; O9 a2 n- K7 T . M9 Z+ L$ Z: Z3 L
if(CppSyntaxArray[cChar] != NULL)) g5 Z6 B X+ U& b3 `7 X
{
: A9 {& k9 c. j$ ~ WORDINFO *pWdInfo = (WORDINFO *)CppSyntaxArray[cChar];9 W4 n) e" o1 \1 p
while(pWdInfo != NULL)2 k2 m( j1 C6 b4 a5 c" E+ q
{
# G) U5 a3 o/ |+ d, m1 j0 d if(nlen1 == pWdInfo->WordLen)
: U! }* ~) H( P# A, I4 H {$ j, D& H a" u" R& [( r
if(lstrcmpi(pWdInfo->pszWord,pMyBuff) == 0) y# Z" [# L( H
{
$ @8 z: V8 b, e1 N) d8 J( z if(RichEditVersion == 3)
D. W( }8 R Y3 T; z {4 X8 b' Z f6 B+ F
SendMessage(hWnd,EM_POSFROMCHAR,(WPARAM)&rect,(pMyBuff - buffer + FirstChar));
& i' W4 [' ^0 m$ Z# } }8 ~* x6 b1 l3 B; F# Y# ^2 c
else
$ ?- B1 |% {( E- o% t, c- K {4 ^1 {9 D* @7 O2 m+ N1 k& g
int nDim = SendMessage(hWnd,EM_POSFROMCHAR,(pMyBuff - buffer + FirstChar),0);
/ v+ u8 \5 h3 `# T. x |; d rect.left = LOWORD(nDim );
3 b* A2 b3 m/ ^5 H" R8 [# `& P" c rect.top = HIWORD(nDim);
# J, H; G, {& I/ @/ l: c }
. m% o2 T _, x- t6 h8 D3 _, w L4 B: Z" c4 ?! K
SetTextColor(hdc,pWdInfo->Color);6 I! R0 O( x! i+ y4 s P
DrawText(hdc,pMyBuff,-1,&rect,0);$ g8 x @2 e# H2 A7 K& q
break;; @3 K, q+ k) K) {& K
}
, E4 N: r' u2 A) ~2 p8 c$ x }$ ^$ c& r8 o, t6 q" Q( \' }/ J1 j, [
pWdInfo = pWdInfo->NextLink;
6 |5 h6 i% H5 ~: h1 F' _ }7 Z' Y0 j5 X7 i
}
! O7 T; a# b4 i0 i$ |. x) N; G3 Q
" S- E7 k' F, {! X7 _' L1 L( k: v7 v pMyBuff += nlen1;% X: e9 e! V5 H/ y* D- z
nBuffLen -= nlen1;
1 T, L n. j; @! E1 k }0 w% v) t* j# n& l( k
else
, x" A3 ~ ]. Q' A$ k {
2 b4 Y& t1 u' P8 z& y9 J pMyBuff++;
# ?0 |& p4 G8 S3 L* v+ O nBuffLen--;2 U+ k2 z S, W' G1 V! y
}
( s8 q+ s @) @0 v% x }6 W5 K- O9 I* z
3 D. P. M8 d1 }# U9 r, \' W SelectObject(hdc,hOldRgn);
2 ]5 ]& c7 M" [' m% b DeleteObject(hRgn);7 n' L) Z0 S( `+ V
SelectObject(hdc,hOldFont);# H8 Z0 j2 f4 e G' E# R. s& a
ReleaseDC(hWnd,hdc);
4 d8 J6 ^1 L1 ~ ShowCaret(hWnd); h4 {% [: |/ A6 t/ A
return nRet;3 w y3 C! T& u" b" _
' z, f$ W }$ ^9 z2 r }: u g9 ~* h: [+ J" g2 [( B+ r
break;! @- n4 V! [! ~# ^
case WM_CLOSE:, L4 L, t& Z) R% K/ u# c" o
SetWindowLong(hWnd,GWL_WNDPROC,(long)OldWndProc);! O7 o0 X; Y: `9 i" G
break;- T- i Z/ M: B- Q2 }
default:
) j+ `0 l% {. x4 R5 N5 x$ |) x return CallWindowProc(OldWndProc,hWnd,Msg,wParam,lParam);" v4 K1 M8 X& p7 r* {
}
B7 f0 A, s$ ^$ W1 w( h
7 s' Z5 R H2 f3 x u return 0;9 m- {; B8 L, h( D/ o* p5 H* ^
} |