原文:http://hi.baidu.com/combojiang/blog/item/6e65d6f322f81bce0a46e0c0.html$ Z" y, \( X+ A% `. `0 X
2 }( ^4 n) n/ r
在读这篇教程之前先提醒你,这是一个复杂的主题:不适合初学者。这是最后一篇RichEdit 控件教程。. q: W8 K9 G" I. W
/ k ~* C7 e9 |3 m. e7 X
理论: 9 i7 V& L- a; R1 q, W1 ~. M
语法高亮显示对那些编写文本编辑器的人来说是一个热点主题。最好的解决方法是编写一个定制的Edit控件,这也是很多商业软件所使用的方法。然而,对于那些没什么时间来编写这么一个控件的人来说,次策就是改写现有的控件使之符合我们的需要。
" f- Y# ]* d) s$ l7 U[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]控件中的插入点位置处理也有一点问题。
% j5 x( v( u% t) T [size=-1]通过上面的讨论,你可以看到使用 [size=-1]EM_SETCHARFORMAT [size=-1]是一个错误的选择,我会给你演示 [size=-1]"[size=-1]相当正确[size=-1]" [size=-1]的选择。; I; j% C- Z3 W* c: V) ]1 ]
[size=-1]我现在使用的方法是[size=-1]“[size=-1]即时语法高亮[size=-1]”[size=-1],我只高亮显示可见部分的正文。因此高亮显示的速度跟文件的大小根本是无关的。无论是多大的文件,在某一时刻只有一小部分是可见的。
8 j) M1 V5 c) A4 h4 P[size=-1]怎么样实现?答案很简单:
; H. f: M) H* [/ t0 q- [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]之后,我们将要高亮显示的词用不同的颜色来覆盖掉。, Z9 K9 _8 G' B; h) h8 V) Q
[size=-1]当然了,路也不是这么容易走的:仍然有两个次要的问题需要矫正,不过上面的方法工作起来很好。显示速度令人很满意。1 W0 M+ g7 @* J) L; W7 N) G& Q
[size=-1]现在让我们集中在细节上。子类化处理是很简单的,不需要很多注意力。真正复杂的部分是:我们必须找到一个快速的方法来搜索那些需要高亮的词。更复杂的那些在某个注释块里的 不 需要高亮显示的词。 - J4 Q0 {6 c1 I$ I1 k: a( \$ E
[size=-1]我使用的方法可能不是最好的,但是它工作的很好。我敢肯定你可以找到更快的方法。不管怎么说,先看看我下面的方法:
2 e8 ~* ]& f, M1 r- 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]结构。
7 T; Y+ ~& B6 o$ [. l typedef struct WORDINFO. Q7 d7 q& I3 ? R& R8 Z+ n
{
3 F9 O+ E; K) P: W9 @ DWORD WordLen; //词的长度,用来快速比较# _) |/ o/ X. {/ X+ W
LPTSTR pszWord; //词的指针8 [3 `6 o! z( X- j7 K: M8 v
COLORREF Color; //颜色值
8 r, e4 t: {5 |6 A' W WORDINFO * NextLink; //下一个 WORDINFO 结构
! _2 C6 S8 V- x. b}WORDINFO;. `, O4 o3 M0 i' e% |$ B, 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]指向要高亮显示的词。是小写形式的。9 ~: W( @# _$ y8 A( n1 I& D* K$ m
- [size=-1]链表的内存是从堆([size=-1]heap)[size=-1]中分配的,速度快,容易清除,也就是说根本不用清楚。1 f* \6 R5 V7 \ Q4 z# L( [
[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]中的元素的值,这样所有使用那种颜色高亮的词就立刻使用新颜色显示。+ A* E; {- k& `6 ^! o
例子:见光盘FirstWindow33#include "Windows.h"7 c8 N) I( P ~% K( g
#include "tchar.h"
( `. @) l9 B0 f) G) }9 ~#include "Richedit.h"
$ J6 F, |7 n) _+ O#include "shlwapi.h"3 K! a8 @& f T E8 j" S
#pragma comment(lib,"shlwapi.lib")+ }2 ]' K8 ~& g Q p
+ n2 l O' u5 d5 S; E0 S9 K" @
typedef struct WORDINFO
" g/ ^; Z, D- p3 U& r0 q3 F{
! Z! }! B+ _: M" w7 G2 M DWORD WordLen; //the length of the word: used as a quick comparison; J9 v3 o# ]) V
LPTSTR pszWord; //pointer to the word9 E; X/ z; J4 u; H& n( s
COLORREF Color; //point to the dword that contains the color used to hilite the word
5 e: |. ~3 p$ ~4 V( x; I% @6 B: K! t WORDINFO * NextLink; //point to the next WORDINFO structure
+ E; X1 Z/ p; @- {' I- ?4 {& y0 }}WORDINFO;2 W+ C2 e0 @3 E2 M7 t; N& s
% [5 z! _" Z A: `* ^$ t
#define IDR_MAINMENU 1017 p# D& o7 L9 Y P2 V
#define IDM_OPEN 40001
) U" C4 N2 c5 M: [9 _ }7 ]8 a#define IDM_SAVE 40002
0 {% }) x: t/ y- q8 _$ D#define IDM_CLOSE 40003
+ _. a. U' d, b; ~# a#define IDM_SAVEAS 40004& Q$ b8 k, p# s" ]' P/ U# l
#define IDM_EXIT 40005
- a3 D& o) M4 J! R4 u! u#define IDM_COPY 40006" n; l9 K# s9 ?6 d# x
#define IDM_CUT 40007
/ T% Q4 R B% L& n* ?" @+ {! Y#define IDM_PASTE 40008* x) A; e* [2 ~5 F( t& m$ Y2 W
#define IDM_DELETE 40009
1 ^2 \+ B# W- J#define IDM_SELECTALL 400100 h. N* b( C% T' S" j5 x) Z
#define IDM_OPTION 40011/ I6 t# o f% `/ u3 o3 C
#define IDM_UNDO 40012
8 d7 H* A/ r" B/ O#define IDM_REDO 40013
& t* m$ B$ j, @1 H#define IDD_OPTIONDLG 101
- F+ |- x/ _" i9 ]- H! v3 J#define IDC_BACKCOLORBOX 1000
) A) J5 D# h. i: a7 Q# @, }#define IDC_TEXTCOLORBOX 1001
/ \8 |3 U# L$ U6 m' ~& z" W; D#define IDR_MAINACCEL 105, l: I7 l# L7 N. I" [: V
#define IDD_FINDDLG 1028 p& x# o" O7 u. { J1 J
#define IDD_GOTODLG 103
/ `0 [) t# w- N; d5 y/ r% w: Y#define IDD_REPLACEDLG 104$ Z7 M3 n: R9 a( B# c
#define IDC_FINDEDIT 1000 O! M1 e% {' f6 S' @( h1 c
#define IDC_MATCHCASE 1001( ~2 `! n+ M: P
#define IDC_REPLACEEDIT 1001 [0 L' I4 |- p i. F5 [
#define IDC_WHOLEWORD 1002
" B! @/ I/ l: o7 S#define IDC_DOWN 1003. |" O. _; P' e) ^
#define IDC_UP 1004- o% W# g: b P V: W
#define IDC_LINENO 1005
7 b8 I' G% n" f3 [1 m, y1 l#define IDM_FIND 40014
+ j2 ?& s# M. o8 M5 F6 c6 Q#define IDM_FINDNEXT 40015
4 S8 c/ @% m# z- T0 J. `#define IDM_REPLACE 40016
1 C" ^3 R. \+ H# s2 D$ v6 y#define IDM_GOTOLINE 400178 C# y- x2 ^4 F5 k5 U
#define IDM_FINDPREV 40018
+ U. c# F7 T) ~7 c' f#define RichEditID 300
, K% Z, H6 v8 ?4 p
+ G, q. ?- c6 P0 p3 E
5 p/ Q s: G1 e8 U, |6 S! h3 W
$ H& C+ @; [+ z3 T8 V& ^8 ]8 ~TCHAR ClassName[] = _T("IczEditClass"); U) H. \" u, D% U0 `) k: ?7 L4 h
TCHAR AppName[] = _T("IczEdit version 3.0");
- L! D6 P; V3 ^% ETCHAR RichEditDLL[] = _T("riched20.dll");
7 @: |$ o: o/ n7 |2 ^TCHAR RichEditClass[] = _T("RichEdit20A");# E* f7 h! f1 o8 u5 I- x
TCHAR NoRichEdit[] = _T("Cannot find riched20.dll");
, e0 w0 d( l1 q; P+ {7 A; E- u7 gTCHAR CppFilterString[] = _T("asm source code(*.asm)\0*.asm\0All Files (*.*)\0*.*\0");4 j) @- f" {% c9 {4 @7 S" P
TCHAR OpenFileFail[] = _T("Cannot open the file"); [/ W# ]2 m, ^* C7 Z
TCHAR WannaSave[] = _T("The data in the control is modified. Want to save it?");
. H. h7 f; ]) K9 a& q
* A2 C% [( B' J; NBOOL FileOpened = FALSE;0 }$ H3 x2 F. A$ e- l; `0 A
COLORREF BackgroundColor = RGB(255,255,255) ;
x/ E7 H. K. g! OCOLORREF TextColor = RGB(0,0,0);
8 ?/ ^: h6 l7 N3 A# AHWND hSearch;
5 {4 ]+ ^5 b6 I5 b3 @* AHACCEL hAccel;5 ]' [& X) R9 e/ r4 {8 a
TCHAR FileName[256];$ I" L1 J6 M2 y
TCHAR AlternateFileName[256];, m8 n* P9 k$ D9 \% B. H3 V
DWORD CustomColors[16];
. ], @" P5 \" `0 rHINSTANCE g_hInstance;
/ b! j) Q9 h8 V8 M/ hHMODULE hRichEdit;
1 [0 f+ D: G$ THWND hwndRichEdit;8 n" I7 Y+ N# ]1 Y S
TCHAR FindBuffer[256];
# L2 }0 }1 u" w: ITCHAR ReplaceBuffer[256];
Z8 S l% H" ~0 x! W7 KDWORD uFlags;( p% o* A- b+ w+ T3 O4 g6 s# L
FINDTEXTEX findtext;" u* K1 d$ g8 I1 B* P: |$ r; Q* K
- \) w) ~% ?' t: z5 V# [: l6 |- E# C3 m, uTCHAR WordFileName[] = _T("\\wordfile.txt");) t6 x# D6 f4 X7 P$ U
TCHAR CppSection[] = _T("AsmSection");! u# L# A& Y1 N7 m* \% Z
TCHAR C1Key[] = _T("C1");
% s% S4 w# L* @- }! G" YTCHAR C2Key[] = _T("C2");9 `) I/ I0 k! _% k0 o' ~7 K
TCHAR C3Key[] = _T("C3");" A2 p9 R* \2 }- ^+ i1 A3 |' @
TCHAR C4Key[] = _T("C4");
, g; Z7 q/ j$ U# X7 [TCHAR C5Key[] = _T("C5");
* p5 t; U; i6 zTCHAR C6Key[] = _T("C6");1 n8 c6 y h$ q, \1 @# M( `
TCHAR C7Key[] = _T("C7");0 R' r6 \7 M8 x; t
TCHAR C8Key[] = _T("C8");$ O, v7 ~( v% C6 l& D' ]
TCHAR C9Key[] = _T("C9");% u- O& A% F n0 @
TCHAR C10Key[] = _T("C10");
! f; X8 x" y+ vTCHAR ZeroString[] = _T("\0");
L# t s1 {- M5 h+ N2 zCOLORREF CppColorArray[] = {
. F: x& _) z1 b" c+ { RGB(0,0,0xff),RGB(0x50,0x5f,0x80),RGB(0xff,0,0),RGB(0,0x6f,0x66),
/ |0 b2 |7 \% P- x RGB(0xf0,0x44,0),RGB(0x54,0x87,0x5f),RGB(0,0,0xff),RGB(0,0,0xff),
- w2 z* H* |* l8 e: d RGB(0,0,0xff),RGB(0,0,0xff)
+ O R# H/ S7 Y' w4 B6 ^};
# M2 D* Y4 G7 ^/ X3 F% i5 s. X: N
% Z5 s5 L# A5 t5 W" w5 f3 |# gCOLORREF CommentColor = RGB(0,0x80,0x80);7 h& U/ j3 ~8 f) O3 N: z l
DWORD CppSyntaxArray[256];9 k+ I! K$ J: B9 T( l
WNDPROC OldWndProc;
; M, ^+ n* R. C2 T' lDWORD RichEditVersion;
5 F: |* p9 A, f2 Z/ m% d( _HANDLE hMainHeap;
' ^. f9 ~. P3 }* e7 P0 fLONG CALLBACK NewRichEditProc( HWND hWnd,
5 p3 Z1 y- K- c9 U, w3 \/ B1 o UINT Msg,
+ p7 ?- o* ~7 T- r, K* O# M4 H3 U WPARAM wParam,
& q+ G. Z x9 E LPARAM lParam # g- D3 S$ _1 p( D
)7 s# L6 B2 x c$ i6 s- @
{
) `% T# r3 L' @; x) X! a HDC hdc;
. a$ a7 y" M Y9 m0 Y4 @ HFONT hOldFont;
3 t+ i6 p' K! l* n. d* M DWORD FirstChar;6 L4 k& @' D8 p2 @# ^! ~
RECT rect;6 c" `- M% x% _7 J3 G: w. z
TEXTRANGE txtrange;
# j6 f g# T/ Q, `8 N6 }6 L3 h TCHAR buffer[1024 *10];
2 s+ Q# Q6 D' z+ D# K HRGN hRgn;. t1 @8 L7 C% n6 `" F: \
HRGN hOldRgn;
6 `3 F6 i" {8 V ]6 g2 X* V, l1 ^ RECT RealRect;2 {' @7 A2 R4 L
DWORD BufferSize;$ S% M$ y: o: T
LPTSTR pString;
! N3 ~5 S5 b, @7 ?- G" i* k' S. _9 |: C' R$ e
switch(Msg)
2 U# O3 s. A, d+ d4 r8 @ {6 B% s3 O+ s% \! k
case WM_PAINT:
( v) B+ P7 H& [8 ?( j {
( j5 i% M+ F) X# y3 c* X HideCaret(hWnd);" B' H- ^, ^3 y- B
int nRet = CallWindowProc(OldWndProc,hWnd,Msg,wParam,lParam);( ~9 o/ X# O" f2 E8 v7 M B
hdc = GetDC(hWnd);- S# K3 Y4 g# q0 H7 y* H
SetBkMode(hdc,TRANSPARENT);" ~% G/ h8 a8 h6 a# `/ |2 R8 j
SendMessage(hWnd,EM_GETRECT,0,(LPARAM)&rect);+ y+ M d: D% `
int nPos = SendMessage(hWnd,EM_CHARFROMPOS,0,(LPARAM)&rect);, M3 T9 G4 `9 y7 e' o
7 N' [8 b. W) O( c4 `# a7 L! e int nLine = SendMessage(hWnd,EM_LINEFROMCHAR,nPos,0);
8 O; g: ]: O: c3 N. M int nIndex = SendMessage(hWnd,EM_LINEINDEX,nLine,0);
; T. r" v- h9 R0 T txtrange.chrg.cpMin = nIndex;3 d& X/ E& t+ E$ q4 u
FirstChar = nIndex;) g3 i# H9 ] @; K4 ], w
int nNextPos = SendMessage(hWnd,EM_CHARFROMPOS,0,(LPARAM)&rect.right);7 ^! {( ^# m4 C; d* C* [
txtrange.chrg.cpMax = nNextPos;5 @, s$ A, y) Y" M" K! W
RealRect.left = rect.left;$ {8 p/ N" e8 ?6 D
RealRect.top = rect.top;
4 E) `* Q7 f) q- m+ }$ e5 t, w RealRect.right = rect.right;& l4 R: x9 [0 ^( X* B
RealRect.bottom = rect.bottom;( c+ C( a$ y8 d0 ]/ U _
hRgn = CreateRectRgn(RealRect.left,RealRect.top,RealRect.right,RealRect.bottom);
8 }/ {6 n, C) f6 t$ n hOldRgn = (HRGN)SelectObject(hdc,hRgn);6 f' q9 K! m7 \/ ?
SetTextColor(hdc,CommentColor);; M# r' }+ s. C; a( g' x* e- Q- Y
& b0 O" s& A6 \" ? txtrange.lpstrText = buffer;
0 c1 q9 h7 T3 O# K8 U BufferSize = SendMessage(hWnd,EM_GETTEXTRANGE,0,(LPARAM)&txtrange);
3 [. N' ?( k( w) l' X7 |5 Z* V5 O% t pString = buffer;
6 P; J9 u/ O# q" Z3 l1 o while(pString - buffer < BufferSize)0 D( w8 M f5 P7 {
{
m: j' T5 r0 `8 T pString = strchr(pString,_T(';'));
. S/ R5 V3 p% T2 I+ Z6 w ( Y' B& H% f0 N' E" n! r% P% K
if(pString != NULL)0 s' N/ T$ L- a x6 R* N9 l4 E
{& h/ T. G! L9 G5 N F
. t" ^4 O* i W( Z* k7 q7 h( d! U
txtrange.chrg.cpMin = pString - buffer + FirstChar;: A; z4 T4 {' y8 q& P4 r: B
LPTSTR pTemp = strchr(pString,_T('\r'));1 |0 M7 N" u6 S* o$ @ H; f" C
if(pTemp != NULL)+ s' f" z9 t7 Y5 t7 m6 ~
{
' B j/ b0 w: I" x- H *(pTemp) = _T('\0');, K1 A8 s$ C0 I
}
+ j) e6 i, t! k" c else
$ r z! j; ~. |) T1 W! p! m- m pTemp = buffer + BufferSize;
/ u7 X+ T0 U6 ^' m Y% H/ Y1 }
. p/ g3 F) n+ T$ f/ w$ d& m+ g txtrange.chrg.cpMax = pTemp - buffer + FirstChar;
) u- Y' b. d4 N
( ^" e/ A* r3 O$ t: M3 r int nLen = txtrange.chrg.cpMax - txtrange.chrg.cpMin;
& S% ?; l6 v6 y
: P0 @- K/ s9 }8 H) r* v LPTSTR pstr = pString;
" j5 s" Y+ E6 t while(nLen > 0)( a3 x, H! B3 |/ c; ~" ]" b8 w
{$ e8 O* P& C7 T! C/ D( M& P5 } _
if(*pstr == 9)( t3 x l s! X/ B% F3 C4 G" ~
*pstr = _T('\0');
9 d5 @- [: W( W1 U" M
8 b7 Y6 C" ?; c2 F pstr ++;/ I, B0 x% y; R8 \& ]; V9 ^' m
nLen --;5 ? }; T0 }) S" ?
}8 J: m/ e ~9 k- w6 A
) ?# d+ b: o, F' v2 V
int nMyLen = txtrange.chrg.cpMax - txtrange.chrg.cpMin;
" Q, g% s8 P& ^! w% U LPTSTR pMyStr = pString;
. @6 C4 e+ S3 r ~- C* P while(nMyLen > 0)3 B9 v+ l( Z' U
{# k( d% T7 R: T" S% z
int nstrlen = lstrlen(pMyStr);. k# T- V# x7 L7 Y# [
if(*pMyStr != _T('\0'))0 |8 y& ]0 E& s! }* M `0 [2 s6 M
{
9 j3 C! C3 N2 l0 o5 g if(RichEditVersion == 3)5 j# n# [8 G. R! ~2 }' S
SendMessage(hWnd,EM_POSFROMCHAR,(WPARAM)&rect,(pMyStr - buffer + FirstChar));
# u( P- g: L! F5 w3 U4 v9 e else) r: p. [) o( q
{
! a# `, P: S) r$ b" H int nWidth = SendMessage(hWnd,EM_POSFROMCHAR,(pMyStr - buffer + FirstChar), 0);
7 `1 O9 y. ~2 [5 n9 Z3 C rect.left = LOWORD(nWidth) ;
% O+ h. ]0 s- V& A/ W/ _ rect.top = HIWORD(nWidth);0 a% Y& W! Z9 J5 B( i0 V
}4 D+ V1 U9 k) K+ I
. F$ ^; u0 h0 O1 S, z2 o( J. _5 m
DrawText(hdc,pMyStr,-1,&rect,0);
3 |2 ]' I- |) c9 D# E pMyStr += nstrlen;
$ G9 u$ u2 u5 w' B nMyLen -= nstrlen;
$ P0 ^7 c! ~" ^* R }5 f& R' o1 _% T9 l( }- }8 A5 e3 y
else6 ^; W4 i+ U8 n/ b
{$ F7 s$ @1 F1 @3 u* w9 A+ c3 O
pMyStr++;
7 d' T! R6 R9 `# n. ~ nMyLen--;7 a$ S- H! J/ ~0 v3 f
}4 C/ Q! Y. p1 e7 o, c
}
! e0 S2 H1 r& G! `* b8 R9 ^2 ^! j: _! K- p; ]
RtlZeroMemory(pString,(txtrange.chrg.cpMax - txtrange.chrg.cpMin));
0 |6 o( f* f: W7 X! ]9 B! d P/ p , L; p0 R2 b' F- v1 z. u* }; {
pString += (txtrange.chrg.cpMax - txtrange.chrg.cpMin +1);
5 i2 \& i/ R7 }; v) J' C) k" c' Y7 \ }( O& i+ s! G; a8 Z
else& ^1 ?7 c% w% Z3 M) R- K
break;* y1 p1 J! ?) H" R8 q/ k6 q
% S _5 x4 @+ K0 S8 x# ]% z! p' K0 u5 ~
}
[9 n1 D5 y/ d2 p' h" o& `5 H" X% F* Y' c
int nMyBufferLen = BufferSize;
& T, l7 ^6 H8 m, d LPTSTR pMyBuffer = buffer;
+ L8 }; s% i$ s" Q while(nMyBufferLen > 0)
& f; i6 D9 m0 M0 l- k8 o$ t {
0 `. D) B3 A3 c4 }
4 k5 N1 }! r* g* _ if(*pMyBuffer == _T(' ') || *pMyBuffer == _T('\r') ||) x, F; @8 s7 z k
*pMyBuffer == _T('/') || *pMyBuffer == _T(',') ||
8 c( M; @4 ~5 d* b" W& U6 z5 v *pMyBuffer == _T('|') || *pMyBuffer == _T('+') ||
) M* _; {; y) G& B9 g7 O, T1 ? *pMyBuffer == _T('-') || *pMyBuffer == _T('*') ||* r0 t4 p9 i6 T( A8 C
*pMyBuffer == _T('&') || *pMyBuffer == _T('<') ||
6 r0 T9 s& o2 L *pMyBuffer == _T('>') || *pMyBuffer == _T('=') ||0 M' B* B) Y% K5 g% N" E' t" `
*pMyBuffer == _T('(') || *pMyBuffer == _T(')') ||; B6 ]$ v; Q6 S" b
*pMyBuffer == _T('{') || *pMyBuffer == _T('}') ||. i% q, ~0 [( x) g2 G# u
*pMyBuffer == _T('[') || *pMyBuffer == _T(']') ||( V p( t6 A* [) S) m B& `9 `, u
*pMyBuffer == _T('^') || *pMyBuffer == _T(':') ||# z4 U# h& n7 i
*pMyBuffer == 9 )
\; D& p, s* e! S% q3 u/ b {
: G; d+ Q0 N' N6 d& T6 a: g; z N- G *pMyBuffer = _T('\0');' `" u0 n& \1 W8 R
}
8 G, E9 L# e, e# q! k pMyBuffer++;& M9 _5 m2 M$ c5 N1 x: V5 T
nMyBufferLen --;6 `8 c2 g7 R1 w7 x& t
}( f3 Q2 [& S4 M# Q) q' m
' ?1 h7 E; N% a1 O, J# a' g& x
int nBuffLen = BufferSize;3 @3 Z& C0 T0 U+ [
LPTSTR pMyBuff = buffer;
8 @. s" D) K- b0 s P3 R& j; Y, _ while(nBuffLen > 0)
9 a. @8 u8 W9 f1 C {. I4 a* z) `! s4 c/ F" j; e4 y
if(*pMyBuff != 0)
2 q. c% G% L, i, y2 B {6 ^2 s+ n% e8 q; l) e ?2 T
int nlen1 = lstrlen(pMyBuff);, A( d2 e, k3 l* P- \! z
CHAR cChar = *pMyBuff;
% j: k; z! S5 @6 S if(cChar >= _T('A') && cChar <= _T('Z')) y+ K1 S7 Z' Y' W5 R& e
{! @2 b" \, @! [
cChar -= _T('A');
4 b* F. E7 G8 |! b$ _/ U cChar += _T('a');; Y2 ^" U: {5 w( ]( Q& l7 q. k
}
2 p. U+ X6 C6 q1 i
) f% [; B7 C. R, `& ~3 }) E- s if(CppSyntaxArray[cChar] != NULL)
9 ?& O) I" @% S+ z+ { {
' J$ A9 E1 n4 z( J0 i2 X7 c WORDINFO *pWdInfo = (WORDINFO *)CppSyntaxArray[cChar];
* D) P, J k: N: O1 h while(pWdInfo != NULL)
% Z* d t V0 t# {) E$ ], _ {1 A2 ]8 C5 ]8 `& w. I; M; G0 a
if(nlen1 == pWdInfo->WordLen)/ F( ^$ ~, O1 K
{( p C# j5 n9 {9 o- t4 K5 G3 ], o% y
if(lstrcmpi(pWdInfo->pszWord,pMyBuff) == 0)
) Z4 H# V$ C) s( S/ J {$ L' n- L% m( Y0 V4 L
if(RichEditVersion == 3)6 X% [: L: f! Z6 H" f, F- [
{2 |0 n) }) x- y. ^8 R: Q6 Q U
SendMessage(hWnd,EM_POSFROMCHAR,(WPARAM)&rect,(pMyBuff - buffer + FirstChar));
% @/ x) h7 p) m+ W, T* k }. F8 P2 u. L; B& R
else$ \9 L! { v0 k( F' B5 k% ~
{
0 p* Z u$ j0 K) O2 s- n% z3 g int nDim = SendMessage(hWnd,EM_POSFROMCHAR,(pMyBuff - buffer + FirstChar),0);
1 w* f1 `! {5 u4 q' Q, @ rect.left = LOWORD(nDim );
$ Q9 g& u2 A+ i3 D% x, v1 k rect.top = HIWORD(nDim);( Y9 v& ?. j M' B& j5 U
}
8 g, B/ G' m6 g7 X' X# D1 ]2 }
6 M/ g! g! c$ ^" n6 F SetTextColor(hdc,pWdInfo->Color);6 }; F% B" v. z4 _$ l3 I# _
DrawText(hdc,pMyBuff,-1,&rect,0);
; U$ ^: H* ^8 a break;
2 A% d$ r$ r% V: C, U }$ ~$ }" a; G) M8 i, z1 ~: B1 o
}; i# E% k0 `( R* H+ {
pWdInfo = pWdInfo->NextLink;. ?1 ?6 c5 P! O( b. O. r2 B: w
}
. w1 ?/ Y2 o9 ?7 Z }
0 v; b+ F3 e& [; A9 M
8 }" G; c; O3 S3 @. Q! c. ~7 ? pMyBuff += nlen1;' }) |& w( S9 ?1 ?
nBuffLen -= nlen1;
" T/ x; @: L2 g, g4 p0 E7 U- h }
) x% b( A. x" L0 |, `& k' |2 ` else
$ i$ O3 U% q8 Z5 v8 y- O/ a( z {
7 |6 x% M, d1 o9 b pMyBuff++;/ t! j- e; O: F9 \5 B& P+ |) d$ q
nBuffLen--;/ F1 c! x; D) G/ ^, E. V
}
8 Z2 J) M. {# B6 t8 r3 n% g }. B' N/ _9 F. E! }' [4 c1 `
' R% }. l2 A( |2 E5 b
SelectObject(hdc,hOldRgn);/ \& K7 b4 n3 f8 j
DeleteObject(hRgn);" D+ y) x" G$ b0 p+ L
SelectObject(hdc,hOldFont);4 ^, t, x2 m6 o
ReleaseDC(hWnd,hdc);5 G$ t7 d0 t! T6 A# s; [( e6 H
ShowCaret(hWnd);
, ]; W- ?: \0 S) g0 r return nRet;
" r. Z( h5 g3 F( f) _5 f# K- Q" M" C/ }4 L! n
}
0 U- z' L- ?/ w3 n break;, o' J0 G( h7 ~
case WM_CLOSE:9 B2 @% _2 u+ {0 S: O
SetWindowLong(hWnd,GWL_WNDPROC,(long)OldWndProc);
- `& ^0 x, b+ ]& Z/ } break;
' h7 Q; j$ q3 q) e* [% |, w default:
1 e4 [; R( I5 h5 |! o v return CallWindowProc(OldWndProc,hWnd,Msg,wParam,lParam);) g6 k3 U% X8 g5 [: v) i
}" U2 s0 w: g, V% a
0 r1 I, W0 k# l+ u# D return 0;; u# _5 @7 q A) S; Y+ N
} |