原文:http://hi.baidu.com/combojiang/blog/item/6e65d6f322f81bce0a46e0c0.html
& F* J( `* N& y# o 7 l, P1 D' Z: e0 }! ~
在读这篇教程之前先提醒你,这是一个复杂的主题:不适合初学者。这是最后一篇RichEdit 控件教程。
3 }/ J% a# c8 ^/ X" B" U" m& l0 G" W" c, d, H5 t5 Z
理论:
1 L3 L5 n" w9 H3 E2 L& F: r语法高亮显示对那些编写文本编辑器的人来说是一个热点主题。最好的解决方法是编写一个定制的Edit控件,这也是很多商业软件所使用的方法。然而,对于那些没什么时间来编写这么一个控件的人来说,次策就是改写现有的控件使之符合我们的需要。 ) Z. v7 G8 V% `+ L6 s+ T/ 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]控件中的插入点位置处理也有一点问题。: e1 C) |9 n+ X- A* k3 b1 }
[size=-1]通过上面的讨论,你可以看到使用 [size=-1]EM_SETCHARFORMAT [size=-1]是一个错误的选择,我会给你演示 [size=-1]"[size=-1]相当正确[size=-1]" [size=-1]的选择。1 c: P! j2 h; X) n; k
[size=-1]我现在使用的方法是[size=-1]“[size=-1]即时语法高亮[size=-1]”[size=-1],我只高亮显示可见部分的正文。因此高亮显示的速度跟文件的大小根本是无关的。无论是多大的文件,在某一时刻只有一小部分是可见的。: [/ k7 ~! [7 _( r0 S
[size=-1]怎么样实现?答案很简单:
- Q: j- G' P X. U- [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]之后,我们将要高亮显示的词用不同的颜色来覆盖掉。$ f- ^9 y$ S2 h- i9 l$ r) o
[size=-1]当然了,路也不是这么容易走的:仍然有两个次要的问题需要矫正,不过上面的方法工作起来很好。显示速度令人很满意。
6 O2 V' ^9 x, V0 m+ m# I/ S# C[size=-1]现在让我们集中在细节上。子类化处理是很简单的,不需要很多注意力。真正复杂的部分是:我们必须找到一个快速的方法来搜索那些需要高亮的词。更复杂的那些在某个注释块里的 不 需要高亮显示的词。
& \$ I7 e, Y8 Q! t- u[size=-1]我使用的方法可能不是最好的,但是它工作的很好。我敢肯定你可以找到更快的方法。不管怎么说,先看看我下面的方法:
( z- l$ ^8 y. Y- [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]结构。
+ D% x- R5 Y7 Z0 ]6 y typedef struct WORDINFO
) O+ {( z9 a2 c{
0 N" d6 C: S6 K/ J DWORD WordLen; //词的长度,用来快速比较
1 S0 O5 W. V3 [0 R. u9 N) S LPTSTR pszWord; //词的指针
, D7 ]! k I; I* w$ S% m COLORREF Color; //颜色值5 g4 t! Y! p2 I. S1 F
WORDINFO * NextLink; //下一个 WORDINFO 结构# ?! u) l q2 [& d6 S7 e
}WORDINFO;9 ]1 A! @: k8 v9 c% N7 S7 Z
[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 l1 F c4 Z; Y3 {4 G
- [size=-1]链表的内存是从堆([size=-1]heap)[size=-1]中分配的,速度快,容易清除,也就是说根本不用清楚。* H1 @1 f+ F. R. W' z9 M8 N
[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]中的元素的值,这样所有使用那种颜色高亮的词就立刻使用新颜色显示。" `8 |* o+ T. ?7 A1 U$ h
例子:见光盘FirstWindow33#include "Windows.h"& n5 S6 \' Q; q. M7 i2 h( d
#include "tchar.h"2 M( x, N! I+ } O& S
#include "Richedit.h") d# Y# |: B! v
#include "shlwapi.h"
8 w9 ^+ d" j+ E. b! u* E0 N3 d#pragma comment(lib,"shlwapi.lib")
( ]4 ~( H* Q, H" a0 F* ~, m% X6 A: W* p" n
typedef struct WORDINFO2 ?4 S" p- g7 ~$ V7 K
{: t3 J5 p* ^& d' {2 m* h( N
DWORD WordLen; //the length of the word: used as a quick comparison
! j; z5 ~" E: S1 u/ r LPTSTR pszWord; //pointer to the word6 n7 L' h7 I3 n
COLORREF Color; //point to the dword that contains the color used to hilite the word
- R. J3 M. S1 H- Y6 o d6 ^ WORDINFO * NextLink; //point to the next WORDINFO structure: ?/ I" @: j' @4 y+ `
}WORDINFO;
4 x0 u# }1 q, [" n# w+ @
# P$ ~! F7 @- a3 Y#define IDR_MAINMENU 101+ J7 d. f# v0 [2 r4 T- X
#define IDM_OPEN 40001
( U" `& p& e5 L7 i& A. |#define IDM_SAVE 40002" j6 p" ^: H* _/ ^
#define IDM_CLOSE 40003
, _5 X/ |: m* X$ J( ^5 i6 Q+ @6 m#define IDM_SAVEAS 40004
/ A# p+ g$ W8 v; Y, i) A#define IDM_EXIT 40005
: O% u _7 Z* N0 V/ w#define IDM_COPY 40006 L( a4 t% i. t; w0 ^" ~
#define IDM_CUT 400071 g! b5 L2 p7 T( }% @1 @- @# y
#define IDM_PASTE 40008* H4 X% ?6 e( j+ y8 f7 t5 B
#define IDM_DELETE 40009
, { h1 X8 O1 X5 [#define IDM_SELECTALL 400107 s) K, ?2 G, _
#define IDM_OPTION 400118 Q3 W; D6 _# ?+ K* W8 D+ [: J' p
#define IDM_UNDO 40012
1 T5 I: P$ {8 P+ P2 ?& P1 N#define IDM_REDO 40013, h# ]5 V5 I) Q/ A
#define IDD_OPTIONDLG 1016 G3 s1 d: b: W
#define IDC_BACKCOLORBOX 10003 @6 C) u% |) c8 H8 P7 b2 |
#define IDC_TEXTCOLORBOX 1001
) z! u# v% z/ O5 l- R#define IDR_MAINACCEL 105
' Q# P7 n. v" |) n/ z# C#define IDD_FINDDLG 102; |' B& ]2 t) {& y: w' Z9 K
#define IDD_GOTODLG 103
: I" O1 g4 R# D, o#define IDD_REPLACEDLG 104! d# _1 E+ w3 o
#define IDC_FINDEDIT 1000
+ D' c/ X2 n( T9 M) V5 X! F#define IDC_MATCHCASE 1001
7 j l, ^, B/ G: a: t4 c#define IDC_REPLACEEDIT 1001
& J8 `, W' \! K( w#define IDC_WHOLEWORD 1002$ y+ Y/ ]& ?' V" @
#define IDC_DOWN 10030 t; x+ B! ^+ ^8 w$ Y1 P
#define IDC_UP 1004! q& t. h% A7 H! M( r4 j- h
#define IDC_LINENO 1005
: i9 d7 H: Y P& u#define IDM_FIND 40014
6 ]0 h0 l% q, M* e: s#define IDM_FINDNEXT 40015
2 u( P4 s7 F% P3 k#define IDM_REPLACE 40016
. o2 }( V* c3 x B+ [#define IDM_GOTOLINE 40017
& d4 g* W) b2 `" f1 p0 i' ]#define IDM_FINDPREV 40018* l4 k/ ~! s, s0 N
#define RichEditID 300/ X; y. e4 J, H @4 T$ S( P/ c' ]" u
: p* ]: _1 ?) y9 D/ g2 }7 D6 f% N, @+ E. \/ L: Z
# w* R: `( y' ETCHAR ClassName[] = _T("IczEditClass");
4 X; n! J: s: FTCHAR AppName[] = _T("IczEdit version 3.0");! q' D& F( f! b+ k2 n4 G) @# I
TCHAR RichEditDLL[] = _T("riched20.dll");
; j* ?2 h- [2 U, ~# a6 V Y& pTCHAR RichEditClass[] = _T("RichEdit20A");
& `( R- u% l8 ~$ R+ ~& FTCHAR NoRichEdit[] = _T("Cannot find riched20.dll");
4 x* C9 d0 L# v3 F4 kTCHAR CppFilterString[] = _T("asm source code(*.asm)\0*.asm\0All Files (*.*)\0*.*\0");
# f2 R3 z6 \7 O& xTCHAR OpenFileFail[] = _T("Cannot open the file");4 C. X, q* i8 u
TCHAR WannaSave[] = _T("The data in the control is modified. Want to save it?");3 l0 c2 D: s8 E/ G* @
/ j8 b/ ~( t: c
BOOL FileOpened = FALSE;! u# T* o# k# ]0 R7 U' Y: x7 O
COLORREF BackgroundColor = RGB(255,255,255) ;1 q$ s1 q: r4 }
COLORREF TextColor = RGB(0,0,0);4 Y K- R. |9 |3 v l8 o! M: R! o
HWND hSearch;5 ^5 H1 B+ P m% J
HACCEL hAccel;2 |" Z5 V9 w0 c
TCHAR FileName[256];/ \$ N' t* l. D1 L, k
TCHAR AlternateFileName[256];
. [0 L8 P8 T- j. k FDWORD CustomColors[16];
, j2 K' F& A6 B) lHINSTANCE g_hInstance;5 Q' ~2 M( O4 K% [
HMODULE hRichEdit;* `9 r b, ~3 \0 v
HWND hwndRichEdit;
0 T& x4 I3 t% j9 n: h. v2 GTCHAR FindBuffer[256];
1 t, N6 m9 C/ w6 j* iTCHAR ReplaceBuffer[256];9 L) T, d! q& B3 F( ?9 x. O
DWORD uFlags;
0 T6 `: l7 L# OFINDTEXTEX findtext;
4 ^& n, |3 ~* v: L- r
5 H7 O3 s1 |! h- m( r7 e9 Z7 WTCHAR WordFileName[] = _T("\\wordfile.txt");/ y. V1 i9 {! w% k3 y" P- G( c! [3 R ?6 j
TCHAR CppSection[] = _T("AsmSection");3 ^7 u" ?, T# f( `% }
TCHAR C1Key[] = _T("C1");! w" q {) A9 U7 Y
TCHAR C2Key[] = _T("C2");
- |" C/ q) O# ~# ATCHAR C3Key[] = _T("C3");
+ q" g) [; K8 b2 e6 `/ I( WTCHAR C4Key[] = _T("C4");3 R/ s) a F' `1 P& i' K3 _! B
TCHAR C5Key[] = _T("C5");( @' @2 Y1 ?' {. T" z* |% q
TCHAR C6Key[] = _T("C6");* i9 v g) z" E/ x
TCHAR C7Key[] = _T("C7");9 U' f$ @+ V* [) b9 N. K
TCHAR C8Key[] = _T("C8");
5 h- ]* Q7 e/ I0 r% TTCHAR C9Key[] = _T("C9");) F5 C1 p2 s# n! [# I& x
TCHAR C10Key[] = _T("C10");
; P% C6 L) Z3 O* nTCHAR ZeroString[] = _T("\0");
. S. H8 q, v- q$ P3 m8 fCOLORREF CppColorArray[] = {# ]7 W. H7 q3 n8 w, M9 F
RGB(0,0,0xff),RGB(0x50,0x5f,0x80),RGB(0xff,0,0),RGB(0,0x6f,0x66),+ O7 E+ C* B' I- b
RGB(0xf0,0x44,0),RGB(0x54,0x87,0x5f),RGB(0,0,0xff),RGB(0,0,0xff),
7 |) o$ Y5 Q# _& s$ B+ k6 n# l RGB(0,0,0xff),RGB(0,0,0xff)
4 c5 }) C$ j; W% E5 y};
( v, {3 ~3 M5 J5 [8 ]
" u' _& y8 d7 x/ [2 XCOLORREF CommentColor = RGB(0,0x80,0x80);
, _: s3 P) Q4 W2 ]( e9 PDWORD CppSyntaxArray[256];' m8 R& U4 X% i i
WNDPROC OldWndProc;' Q& O8 Z1 o/ X+ B- A1 ?5 ^
DWORD RichEditVersion;
. s: v) w X. \% {8 R$ JHANDLE hMainHeap;7 U+ B& \$ X4 @2 w
LONG CALLBACK NewRichEditProc( HWND hWnd, ) H/ v1 C, I1 E$ M; |
UINT Msg,
% ]5 ]( F; y" b; k$ a- @6 a WPARAM wParam,
9 K0 k5 G' l8 U4 x6 ~' m LPARAM lParam
( h& b" h6 ]! t0 k, q9 G)
# P% f( ]& A; N4 H{, v4 V- }- c, v G' Y+ U$ N
HDC hdc;
- m* W& o3 _) R% h HFONT hOldFont;1 q; \$ @( G/ ~4 P6 Q% d/ a/ M
DWORD FirstChar;2 m0 I9 t$ y0 C. z- W- l0 @2 H
RECT rect;) \- T5 h1 c) K3 x- @6 a2 b
TEXTRANGE txtrange;
! ? a. _5 e! m- a0 a TCHAR buffer[1024 *10];
" t0 v! a8 Z' O; g9 |7 D6 W HRGN hRgn;
# L5 G/ I( R" _+ M# L% u) Z HRGN hOldRgn;
' {# R% u% J# }1 [ RECT RealRect;/ C* ]( R: C, j0 j3 @+ `7 o0 f" z
DWORD BufferSize;
y+ [9 o) M' S9 d3 h& m: o! I LPTSTR pString;8 g1 f7 A$ h, s. |4 w2 C
, P7 Q5 [0 z6 ]! V
switch(Msg)" P, ~4 a. T* h! e5 e: N
{
" B$ {5 T! f" H/ m, y3 F$ e case WM_PAINT:
) D: j9 ~/ x! P0 ^8 d) H, n" }, R {
+ r& Y0 _/ Q9 S: W( \! Z HideCaret(hWnd);
8 H+ T9 u" u6 _9 k int nRet = CallWindowProc(OldWndProc,hWnd,Msg,wParam,lParam);
3 P+ L# m3 \" s) H. K hdc = GetDC(hWnd);
1 f0 v0 }# i) z: ?/ h% w1 X SetBkMode(hdc,TRANSPARENT);
1 R& i( G6 Z: p/ F SendMessage(hWnd,EM_GETRECT,0,(LPARAM)&rect);7 C; {+ U3 W. s# n- M Z
int nPos = SendMessage(hWnd,EM_CHARFROMPOS,0,(LPARAM)&rect);
+ s4 h0 I+ J S0 G+ ?. c; B7 o. @3 Q& n C9 ?! n
int nLine = SendMessage(hWnd,EM_LINEFROMCHAR,nPos,0);
1 R- k. e; V, S# r' u int nIndex = SendMessage(hWnd,EM_LINEINDEX,nLine,0);4 A- n# b# {4 _! Q8 g* @
txtrange.chrg.cpMin = nIndex;$ ]6 Z8 k' P; [4 S( J' n
FirstChar = nIndex;
) s* Y' N6 C( \ int nNextPos = SendMessage(hWnd,EM_CHARFROMPOS,0,(LPARAM)&rect.right);& I4 s* w+ Q- Q/ k" I6 B
txtrange.chrg.cpMax = nNextPos;
0 L! ?; K9 a6 R) ?/ U* a) D RealRect.left = rect.left;
/ b! i9 [1 j! y; @" Q# J RealRect.top = rect.top;
1 O2 H. _) G# @ [3 X RealRect.right = rect.right;
( U" w+ e8 x1 h W RealRect.bottom = rect.bottom;- C0 d- w3 ]& W
hRgn = CreateRectRgn(RealRect.left,RealRect.top,RealRect.right,RealRect.bottom);
- O' D8 Z0 r1 m3 r hOldRgn = (HRGN)SelectObject(hdc,hRgn);4 u; n$ E6 o. z1 Z3 \, q8 s5 S3 w, [
SetTextColor(hdc,CommentColor);
9 E& I4 `- h& R3 C! b: {, S1 E2 K/ e, }
txtrange.lpstrText = buffer;
# H& A. B; W! d+ R* b% K+ g BufferSize = SendMessage(hWnd,EM_GETTEXTRANGE,0,(LPARAM)&txtrange);0 v7 K; g( C, i c% J# K5 e
pString = buffer;
D% [" } }! ~( B0 C, V6 |% @# ` while(pString - buffer < BufferSize)
+ l+ l3 A, h- p; ?0 T. ~ {
) X$ K" e# m# _ pString = strchr(pString,_T(';'));. g* k+ F* b, H, M# {8 a: P% R
6 P7 }" e* D' K& k3 ], ` S if(pString != NULL)
! c* X% r( |* U+ P {5 c f/ G) h& {2 g' I
' E) g3 T, o$ Q; l* F, S% E
txtrange.chrg.cpMin = pString - buffer + FirstChar;
4 e/ h' {7 N2 W0 Y" [4 W LPTSTR pTemp = strchr(pString,_T('\r'));$ j" }, j! A* ?, P) d
if(pTemp != NULL)
/ l% V+ \, b" `3 m3 U6 Y {
- [- h7 g" U: @2 J1 K% D( z *(pTemp) = _T('\0');
0 t, C' p, a3 t' R o }9 D6 ^# w/ D# h( Q# S( h3 q0 e; I l
else
% u' h f' G/ ]! z2 t8 n' j! l6 D pTemp = buffer + BufferSize;7 o; V) W% l! |% ?" E5 s/ b
- H S/ `4 F; I3 P* e; k0 }
txtrange.chrg.cpMax = pTemp - buffer + FirstChar;# s& l5 M5 s9 B- o
% M7 D8 f2 j% ^' a! p7 o% M! b
int nLen = txtrange.chrg.cpMax - txtrange.chrg.cpMin;
4 c+ Z% U/ @, w# i
. h/ ~- P0 d3 V! R H2 I LPTSTR pstr = pString;
3 C( p: m0 C6 k! l! k t while(nLen > 0)
7 U) ^) x$ d8 k# B: T1 i/ g9 y { {% `1 O0 Q$ [2 ?; I+ u
if(*pstr == 9)
* W$ `, R6 x+ M6 `, a0 T *pstr = _T('\0');
3 b& ? Y# v! X; C ; n* ?: g; [ P9 G
pstr ++;/ n4 T0 \& P7 a' X
nLen --;( O) S. [4 u- k- |
}+ H- h) s- _' c* C) K6 a: g$ r
5 N) m% N% |) A% i int nMyLen = txtrange.chrg.cpMax - txtrange.chrg.cpMin;
( s) P/ k3 U! p LPTSTR pMyStr = pString;, }* i. r$ W8 [7 u
while(nMyLen > 0)0 v: @" A6 d/ Q$ B0 _( e
{6 n3 Y( P N, b( G6 |
int nstrlen = lstrlen(pMyStr);
3 w ^- l T- ^ if(*pMyStr != _T('\0'))! _% d. g1 I7 u4 L8 P6 w
{
- s9 j. E$ W5 Z' n if(RichEditVersion == 3)
& F8 S# |1 T4 y# K! Q2 B SendMessage(hWnd,EM_POSFROMCHAR,(WPARAM)&rect,(pMyStr - buffer + FirstChar));
( }2 t- ?- Z( @3 q else x! c5 q' V' k2 s7 e
{' H% E& G" P2 g: u. @
int nWidth = SendMessage(hWnd,EM_POSFROMCHAR,(pMyStr - buffer + FirstChar), 0);
7 Y0 o" v: [) |! o: c2 r rect.left = LOWORD(nWidth) ;; I2 W2 ~1 J2 O8 `, F
rect.top = HIWORD(nWidth);: N3 o8 z# Z2 p) M' u {; k) x! w
}
, s" Y2 P. I1 J5 w
0 h D8 N) w0 J5 Y DrawText(hdc,pMyStr,-1,&rect,0);
- ?1 Z" E2 _. L2 C$ q' U' V pMyStr += nstrlen;
. c5 D5 s* Q+ A: l) A D nMyLen -= nstrlen;, p3 y7 N! @5 w% r2 k2 B
}
9 ~8 u: m6 J, t- Z; ^! Q5 ] else! b8 s# v0 q, d
{
$ W0 Z3 H; x1 ?: R8 s+ s: U pMyStr++;5 K( s9 k: S- A0 K8 \9 k
nMyLen--;- B5 z" y& D9 h4 \7 k! u0 y7 e
}
# d. x; x `% Z( a) b& H* ?% n1 ]8 n0 R- y }
2 F H& B, O7 n" v+ d5 g3 k1 z) a9 N( g
RtlZeroMemory(pString,(txtrange.chrg.cpMax - txtrange.chrg.cpMin));
* B- _* N8 F* u3 @( Y# P. }/ M
q4 `9 I2 I& t1 y+ E- b pString += (txtrange.chrg.cpMax - txtrange.chrg.cpMin +1);; h: F. s L. b
}# u* ^+ `" w% G5 f, s+ W6 w
else4 L3 R1 F: Y# d+ Q) |
break; d0 Q4 z! S, ?0 n% a: A, i7 q
7 j* S3 [: h. ^/ j6 z' i5 U' Q! J }
% X& H3 G4 V- ^0 P5 @: J4 Z, `1 w# ?1 Y, ^$ L) f6 ^+ s
int nMyBufferLen = BufferSize;
# \! N4 I4 P, {! L5 k LPTSTR pMyBuffer = buffer;5 v1 D( j3 \! C* R; d8 }
while(nMyBufferLen > 0)
6 j6 O% }& @4 j+ b {8 e+ }7 J1 P3 m l+ {1 x0 f5 A1 H
6 B n% I3 x0 V. @5 q4 r if(*pMyBuffer == _T(' ') || *pMyBuffer == _T('\r') ||
6 T. r, F; V" s0 G5 Z *pMyBuffer == _T('/') || *pMyBuffer == _T(',') ||
+ I0 g* t6 ~& w$ D& H: J *pMyBuffer == _T('|') || *pMyBuffer == _T('+') ||
7 }8 {' \# t- x$ Q; `' g* w% i *pMyBuffer == _T('-') || *pMyBuffer == _T('*') || B- L, K7 r% n' `0 s/ Y
*pMyBuffer == _T('&') || *pMyBuffer == _T('<') ||& j6 ^: `8 ?" ^- X
*pMyBuffer == _T('>') || *pMyBuffer == _T('=') ||6 N& A$ L/ G( M$ T% g" U9 {
*pMyBuffer == _T('(') || *pMyBuffer == _T(')') ||
; V, \9 Q0 h! w; G/ V# n+ X *pMyBuffer == _T('{') || *pMyBuffer == _T('}') ||% @2 k4 b% M. t0 b/ V; y
*pMyBuffer == _T('[') || *pMyBuffer == _T(']') ||
+ S& T8 p0 U9 d2 s *pMyBuffer == _T('^') || *pMyBuffer == _T(':') ||
8 a3 Q, p8 c+ B3 S6 h *pMyBuffer == 9 )
3 }2 J9 Y( d ^6 ]4 \5 Q' L1 G {
V1 ^' ~. R, z. n/ @6 g; B# ~ *pMyBuffer = _T('\0');
+ c7 o5 [- k+ P8 o* M, {$ c }
- r F5 l9 q8 [$ M/ @ pMyBuffer++;
" O0 ]7 }% k w& r. V" l+ R0 H# z nMyBufferLen --;, e r/ C# `0 X ]% v
}
8 x7 t$ e$ I! [$ }3 ?% j* C% r, V/ E' S- @/ g% T
int nBuffLen = BufferSize;
$ J( E4 U3 C, S9 c H \) d# w$ D LPTSTR pMyBuff = buffer;9 x) S+ G. K1 U- N& s+ a8 m
while(nBuffLen > 0)9 x- z6 {: P2 @% w
{
# e# U3 A( q+ D if(*pMyBuff != 0)
8 s- b( M' n$ B2 M8 M" L {
7 c# j" [' M1 N2 K int nlen1 = lstrlen(pMyBuff);
0 w5 K; e& B& g* f CHAR cChar = *pMyBuff;# n/ {6 U+ t* b3 [# I+ S. P
if(cChar >= _T('A') && cChar <= _T('Z'))! J T% J; ^9 m5 l9 ^# X& t! O
{
+ M! G$ e+ K9 b3 Y5 Z: `$ v0 c cChar -= _T('A');
) g* R7 k$ N/ `9 i. h" f+ G cChar += _T('a');
( t s1 a4 E7 V. L8 Z }/ L) |4 K! u! E' M' Z, `
; Z8 e7 z7 @5 b& D# Q7 z% ~
if(CppSyntaxArray[cChar] != NULL)
5 A; Q, f* C. n, c6 e {/ [) F% K" O" u1 Y' Y
WORDINFO *pWdInfo = (WORDINFO *)CppSyntaxArray[cChar];2 F4 S) X5 R; X# H2 \
while(pWdInfo != NULL); {* k. m7 {2 z- ]; R% U" a4 N+ s
{
" F" J/ _0 o$ I. Z$ ^& q if(nlen1 == pWdInfo->WordLen)
9 e$ F3 z7 G/ w$ ?+ W {
_8 n8 T$ {6 ]+ o! Z; b if(lstrcmpi(pWdInfo->pszWord,pMyBuff) == 0)0 y, ~. x( b9 }* U
{
: z6 p4 Y3 G. s if(RichEditVersion == 3)* l* o4 H/ ~% M% I! U
{9 p% k/ U& o( H
SendMessage(hWnd,EM_POSFROMCHAR,(WPARAM)&rect,(pMyBuff - buffer + FirstChar));6 d4 b q6 q- A) L0 }5 {! f8 p9 S% G/ J
}6 r: C) ^# o/ R% {' y: b
else" L: q: l0 i1 P; u1 s( z7 |& `' y
{$ t2 }2 I$ ?. ]+ W @/ _" n
int nDim = SendMessage(hWnd,EM_POSFROMCHAR,(pMyBuff - buffer + FirstChar),0);
7 `4 A1 H! S. H1 | rect.left = LOWORD(nDim );
1 a1 _2 X$ f& w7 V) z4 k rect.top = HIWORD(nDim);
# L |/ |! O$ _: O. G8 v: \* | }9 `2 g" z6 Q+ A4 T7 t" }
- Q; B- C4 a* f" o
SetTextColor(hdc,pWdInfo->Color);
# y8 `/ ]/ m1 q: z DrawText(hdc,pMyBuff,-1,&rect,0);/ Y ^: Y8 w) [' o
break;
3 z8 t/ @+ {6 V0 B }
9 Z3 J3 O/ J1 ?* }+ b }
, h% ]) L O1 I) k% ^8 S% X pWdInfo = pWdInfo->NextLink;
: r u% Y/ J" P3 E; g }7 P( P9 }/ E! I: U6 s% T# u
}! w" R1 `6 n( \+ z7 G
6 c% o& N7 X0 W( f# c1 U3 J
pMyBuff += nlen1;6 X4 s# v5 v k2 c
nBuffLen -= nlen1;
" C8 O. k- @* V0 | }
/ ^' p' K. m7 ]5 z. U: R0 G, F else
v3 _2 M5 c5 w; M {3 N7 ] n& ?- w5 B n1 Q
pMyBuff++;
- g6 @2 x% A1 k+ r. e: d; J+ h3 f nBuffLen--;
* ]/ B2 y: v+ L0 J6 Q6 H }/ n! M& J" r; g6 d Y' x' v
}
" G) C5 ?4 d; G$ H8 N; ]* g) h; q" h
SelectObject(hdc,hOldRgn); M* _/ l# [1 S3 j( }! r1 N& U
DeleteObject(hRgn);7 b; @9 x) S) s4 N* e9 K0 S
SelectObject(hdc,hOldFont);
9 y+ X* [- d+ z1 H& c, F ReleaseDC(hWnd,hdc);9 b6 \, E8 j5 R- }+ {- Y
ShowCaret(hWnd);2 e" ^4 z$ T8 R, d, j' C( \7 ?3 B& s
return nRet;
+ x2 k$ u c8 [9 a
$ u8 y/ t6 K1 i. B& | }
/ |4 n% n) v8 m; h' X5 y break;
4 H6 H1 s; L2 ~# T1 U case WM_CLOSE:
& {! y" l- z3 s, V. i9 y. S SetWindowLong(hWnd,GWL_WNDPROC,(long)OldWndProc);
. Z, |$ \* v5 w, K6 ? break;8 O) o: F' D e6 x- n W
default:6 ? T# R3 |8 l5 C: z2 m
return CallWindowProc(OldWndProc,hWnd,Msg,wParam,lParam);; X( h, j6 E0 q0 T7 s b' x, }
}
8 C) q2 F7 ]3 i
6 N1 s- J6 C# G# _ return 0;; B3 X) t" I) f7 r" W
} |