原文:http://hi.baidu.com/combojiang/blog/item/6e65d6f322f81bce0a46e0c0.html; W& k5 w' m; H% w+ V
6 n: Q/ A1 q- a: ]0 G1 U在读这篇教程之前先提醒你,这是一个复杂的主题:不适合初学者。这是最后一篇RichEdit 控件教程。
+ j5 \' `( u$ z2 `' U* A5 `' H9 w! u1 @/ ^ V5 U0 z
理论:
I: b6 X2 z6 W9 | i语法高亮显示对那些编写文本编辑器的人来说是一个热点主题。最好的解决方法是编写一个定制的Edit控件,这也是很多商业软件所使用的方法。然而,对于那些没什么时间来编写这么一个控件的人来说,次策就是改写现有的控件使之符合我们的需要。 - K2 G; n- ^1 O+ v
[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]控件中的插入点位置处理也有一点问题。8 k2 ~- i- [! ?+ i
[size=-1]通过上面的讨论,你可以看到使用 [size=-1]EM_SETCHARFORMAT [size=-1]是一个错误的选择,我会给你演示 [size=-1]"[size=-1]相当正确[size=-1]" [size=-1]的选择。) |7 m7 m6 ]) u/ G7 N2 j; P
[size=-1]我现在使用的方法是[size=-1]“[size=-1]即时语法高亮[size=-1]”[size=-1],我只高亮显示可见部分的正文。因此高亮显示的速度跟文件的大小根本是无关的。无论是多大的文件,在某一时刻只有一小部分是可见的。
0 r5 W. c) _- m9 U4 f6 f[size=-1]怎么样实现?答案很简单:
7 G( m$ @1 I d2 {* G) e3 i, r- [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]之后,我们将要高亮显示的词用不同的颜色来覆盖掉。/ | a. A3 a: i" D
[size=-1]当然了,路也不是这么容易走的:仍然有两个次要的问题需要矫正,不过上面的方法工作起来很好。显示速度令人很满意。
' C6 |, p/ O5 { ]' R7 N4 f[size=-1]现在让我们集中在细节上。子类化处理是很简单的,不需要很多注意力。真正复杂的部分是:我们必须找到一个快速的方法来搜索那些需要高亮的词。更复杂的那些在某个注释块里的 不 需要高亮显示的词。 ( w7 k6 Z8 S+ X3 c' ~, M. H5 m) Q
[size=-1]我使用的方法可能不是最好的,但是它工作的很好。我敢肯定你可以找到更快的方法。不管怎么说,先看看我下面的方法:$ j9 s. K1 c R. N6 w) R
- [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]结构。2 t) F( E+ y$ {
typedef struct WORDINFO) I, T$ k4 j+ M8 u' m8 w- H
{4 ` e) c1 S8 b9 O. @
DWORD WordLen; //词的长度,用来快速比较
2 E( @' B* a' B y4 K. | LPTSTR pszWord; //词的指针
5 n) G# j9 E q9 W- L COLORREF Color; //颜色值) ]5 |7 m4 o. o6 |0 x: P) K" C
WORDINFO * NextLink; //下一个 WORDINFO 结构- K/ C" E* k X1 G& Z5 P) A$ f
}WORDINFO;
- U6 v2 o9 l2 ^, ^1 f[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]指向要高亮显示的词。是小写形式的。8 P/ Z4 J @% k/ R* p+ W v
- [size=-1]链表的内存是从堆([size=-1]heap)[size=-1]中分配的,速度快,容易清除,也就是说根本不用清楚。! M" q0 O7 i# S% r% J* B
[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]中的元素的值,这样所有使用那种颜色高亮的词就立刻使用新颜色显示。% N6 F' I) q1 v2 m0 ^- I2 s6 H& [2 V
例子:见光盘FirstWindow33#include "Windows.h"
# B( h* G! F( J8 i3 H#include "tchar.h"/ |& T f _5 J Y: X, l
#include "Richedit.h"
# S6 o. t( b6 P, v! Q#include "shlwapi.h"2 U0 F3 T9 k* b- |. o" B( |; w
#pragma comment(lib,"shlwapi.lib")6 \1 J6 {1 v1 S1 \
/ A4 q0 m0 U+ ~9 D, Dtypedef struct WORDINFO
+ p/ J0 e [3 H4 z0 O7 b: r, x3 {{
" _# ^; B* o" \ DWORD WordLen; //the length of the word: used as a quick comparison
4 b- H& S8 e) w' d9 ^0 c$ a LPTSTR pszWord; //pointer to the word# _" I0 P# r! v5 w
COLORREF Color; //point to the dword that contains the color used to hilite the word7 R/ z. D+ I" J. ~8 y" f. }, f
WORDINFO * NextLink; //point to the next WORDINFO structure' w0 l7 H8 ]8 ?* V8 Y9 k
}WORDINFO;
5 L6 O# E/ \; G) S3 k7 \
/ y) `, |$ W( U$ E! q#define IDR_MAINMENU 101
! p- y# X5 S2 q- a3 I9 [#define IDM_OPEN 40001! x5 I; w# H( j: H% [* ?$ e8 U
#define IDM_SAVE 40002
& M$ H) M: |$ I3 v% r0 E#define IDM_CLOSE 40003) U: I: |- J7 t( Y( H1 t1 }, @2 v9 d
#define IDM_SAVEAS 40004" F- ^& M* \) M9 G g2 v
#define IDM_EXIT 40005* ~0 X8 [* @4 F2 P, T* M' b
#define IDM_COPY 40006
6 p! p) c- r/ I( n2 G& ]#define IDM_CUT 40007
}8 k! Y f: }#define IDM_PASTE 40008
- b+ y7 g* ]: ^2 d#define IDM_DELETE 40009
" W+ T' a/ p* w#define IDM_SELECTALL 400108 s2 P8 k6 `0 f; s, F
#define IDM_OPTION 40011
) Z, e ]+ Q. F, G3 {- L#define IDM_UNDO 40012, |+ M2 C$ H. U9 D, s
#define IDM_REDO 400138 C# C+ v3 Z* Z @, p
#define IDD_OPTIONDLG 1016 D0 Y0 _& A* {$ \$ S2 q- F: U
#define IDC_BACKCOLORBOX 10004 K1 m) @- b" Z# P1 Q1 ^+ b' ~
#define IDC_TEXTCOLORBOX 1001
) |3 W- r) @7 X! q#define IDR_MAINACCEL 105& ?6 o% M& K% r. h0 {, w
#define IDD_FINDDLG 102
) k4 ]- w; c2 T8 I#define IDD_GOTODLG 1031 [% _- d3 L) ^5 r8 i6 ?( V
#define IDD_REPLACEDLG 1046 o: m) M$ l7 Q2 n! \
#define IDC_FINDEDIT 1000
+ J4 ]: D: z0 q7 e! M: l( r, Y#define IDC_MATCHCASE 10017 \ a5 d6 S, X" ?7 V1 n1 M( v
#define IDC_REPLACEEDIT 1001
- z, e0 r4 r) G8 i* k#define IDC_WHOLEWORD 10020 @, b) t+ e& j2 O! r$ d5 c% D
#define IDC_DOWN 10037 r: P: R9 M! u; O7 N* [
#define IDC_UP 10043 n8 p. y2 e' Z g5 S# K2 O1 L
#define IDC_LINENO 10052 v T, { V1 Q; {2 b+ b' W# Z2 u6 g
#define IDM_FIND 400141 r E+ K) ^" M( E) T( H! e+ ~ h
#define IDM_FINDNEXT 40015$ I# `3 h4 A# n4 |
#define IDM_REPLACE 400161 g+ S) _+ i& Y( S7 D
#define IDM_GOTOLINE 40017
; W7 G7 v. m S( S1 e#define IDM_FINDPREV 40018
' W5 `) M8 w3 ^3 z e8 \5 D% i1 z#define RichEditID 300
& I8 ]+ b9 e' `% h
5 G- L- Y: a" i) A
: C7 h# C" t3 p; [# C J% Z0 h
" D& K$ _" R1 p9 R c4 U2 a" GTCHAR ClassName[] = _T("IczEditClass");
" n2 W3 U$ F$ K; |3 `: xTCHAR AppName[] = _T("IczEdit version 3.0");0 |$ p1 |0 a' \ W( ~. Q
TCHAR RichEditDLL[] = _T("riched20.dll");
8 i8 P4 ~3 J5 t# ~' Q) zTCHAR RichEditClass[] = _T("RichEdit20A");
. R+ S. C2 a0 Z/ d7 |1 LTCHAR NoRichEdit[] = _T("Cannot find riched20.dll");
' }, w7 ?: Q Z$ M2 ^+ M: [TCHAR CppFilterString[] = _T("asm source code(*.asm)\0*.asm\0All Files (*.*)\0*.*\0");
3 ~5 j, N3 ^. x% d# U \TCHAR OpenFileFail[] = _T("Cannot open the file");' |! B: u. i' V/ o% L6 a
TCHAR WannaSave[] = _T("The data in the control is modified. Want to save it?");
) B J7 Y% B6 A( A- p; j% h! q$ o1 O0 o& S8 X) t9 d" f% e8 B4 [$ ^
BOOL FileOpened = FALSE;
: N4 t" ], e% ]7 n9 n" u, cCOLORREF BackgroundColor = RGB(255,255,255) ;" o3 ^+ |; t. I0 Q+ k% G) I& K
COLORREF TextColor = RGB(0,0,0);1 I0 V" M! h% ]; o' K
HWND hSearch;
; m# I; l' t% M# L; ~; OHACCEL hAccel;! N4 {3 \' T: R/ n
TCHAR FileName[256];
; ^# {5 W. s. m( xTCHAR AlternateFileName[256];
^! H* T: l+ r% Y! f1 r+ u' B' @DWORD CustomColors[16];
4 E- y1 Z* d( W1 d" s o( QHINSTANCE g_hInstance;( S' c1 G- M M; J7 @: K6 T6 w/ ^& ?
HMODULE hRichEdit;
. s+ `: F8 \ |0 V: H" W( `HWND hwndRichEdit;0 k/ Z, H7 v$ `# M3 X6 ~2 ]
TCHAR FindBuffer[256];
# C) F( |" X8 [1 L- @5 @TCHAR ReplaceBuffer[256];
; K/ L' }1 s2 @; }DWORD uFlags;0 M4 x- d2 l" r9 g. T
FINDTEXTEX findtext;
+ Z$ r8 D6 p% H9 a: X' H8 u F; \
3 r: Q' ?8 E6 H7 Q) C- TTCHAR WordFileName[] = _T("\\wordfile.txt");
: K# {" u7 p; _ xTCHAR CppSection[] = _T("AsmSection");3 F/ Y. w! c7 ~8 w
TCHAR C1Key[] = _T("C1");
1 g8 N: I: B0 M: T6 hTCHAR C2Key[] = _T("C2");
$ f0 U# Q t% eTCHAR C3Key[] = _T("C3");
) l# Q, _- h* i: @TCHAR C4Key[] = _T("C4");! I. v* n6 h8 c8 t0 n
TCHAR C5Key[] = _T("C5");, g* s, P& P6 T% f
TCHAR C6Key[] = _T("C6");, X# V( k' |: c6 ?) e. R }
TCHAR C7Key[] = _T("C7");
6 q/ ~- |' p7 l/ Q/ a0 m" rTCHAR C8Key[] = _T("C8");+ d# r- b- ^5 x/ {) q- N
TCHAR C9Key[] = _T("C9");- r7 ~1 {& v1 E+ n$ p6 d, L
TCHAR C10Key[] = _T("C10");- K2 y+ l$ P: N* u& V+ q! q
TCHAR ZeroString[] = _T("\0");% m; o( _. H0 N* E+ J' V, d
COLORREF CppColorArray[] = {
& X- E, ~$ y$ D5 Z$ O, v3 L RGB(0,0,0xff),RGB(0x50,0x5f,0x80),RGB(0xff,0,0),RGB(0,0x6f,0x66),! g( B+ O7 ^7 B6 Y! S
RGB(0xf0,0x44,0),RGB(0x54,0x87,0x5f),RGB(0,0,0xff),RGB(0,0,0xff),
) v0 V3 }! ~( \8 p! G0 f& q RGB(0,0,0xff),RGB(0,0,0xff)
# ?4 ?; z) n$ G# ^6 W+ R1 f};
* u% w( _2 s5 q" h$ G+ P3 `9 I- K" O
COLORREF CommentColor = RGB(0,0x80,0x80);
5 s9 m7 H) e. g% J5 fDWORD CppSyntaxArray[256];. P& l6 W0 [% O7 R9 r K
WNDPROC OldWndProc;( \7 c6 j' V% k1 h2 T2 i+ u/ J& v
DWORD RichEditVersion;
+ b Z5 {" _- @$ z) D! GHANDLE hMainHeap;
5 P" G+ g! e; PLONG CALLBACK NewRichEditProc( HWND hWnd, ( q% @$ u2 ^) U; |$ h3 W
UINT Msg, * S! m; o; }5 z* g+ W
WPARAM wParam, D1 J$ [5 m0 v( ^% n5 h
LPARAM lParam
& Y J! ~2 [5 `5 p- e)
! B i: s; v9 M{3 ]2 s0 O2 B6 t$ x! H% h5 j
HDC hdc;" N+ d; P" n2 Q6 p6 U4 L- Y
HFONT hOldFont;1 F. H. Z0 G9 W, P& J
DWORD FirstChar;+ }. `' C& Q& X' W9 B$ H
RECT rect;$ A$ `, J9 E# L
TEXTRANGE txtrange;6 S- H! \7 G1 _& u8 K6 y
TCHAR buffer[1024 *10];
% i& h4 |/ o t8 K# ~ W HRGN hRgn;8 a- ^# w6 l. a7 z& ~8 ^) t4 f4 J6 z
HRGN hOldRgn;! L$ B D/ |4 ?5 }/ ^; L
RECT RealRect;3 `8 V' o7 V: ~# M( c4 `, c
DWORD BufferSize;
4 @0 ?& U: [6 s1 B$ P; |3 w4 ~3 j LPTSTR pString;
+ ~$ C6 g% l8 |; s" p7 [8 Z! h% F ^5 q9 ?
switch(Msg): N, B' N' N; N/ Z+ M$ o. g0 }: L6 J
{
1 M) t& F& U$ [4 ` case WM_PAINT:% O2 u- Z& B3 p+ W' U; h2 i1 G
{
1 D( k: U5 L" U+ ?3 o HideCaret(hWnd);
2 V1 |. [7 l% H, g7 ]- N( _" v int nRet = CallWindowProc(OldWndProc,hWnd,Msg,wParam,lParam);
6 d# N9 |2 h7 n4 [7 _0 ^; P( t2 Q hdc = GetDC(hWnd);
5 ]0 e( ?: U6 {* t SetBkMode(hdc,TRANSPARENT);
4 b& r% V E f SendMessage(hWnd,EM_GETRECT,0,(LPARAM)&rect);. g: A- N' m7 y7 m; K( y. f2 b/ i
int nPos = SendMessage(hWnd,EM_CHARFROMPOS,0,(LPARAM)&rect);
& t9 h. s6 [6 W* t9 m
" @/ l8 @8 n- W; T# [( l. S int nLine = SendMessage(hWnd,EM_LINEFROMCHAR,nPos,0);) N" M# i4 e0 w# }( \; j
int nIndex = SendMessage(hWnd,EM_LINEINDEX,nLine,0);! I4 {8 _0 s% L
txtrange.chrg.cpMin = nIndex;
' _; f9 Q }( w' |/ _/ M FirstChar = nIndex;3 B; U: F. Q3 ?$ c! w2 A3 {7 {
int nNextPos = SendMessage(hWnd,EM_CHARFROMPOS,0,(LPARAM)&rect.right);0 k& g0 q1 P" }" p8 I
txtrange.chrg.cpMax = nNextPos;0 d8 w& ]& O1 M1 l% O- f J# d
RealRect.left = rect.left;9 U# a: b! F9 N# ?8 f
RealRect.top = rect.top;6 h( ~+ ?+ f. f( K( v2 H5 t% b- a
RealRect.right = rect.right;
1 [0 [" |( w7 W/ N8 Q) B: n RealRect.bottom = rect.bottom;
* U7 H3 B- {5 S& a, Q5 h8 H hRgn = CreateRectRgn(RealRect.left,RealRect.top,RealRect.right,RealRect.bottom);* Z) x& i- {! N$ C$ {+ B
hOldRgn = (HRGN)SelectObject(hdc,hRgn);
- y$ A1 q: }4 I5 x k+ R2 { SetTextColor(hdc,CommentColor);
" a, r5 z* o) |" |' M2 q6 d
t5 @* {8 D, J& l txtrange.lpstrText = buffer;
3 K2 b5 y8 [3 W& { BufferSize = SendMessage(hWnd,EM_GETTEXTRANGE,0,(LPARAM)&txtrange);
9 M Z! r+ A K* @ pString = buffer;. b' V8 s; N6 e H2 C' h
while(pString - buffer < BufferSize)
! |' v& r! j, u* u. l { q) A! ~" Z9 g( K
pString = strchr(pString,_T(';'));
4 N; T# j' S# F- S) o4 R1 \0 x4 a 6 o" W# t; E/ ~* y' e5 N( a: X4 [$ q
if(pString != NULL)% `8 {+ k# }1 t4 g, O# Y
{
9 m. F. {- k6 H: a( ?2 E0 d- `
+ w5 Z- i5 q U- h txtrange.chrg.cpMin = pString - buffer + FirstChar;# B/ S5 g7 R$ C- @* I
LPTSTR pTemp = strchr(pString,_T('\r'));
( K( c! t7 V% Z* p1 c if(pTemp != NULL)
! X/ i7 J3 r# o0 B. W* u7 ^* | {
" i9 a6 t& K2 t/ v, F$ g/ A *(pTemp) = _T('\0');
) y% F% ?, v ~! [/ x# o }0 V5 j+ v9 d( N3 U
else
# K: m3 P9 h G/ f F0 d- { pTemp = buffer + BufferSize;' [" s" \% v: J* k, P
, x3 ~# r7 k/ R& l; w txtrange.chrg.cpMax = pTemp - buffer + FirstChar;
6 @! @1 W' |/ S& J. E7 Y
4 w' \1 e# _1 J4 [7 {% l int nLen = txtrange.chrg.cpMax - txtrange.chrg.cpMin;
+ _- [1 V B, y# j5 e% f- C) {
. {* f) o+ ]7 M& _3 o LPTSTR pstr = pString;
# v6 ^3 @1 Q9 V; l- T1 H while(nLen > 0)
: F; }& K3 D1 a8 V4 ^+ u5 }( M5 S {8 D5 j, s- R! h
if(*pstr == 9)
7 m8 Z8 S+ K }$ n4 c4 w* C *pstr = _T('\0');$ v1 D, _! L7 v1 Z" R- b4 C4 j
; z: ^1 A. O7 }1 o3 N& n" d pstr ++;! I$ U, p: u' v' i0 G$ l5 G" ]
nLen --;
7 L" _3 d; w; V# c' z }+ N/ y/ [- E7 }* V: A
7 t/ o: O, B' x2 U5 N( @
int nMyLen = txtrange.chrg.cpMax - txtrange.chrg.cpMin;
# \3 i9 c( X; J2 T* D& A% m" p LPTSTR pMyStr = pString;, w! ]! |( B4 _& r" l+ m' l
while(nMyLen > 0)
4 L4 o" l2 L8 u& H# s; G {
4 h; v6 V% h& n1 t }% S# u) l% f: X int nstrlen = lstrlen(pMyStr);
3 {6 N) t8 y- |- K H- i+ e if(*pMyStr != _T('\0'))
" \( v7 J8 f+ ?- Q- }9 N {
( v; @. S0 e& z) P- x if(RichEditVersion == 3)! {5 t) a6 L( @( b( e* x7 z
SendMessage(hWnd,EM_POSFROMCHAR,(WPARAM)&rect,(pMyStr - buffer + FirstChar));
: N% }8 D: E* F% N) H' Y else
+ V& |( D) T( }% @ r1 d7 o9 Z; ~ {/ s5 m1 w) X; @$ R4 w
int nWidth = SendMessage(hWnd,EM_POSFROMCHAR,(pMyStr - buffer + FirstChar), 0);% O5 Q; {; H: t, k d4 D3 k6 q
rect.left = LOWORD(nWidth) ;
( j3 {8 m7 }# W rect.top = HIWORD(nWidth);0 @; F1 @/ Z [% S2 i
}
: O Y1 l) N0 P, _- D8 m( { V% Y' X' Z, s y
DrawText(hdc,pMyStr,-1,&rect,0);
6 L9 V( {. \+ V8 ]6 d% w3 i3 L D pMyStr += nstrlen;% {; i: O# Y$ J
nMyLen -= nstrlen;
2 M6 ?- O& o n# @9 p4 y7 M, q$ ~ }
1 g0 d2 @# W& d" T else
/ ]8 I/ s( v/ Y1 Z+ ~ {
5 X! r& n; N- x1 n" v, ` pMyStr++;! U* P. O* `$ n& ^+ z: [' q0 l
nMyLen--;
/ r* Z' B( S, t: s }
( L( b& B' o7 ]. Y5 w8 d# x }1 e: a$ S6 e! i
; c; V! H! i) j
RtlZeroMemory(pString,(txtrange.chrg.cpMax - txtrange.chrg.cpMin));
. J r- l3 ~3 L$ |& N * D2 @ J6 |; Y0 b
pString += (txtrange.chrg.cpMax - txtrange.chrg.cpMin +1);
: p3 R3 [% M3 ]8 y7 ] }' p8 T! c5 W& D7 @
else
! l" R& b4 ~: Y- b" Y4 k break;& H" x* Q6 g* D! R2 I% d- A- `% B" ?7 p
7 H* |4 p, Y! I: E1 u6 X
}
: q1 p0 @* `" R- |7 j' A4 m" r R+ m. y+ g
int nMyBufferLen = BufferSize;! E# T& ~; c5 D" x; M# K
LPTSTR pMyBuffer = buffer;
+ P1 q7 C A0 [9 G; V while(nMyBufferLen > 0)) K4 [& r, @$ ?& O( M" w+ o( ^! F& ?' O
{2 t/ B8 u0 \& l7 @( ]5 }
5 Q& @9 }/ W' J+ n: i, {
if(*pMyBuffer == _T(' ') || *pMyBuffer == _T('\r') ||, R, h* {/ L m6 \/ d0 D
*pMyBuffer == _T('/') || *pMyBuffer == _T(',') ||
. ~2 e: D: h; ` z. J *pMyBuffer == _T('|') || *pMyBuffer == _T('+') ||
5 p+ ]+ H4 }6 O4 u *pMyBuffer == _T('-') || *pMyBuffer == _T('*') ||
: B& w3 _, H" m7 f7 k4 N *pMyBuffer == _T('&') || *pMyBuffer == _T('<') ||
; ~% f X+ S1 E* T X, w *pMyBuffer == _T('>') || *pMyBuffer == _T('=') ||' L& L! C$ W. T! x
*pMyBuffer == _T('(') || *pMyBuffer == _T(')') ||% J% v8 ^" L# N# w: b
*pMyBuffer == _T('{') || *pMyBuffer == _T('}') ||% p5 u$ P1 k8 W4 n6 x% E! ~1 @2 n2 s
*pMyBuffer == _T('[') || *pMyBuffer == _T(']') ||3 ~4 |- J# \" R
*pMyBuffer == _T('^') || *pMyBuffer == _T(':') ||6 h9 a+ z' F0 S r3 I( g" d
*pMyBuffer == 9 )2 D: N1 E$ E. E' ?8 s
{
8 I: Y R" p! d) h, @, h5 g *pMyBuffer = _T('\0');
; H" ^& h) @1 I( Q8 J2 v4 r: p }- l3 A) l8 N( H% O
pMyBuffer++;
( U, i8 A# ~& x$ o! o$ y nMyBufferLen --;
0 U* \0 t7 A7 C |6 U d' n }
2 W, c4 T# K7 b |/ G. H
" K1 M' ^5 y9 T- ~% n9 C$ T int nBuffLen = BufferSize;) K# _* \, H' g5 k# |1 `
LPTSTR pMyBuff = buffer;
9 D8 W* _3 g% d! t7 e D1 x while(nBuffLen > 0)
+ o+ U' ~5 E) l; U {/ \5 Y! M& W/ @$ N
if(*pMyBuff != 0)
# d; B X( |9 O4 J! G {
0 n1 n. E+ c8 q+ i0 O2 { int nlen1 = lstrlen(pMyBuff);
; r, D3 _4 _7 S: W# g2 ^1 G CHAR cChar = *pMyBuff;6 K- v5 w* s: J) p+ x; A
if(cChar >= _T('A') && cChar <= _T('Z')); C# Q) V& u) D. J2 t" \
{9 M- S+ r' A; U6 N
cChar -= _T('A');
% K. `1 H' h: \7 s3 k' r) H' O cChar += _T('a');' Z* w) ^5 {3 P: B4 t+ Y, @/ Z, T
}# j( k4 x4 {$ w/ [: I- e( ~
7 ^4 s' n4 J% J3 ^% E if(CppSyntaxArray[cChar] != NULL)4 A4 g- p; W: \- Q( V3 H
{! _. Z& e* E1 `
WORDINFO *pWdInfo = (WORDINFO *)CppSyntaxArray[cChar];
& D% ` N+ w0 o while(pWdInfo != NULL)
$ o/ a) M9 e1 g9 `0 h {* w7 A J6 G8 Y$ }' t
if(nlen1 == pWdInfo->WordLen)
' q; z6 u; B Y3 e {
1 L5 K2 b* ]2 \! A2 s" c* l4 V, N if(lstrcmpi(pWdInfo->pszWord,pMyBuff) == 0)- D& Z4 A6 ^1 T' \0 f) R
{
" h% w1 J0 C( G, T) a if(RichEditVersion == 3)
. r3 m9 j2 Z% C {
: v( Z( I1 f) m SendMessage(hWnd,EM_POSFROMCHAR,(WPARAM)&rect,(pMyBuff - buffer + FirstChar));: O L7 O( I, `: u. f7 V
}7 |; D! d3 R7 h; ]& c
else) F2 B* Z8 Q0 Z$ P* r- b
{
- U7 t3 C% X+ z/ g5 i" r int nDim = SendMessage(hWnd,EM_POSFROMCHAR,(pMyBuff - buffer + FirstChar),0);1 a4 C- l6 _0 k" V7 B
rect.left = LOWORD(nDim );+ i w/ n5 V$ z! S6 K" h
rect.top = HIWORD(nDim);, U. S) f& x- l2 `" z. {
}
5 l6 x4 U% A. v1 T X- f ~! R, ?$ r6 y9 e
SetTextColor(hdc,pWdInfo->Color); `2 O2 B5 u1 [7 t$ p! S& S
DrawText(hdc,pMyBuff,-1,&rect,0);6 |- X4 V4 e, ~; s( ]5 S p
break;
4 f; D5 @) M. y3 s; x P! O/ p4 Z& } }
3 e- E, Y4 v2 r. h }
9 K4 W- u" T& t+ O4 u pWdInfo = pWdInfo->NextLink;
' [3 B8 r. Y: N7 Y: H, C3 N$ x# A# m }
4 T* q7 p7 D( ?. Q( C& B! `2 L }
1 G. H9 i! c0 O0 Y6 Z
7 V% Q e, U: N7 o4 S+ H- } pMyBuff += nlen1;
; p' p6 A# I! z( q+ f( `8 e E nBuffLen -= nlen1;% T, k3 [$ S3 S* C. f8 D2 Q
}, y' ~( ?* [: j
else
% m% } M" Y4 ^% I. d! W4 e {. g. ^% M3 I$ r( J* a9 H
pMyBuff++;0 T5 q7 N1 B& V7 i# T) h
nBuffLen--;6 `, k, L) X# u+ i
}
8 Q* f, N w1 z5 [0 A0 C& A }
8 l. B3 ~" m# d% Y Y1 w, G7 _2 i/ ]# ~# n5 q
SelectObject(hdc,hOldRgn);
3 r# h4 g% j7 H( Y# {- q( t6 c* w+ D DeleteObject(hRgn);
2 _# _" G0 h3 y SelectObject(hdc,hOldFont);2 J$ t/ F4 c, E, r' I
ReleaseDC(hWnd,hdc);
/ z' I3 [" X/ W/ G) T ShowCaret(hWnd);
. }4 T# x4 p! H4 [ return nRet;
8 p; N7 B4 A; b5 |4 k
' |; b0 ?7 B# ~% P7 G }2 v5 a9 c# u4 m! P. g
break;
9 [% `) `5 h# ~8 C case WM_CLOSE:3 y4 H, \; }% z# J
SetWindowLong(hWnd,GWL_WNDPROC,(long)OldWndProc);
9 s' c& x% y( Y. @& o! ?" b break;8 F$ b- K o8 f# k- o/ {3 R
default:
. C$ U! m) j$ f# M; T return CallWindowProc(OldWndProc,hWnd,Msg,wParam,lParam);
- z& a, _ N4 F7 ` }) n5 Z+ @, t$ i8 n: ~8 L* i
[& J2 m; A4 \, d3 }% F# K/ c
return 0;! \$ P9 n; r! l2 o
} |