原文:http://hi.baidu.com/combojiang/blog/item/6e65d6f322f81bce0a46e0c0.html5 b% J& W" {- q3 ~3 C% X
N+ K7 P; N F- k
在读这篇教程之前先提醒你,这是一个复杂的主题:不适合初学者。这是最后一篇RichEdit 控件教程。
+ }8 H/ C% g& T6 p& f! O' p: }+ n3 l
理论: + A( c$ w# e7 b/ M4 T
语法高亮显示对那些编写文本编辑器的人来说是一个热点主题。最好的解决方法是编写一个定制的Edit控件,这也是很多商业软件所使用的方法。然而,对于那些没什么时间来编写这么一个控件的人来说,次策就是改写现有的控件使之符合我们的需要。 8 ~% j& b+ T8 s: \5 h4 I
[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]控件中的插入点位置处理也有一点问题。
3 W8 I& \! T" q4 D [size=-1]通过上面的讨论,你可以看到使用 [size=-1]EM_SETCHARFORMAT [size=-1]是一个错误的选择,我会给你演示 [size=-1]"[size=-1]相当正确[size=-1]" [size=-1]的选择。4 o+ o; X, y Y0 e% g: Y$ J c
[size=-1]我现在使用的方法是[size=-1]“[size=-1]即时语法高亮[size=-1]”[size=-1],我只高亮显示可见部分的正文。因此高亮显示的速度跟文件的大小根本是无关的。无论是多大的文件,在某一时刻只有一小部分是可见的。
T9 z5 `4 R- [[size=-1]怎么样实现?答案很简单:
) p e6 R/ p% p0 @' Q& 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]之后,我们将要高亮显示的词用不同的颜色来覆盖掉。* a- H3 `5 V. ?* `- b7 R
[size=-1]当然了,路也不是这么容易走的:仍然有两个次要的问题需要矫正,不过上面的方法工作起来很好。显示速度令人很满意。
$ t" W [& U1 d4 M% J[size=-1]现在让我们集中在细节上。子类化处理是很简单的,不需要很多注意力。真正复杂的部分是:我们必须找到一个快速的方法来搜索那些需要高亮的词。更复杂的那些在某个注释块里的 不 需要高亮显示的词。 ; W1 E8 K1 M3 [8 J4 H0 p
[size=-1]我使用的方法可能不是最好的,但是它工作的很好。我敢肯定你可以找到更快的方法。不管怎么说,先看看我下面的方法:
4 z- X7 Q9 [7 E2 k' W1 D- [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]结构。4 B; x2 U$ C' L% F
typedef struct WORDINFO
9 c+ E2 C6 N; z, P- K3 d( x{4 Q* @/ {! L1 T
DWORD WordLen; //词的长度,用来快速比较
. E4 Z! Q5 X9 }! m8 j+ X LPTSTR pszWord; //词的指针
) B- w9 p- b: h# ^4 e COLORREF Color; //颜色值1 S. c; C* e+ J
WORDINFO * NextLink; //下一个 WORDINFO 结构! M2 [& |4 C8 d* f
}WORDINFO;0 w& o8 j% O' [' _; i, U
[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]指向要高亮显示的词。是小写形式的。
" o6 j8 J6 n; W$ u - [size=-1]链表的内存是从堆([size=-1]heap)[size=-1]中分配的,速度快,容易清除,也就是说根本不用清楚。
+ D- H5 l+ C2 C5 q, }! Q [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]中的元素的值,这样所有使用那种颜色高亮的词就立刻使用新颜色显示。
# W# g x, _7 R J0 y) o例子:见光盘FirstWindow33#include "Windows.h"% J1 C* y& I- Y2 F W8 i
#include "tchar.h"
% A7 D& `+ [0 n! s+ ^) x: c#include "Richedit.h"4 r# Q1 c/ X, t" V
#include "shlwapi.h"+ P& `4 c2 I- }5 q. G
#pragma comment(lib,"shlwapi.lib"): A. [4 P7 X" s# V/ V- z* F2 f
6 J3 C9 h4 |- [ Atypedef struct WORDINFO2 g: M1 A F1 s
{% n8 ^% D. e+ a- n, ]4 x
DWORD WordLen; //the length of the word: used as a quick comparison
5 V0 m& Q# X6 S4 F LPTSTR pszWord; //pointer to the word% v' F0 N, `, \0 } q0 h( ~& V5 t# l& V
COLORREF Color; //point to the dword that contains the color used to hilite the word: Q" @* x* A/ A# Z4 L
WORDINFO * NextLink; //point to the next WORDINFO structure* h! j% B# ^+ a# q$ s3 B4 T7 `
}WORDINFO;
. h* X0 U8 Q, \" j
0 ]$ W/ X8 x' Y% O5 s. A#define IDR_MAINMENU 101/ {/ I/ T6 ^0 v9 u4 R
#define IDM_OPEN 40001
! `% A* R, r5 a$ V* m#define IDM_SAVE 40002& U4 E" V ~1 n& L0 ^" k" A( m! n" Q
#define IDM_CLOSE 40003
6 G! L8 w. ]% a' I; u# R2 K+ f#define IDM_SAVEAS 40004) B- J$ g" _$ E6 C0 j2 {1 O) c3 O
#define IDM_EXIT 40005. ^$ T# _. V/ [
#define IDM_COPY 40006
; h& X& ]1 v" u* G) I" t#define IDM_CUT 40007
$ M. F3 B: \7 F% s, T2 V% Y#define IDM_PASTE 40008/ B0 v/ y8 p- K9 r
#define IDM_DELETE 40009 K/ z9 W d) m9 q0 _* v3 v- f
#define IDM_SELECTALL 40010$ k/ ^$ P- A. o0 v* H- ]
#define IDM_OPTION 40011
2 L L" g7 S" C5 \! a$ T#define IDM_UNDO 40012& E0 N) @4 i) ^+ N. M% @
#define IDM_REDO 40013
/ V1 [5 g1 \# ^7 C( D#define IDD_OPTIONDLG 101
$ P5 _+ D. m# D. z7 ~+ W. Q0 {#define IDC_BACKCOLORBOX 10003 _; n8 ~; M9 h9 O; F
#define IDC_TEXTCOLORBOX 1001
- b& o4 v* `, w7 z5 k) ~#define IDR_MAINACCEL 105
4 `9 G% t% W+ K( a3 n" c* k#define IDD_FINDDLG 102
+ \5 @" l8 b- W#define IDD_GOTODLG 103# `6 i! K: q7 A {3 o) S7 }
#define IDD_REPLACEDLG 1049 K; ?2 E6 M: d% e7 }! e0 c. o: N
#define IDC_FINDEDIT 10004 b- L& q Q, p7 Q( i% j
#define IDC_MATCHCASE 10019 W0 [* k2 [# S- x0 v" X
#define IDC_REPLACEEDIT 1001
* U9 I% e2 ^* K5 W#define IDC_WHOLEWORD 1002" W2 t3 w! k. s. U! K* p, ]
#define IDC_DOWN 1003; {) s9 _6 P0 B1 V }: t! I- A8 S7 i9 }
#define IDC_UP 1004
4 L7 ~: g# `, g: G$ ?7 V#define IDC_LINENO 10050 U2 A4 \: V! r
#define IDM_FIND 40014
% B1 k9 i5 W" }# M7 \#define IDM_FINDNEXT 40015
# d% A8 y+ q' @- R- S: n/ p#define IDM_REPLACE 40016, S$ y# E; y J% d/ }
#define IDM_GOTOLINE 40017
0 h- R& L) D7 Z% d4 {/ M/ [9 K#define IDM_FINDPREV 40018) x) V$ {, u4 I. z: `" E3 K
#define RichEditID 300
0 N2 Q# n# w' @: y) ]
8 K) d* P" X p1 u# ~# k
! o R. _# j: s# q; c
, v7 o# S% \% O) G {% z$ ZTCHAR ClassName[] = _T("IczEditClass");
( x) z, W5 o' Y6 |- PTCHAR AppName[] = _T("IczEdit version 3.0");
0 x( e4 P% ]7 ^3 k1 S2 f& D/ @TCHAR RichEditDLL[] = _T("riched20.dll");
% n+ N N* N0 Z& C$ l4 e' @7 vTCHAR RichEditClass[] = _T("RichEdit20A");" O4 [- t3 \1 o E
TCHAR NoRichEdit[] = _T("Cannot find riched20.dll");
" g$ s" G" _6 s7 f7 e1 FTCHAR CppFilterString[] = _T("asm source code(*.asm)\0*.asm\0All Files (*.*)\0*.*\0");
7 p3 p# y) j# b0 \( P1 RTCHAR OpenFileFail[] = _T("Cannot open the file");
9 k- ?+ v8 N+ }TCHAR WannaSave[] = _T("The data in the control is modified. Want to save it?");: ?& G8 d9 m5 w# e- _8 x! v
5 M5 s: o- Q: x3 z! Q" Q C
BOOL FileOpened = FALSE;
2 R5 [; ^% j: lCOLORREF BackgroundColor = RGB(255,255,255) ;
- q9 z9 I& @3 i) rCOLORREF TextColor = RGB(0,0,0);! I4 p4 C! W: U0 O0 M8 l% W0 @
HWND hSearch;" _- \7 f/ z; ~( |$ J
HACCEL hAccel;+ O, D' W4 a* n6 `% |" {2 c
TCHAR FileName[256];
! }0 J2 l2 v7 a0 v0 l% wTCHAR AlternateFileName[256];
$ C. k0 v$ N- x7 ~' Y) IDWORD CustomColors[16];' Z. Y8 D/ [+ u" r9 I2 Q
HINSTANCE g_hInstance;
$ ]2 `$ S3 g0 x3 x/ j9 ^/ hHMODULE hRichEdit;! e* O8 i+ Q. J& [6 i
HWND hwndRichEdit;/ f, ~3 f- C5 I
TCHAR FindBuffer[256];. Q7 J, @ i- S
TCHAR ReplaceBuffer[256];
- X' z; v) ]8 Y+ a/ iDWORD uFlags;' _8 ^0 {* |% T
FINDTEXTEX findtext;
6 Z7 y% [& e, P) n3 ]4 @9 B/ t8 o5 s0 P7 ~
TCHAR WordFileName[] = _T("\\wordfile.txt");: {! F4 e' H! @& l3 q
TCHAR CppSection[] = _T("AsmSection");
" e! Y4 S- ]/ x6 MTCHAR C1Key[] = _T("C1");7 u$ G' I0 _4 E6 ?
TCHAR C2Key[] = _T("C2");
' a9 K0 d/ w$ k9 U) K3 _: Y- PTCHAR C3Key[] = _T("C3");
5 W: _4 |6 v1 e5 oTCHAR C4Key[] = _T("C4");
7 m3 a3 M/ I( t, tTCHAR C5Key[] = _T("C5");
; f- C% U1 _+ n+ n* c8 lTCHAR C6Key[] = _T("C6");) v, y; K& i/ U( }5 Z
TCHAR C7Key[] = _T("C7");
% o6 @9 f9 D% n- L7 N' ETCHAR C8Key[] = _T("C8");8 i/ w4 b. v5 G6 G1 a1 U4 {$ i
TCHAR C9Key[] = _T("C9");0 L6 k# g0 T+ R! |% Z5 H& `6 m
TCHAR C10Key[] = _T("C10");! T2 O# F9 t7 C R$ O4 } T
TCHAR ZeroString[] = _T("\0");
/ @+ v1 }/ c$ j% z% r5 a6 jCOLORREF CppColorArray[] = {
# Q1 |6 H0 ?9 o @ RGB(0,0,0xff),RGB(0x50,0x5f,0x80),RGB(0xff,0,0),RGB(0,0x6f,0x66),+ ~6 m2 t' Y6 d8 l. H4 _1 r
RGB(0xf0,0x44,0),RGB(0x54,0x87,0x5f),RGB(0,0,0xff),RGB(0,0,0xff),9 k% u0 d* D- ?( h! m9 Z
RGB(0,0,0xff),RGB(0,0,0xff)1 \6 } [ j" A9 p6 ]9 Z
};9 V& d) {& Z# K$ I- [- m
* d5 g; r6 L7 }8 z" ^
COLORREF CommentColor = RGB(0,0x80,0x80);
, M8 N% ]) t! ]5 uDWORD CppSyntaxArray[256];
5 u1 j* y- o v# [( v( kWNDPROC OldWndProc;" I. ]$ e M2 h
DWORD RichEditVersion;
) z. L) i% C) e) O1 U& CHANDLE hMainHeap;
' Y. R" p: @0 u/ h8 L* vLONG CALLBACK NewRichEditProc( HWND hWnd, ; l4 ?: P& J- R
UINT Msg,
B# A# H8 f! Q$ G- b WPARAM wParam, ' e) d4 k; h& f8 ?1 ^$ q
LPARAM lParam 6 n# _+ T1 q2 s' I3 H
)
: E* B1 G0 [3 i{
% U0 W+ }" w6 o, t HDC hdc;4 U% r% o, @- L' x, z
HFONT hOldFont;
9 ~ H4 o1 i/ n0 e8 L# d! }8 F DWORD FirstChar;, _, S. d! X& V0 R% G T8 q) t3 ]
RECT rect;
2 {/ u" W: r& q5 c" z, b! K TEXTRANGE txtrange;9 w$ r5 T( W% E- A
TCHAR buffer[1024 *10];7 n9 s7 g/ s/ P: X
HRGN hRgn;/ Y8 N' g4 k/ O
HRGN hOldRgn;
# j- z+ c V" L4 U0 L8 } RECT RealRect;
! ]* z$ ], I8 s- h9 |2 L4 Z1 W5 l5 N DWORD BufferSize;9 Q: O) D' z I( M" K" ~
LPTSTR pString;. k" q) R' m$ {8 n9 S Z
5 F( i5 Z: ~! m% b% I switch(Msg)" n4 \" t% @3 `+ |4 m3 [
{ {* C/ K" o2 |) J; m
case WM_PAINT:
9 `8 ~5 I( t1 F {2 g4 {7 M0 \" K" M9 M4 ~
HideCaret(hWnd);, |" o4 F% R! X, W
int nRet = CallWindowProc(OldWndProc,hWnd,Msg,wParam,lParam);/ w4 u5 }% q- l
hdc = GetDC(hWnd);6 u7 ^, h5 ?5 |9 ~
SetBkMode(hdc,TRANSPARENT);
8 |5 |7 c( l4 D' U SendMessage(hWnd,EM_GETRECT,0,(LPARAM)&rect);
- N9 n8 Q. ]- n/ N6 f' L( \ int nPos = SendMessage(hWnd,EM_CHARFROMPOS,0,(LPARAM)&rect);$ I: p9 ], i1 K+ f/ |
) n9 E9 Q( A) R int nLine = SendMessage(hWnd,EM_LINEFROMCHAR,nPos,0);" P2 `' O* K1 e( }
int nIndex = SendMessage(hWnd,EM_LINEINDEX,nLine,0);9 ~4 `5 `0 d2 {3 c& V
txtrange.chrg.cpMin = nIndex;
+ w% m7 |/ h+ e2 D FirstChar = nIndex;
; a' I u# u/ p* n int nNextPos = SendMessage(hWnd,EM_CHARFROMPOS,0,(LPARAM)&rect.right);3 W8 b# D9 L( O1 v+ K. h: O
txtrange.chrg.cpMax = nNextPos;
/ p2 B: V/ a [8 a, D+ C8 ] RealRect.left = rect.left;
) \) _3 N+ J. D3 m) L! t8 w RealRect.top = rect.top;, `$ H6 c' \' l4 V. y
RealRect.right = rect.right;
. l4 n8 n; E7 G7 U5 i+ W RealRect.bottom = rect.bottom;5 g6 H5 o0 b" W" g( w5 s
hRgn = CreateRectRgn(RealRect.left,RealRect.top,RealRect.right,RealRect.bottom);
3 {1 i3 L- c$ ^/ H! ^1 n$ | hOldRgn = (HRGN)SelectObject(hdc,hRgn);
. N6 E8 Z6 }0 m SetTextColor(hdc,CommentColor);7 K. M7 |/ \4 l- D7 a+ |
. Z- V6 e; v4 N
txtrange.lpstrText = buffer;
, A& z- p7 u% e( m2 J( P1 b$ r BufferSize = SendMessage(hWnd,EM_GETTEXTRANGE,0,(LPARAM)&txtrange);
* Z P* u% Q) g1 C; g3 I pString = buffer;
# C2 C! i6 i* o' \$ v while(pString - buffer < BufferSize)
/ B1 E: L2 V6 c. P- B9 | {) ^6 f! D3 r: {6 e* r8 y! _- s
pString = strchr(pString,_T(';'));
- h9 w7 D$ G3 i7 ] , o5 O! H* i- a( u& h
if(pString != NULL)0 }: g& j( |, [: N, _. S
{
: l( k& }+ @( f" w
: A8 e* {4 V0 E+ f8 n, j txtrange.chrg.cpMin = pString - buffer + FirstChar;
' N' e4 u0 {" `( y LPTSTR pTemp = strchr(pString,_T('\r'));" U, U+ j g/ l) ~1 G
if(pTemp != NULL)( J3 [$ m8 I1 [- N' T
{
: b+ E9 b% {+ g *(pTemp) = _T('\0');
) f2 u7 L+ t# ]$ R# \0 J$ s( ^5 @ }
% {% H e8 ^5 c else
) g$ z( B+ ~5 @1 |( H) \( b0 T pTemp = buffer + BufferSize;6 i y! e7 V- y* W) u
0 e) j) `6 I! i9 i2 b0 c8 f/ z
txtrange.chrg.cpMax = pTemp - buffer + FirstChar;4 o, f; X- o# \+ N1 I8 ?
5 Z8 I" p6 W2 {" h5 i& P
int nLen = txtrange.chrg.cpMax - txtrange.chrg.cpMin;
7 |& h" B) }# C3 I
0 M Y: m7 o& |( N Q6 \% s LPTSTR pstr = pString;; H+ i: T T3 a% k7 U" `
while(nLen > 0); d; P& r4 c7 e
{/ b9 c1 U2 d. e; R0 j7 ?
if(*pstr == 9)- i% Q' @; f6 I1 _
*pstr = _T('\0');, s4 B: M$ @; R
9 d; g; O/ u6 T) U5 v6 v
pstr ++;
, L' n, }* N5 Q* x+ n* g C [ q nLen --;9 m0 J' R' t- o" g9 @2 z7 C5 K
}
+ `# V/ ?0 a! w' I: `) h* D- a! v, X
int nMyLen = txtrange.chrg.cpMax - txtrange.chrg.cpMin;# l/ V; P9 H4 j* [$ ? V
LPTSTR pMyStr = pString;
6 ^9 h( j/ J! t5 K while(nMyLen > 0)
O2 d1 ?* l# ]$ ^" \; D* _ {
* k. G5 r( o. M j* G int nstrlen = lstrlen(pMyStr);# E2 w% J$ q: Z# {
if(*pMyStr != _T('\0'))2 h$ e. T" f3 J& @( f4 U6 M) ]; R) k
{
1 S) ]* b1 L2 @) D5 m if(RichEditVersion == 3): e' w- D+ l# L7 c1 r1 Y& Z
SendMessage(hWnd,EM_POSFROMCHAR,(WPARAM)&rect,(pMyStr - buffer + FirstChar));
. z* O: D" p& \$ v else
- `, Q' a+ a2 d+ h {
6 y6 w9 } B- k: }0 K int nWidth = SendMessage(hWnd,EM_POSFROMCHAR,(pMyStr - buffer + FirstChar), 0);
# C3 m; E! @5 X% ~. V- y rect.left = LOWORD(nWidth) ;
+ k" h/ \# [& A6 P+ H: ?* n rect.top = HIWORD(nWidth);
4 h7 [0 F d& @* @ }
( m/ X9 c& S% g$ a
/ O. _" k' w+ m# \+ G5 l DrawText(hdc,pMyStr,-1,&rect,0);3 H6 H4 T6 @$ d3 ]4 E* ~$ e% o
pMyStr += nstrlen;
3 N' z( L8 {1 D1 \* h3 H) Y7 u/ {# @ nMyLen -= nstrlen;
- M" E3 s5 n5 |7 ?1 W2 X6 H }
( a5 F" n( T3 N% b else
& o& x V5 |% ~! s Z {
B# Q, C9 [! \/ n- \ pMyStr++;
6 H0 N: r% Z8 z' t nMyLen--;% u2 z, h& k' _; |
}
; g. j d, ?8 ]+ E n }& v* ^& q& F( n+ D
. ~: x! K1 j0 V8 C
RtlZeroMemory(pString,(txtrange.chrg.cpMax - txtrange.chrg.cpMin));% _. t1 p e8 `! W
3 H. |4 M; [; G" b6 R; r f
pString += (txtrange.chrg.cpMax - txtrange.chrg.cpMin +1);3 w! q5 ~; y2 ~, r
}
8 \1 I6 c, V( n3 {% r else
. u# F; l! e0 O5 t: H; Z& @9 l- A$ Q break;! l ]0 a8 i0 a P- s) C$ `
* \1 O: l' A: b. j0 {) ~ }
/ A5 B4 A ], n j: G- [/ J2 ?
5 y7 T/ [5 c4 F1 q1 y0 A$ E6 d int nMyBufferLen = BufferSize;( m- h, ^+ U: J1 x4 z
LPTSTR pMyBuffer = buffer;
& J$ N* W( F5 ?2 W while(nMyBufferLen > 0)
9 T1 T! ?* z1 ?# L0 M {) r: F D! `) _* H0 K: w3 |+ n
& S/ G2 N6 N- C- I4 j
if(*pMyBuffer == _T(' ') || *pMyBuffer == _T('\r') ||
4 ~ {" D P# @% z, o6 q- ~! W *pMyBuffer == _T('/') || *pMyBuffer == _T(',') ||
- e' B& O. C6 b! G; p *pMyBuffer == _T('|') || *pMyBuffer == _T('+') ||) I8 |" t; E: H6 D& J
*pMyBuffer == _T('-') || *pMyBuffer == _T('*') ||
6 |8 B; s. K; o *pMyBuffer == _T('&') || *pMyBuffer == _T('<') ||
/ V+ G2 [* s; O7 R) p% C *pMyBuffer == _T('>') || *pMyBuffer == _T('=') ||3 i0 X. ]0 |% g9 H p4 k# L& L
*pMyBuffer == _T('(') || *pMyBuffer == _T(')') ||
' R& r( b1 x7 n1 J9 |* C. B *pMyBuffer == _T('{') || *pMyBuffer == _T('}') ||( r0 ?5 e6 F1 i8 v* N: T
*pMyBuffer == _T('[') || *pMyBuffer == _T(']') ||9 q5 Q2 | c, Z3 g, N+ {% C9 g. N
*pMyBuffer == _T('^') || *pMyBuffer == _T(':') ||
) W' d& G& ?6 U- X' r *pMyBuffer == 9 )/ H0 l( B0 x. @2 q7 a
{1 @. ^. b4 ]" |9 t
*pMyBuffer = _T('\0');# h9 a: ]: ]# F" l
}, l+ `3 e7 O6 Y7 k" R( a- v3 a6 k7 F
pMyBuffer++;
8 ^0 i9 b' J/ o# k$ B: s nMyBufferLen --;- Y& {+ i( R9 p7 ^, T4 `- ^
}
' a0 @$ J" Q- \ t/ ~" Q
2 Q8 Q' l) f; Q4 i int nBuffLen = BufferSize;
t/ z+ j2 f* U) W LPTSTR pMyBuff = buffer;
$ U1 |; t9 z H4 w" m% Q+ w while(nBuffLen > 0)2 T* s2 \/ f' p
{* A9 u( z) q2 n# Y
if(*pMyBuff != 0)# t9 v9 y8 z0 V E) V4 P; g
{
, @' V: w% o n7 x% K: r int nlen1 = lstrlen(pMyBuff);
: g, u6 n/ X' o! k% T CHAR cChar = *pMyBuff;2 i3 x" [& ^4 Y
if(cChar >= _T('A') && cChar <= _T('Z'))7 c! |/ n' x! @$ V4 d
{
; q( f1 p" c8 S7 N3 o8 a cChar -= _T('A');
1 O9 H& f0 H. Y1 N! U2 e cChar += _T('a');1 J8 i9 ?% A. J" ^7 c- ?
}
! |; }. x5 E5 x & d1 M c3 `. w. a
if(CppSyntaxArray[cChar] != NULL)' @0 L, e% e+ D. V9 y5 y/ p
{2 {; p r+ O) j9 V% _( w( q2 ~* B5 v
WORDINFO *pWdInfo = (WORDINFO *)CppSyntaxArray[cChar];
/ j# k% t4 k- g1 p9 U1 ^8 r, f while(pWdInfo != NULL)- o8 T+ Z# E/ |0 R
{' G+ U, D C/ h/ b) ]# {/ |! `
if(nlen1 == pWdInfo->WordLen)3 ^$ N& Q. r' C# ?3 s$ v
{8 k; i7 k$ f& y+ }* t7 y
if(lstrcmpi(pWdInfo->pszWord,pMyBuff) == 0)
0 @4 [3 m e6 G4 k9 `1 B/ ~ {
- T6 y6 Q% g3 M7 X. P8 C; q3 G- } if(RichEditVersion == 3)" ]/ V. O1 f% q3 h, v
{$ s, H# V, d. Z7 G% K6 l/ ? i; a
SendMessage(hWnd,EM_POSFROMCHAR,(WPARAM)&rect,(pMyBuff - buffer + FirstChar));
. w7 F: k- I. p* S8 s: r/ @" q1 F }' {) M9 @* L9 i6 f, K
else
& k# t. A7 W$ O) v1 r$ { {2 W: a% I5 u% D; o/ P: k, U; g
int nDim = SendMessage(hWnd,EM_POSFROMCHAR,(pMyBuff - buffer + FirstChar),0);
& N+ E% r+ Q% |) g rect.left = LOWORD(nDim );
" N$ X8 b. b+ r# s! }+ e rect.top = HIWORD(nDim);
# R' T! x8 u4 i$ A }5 N8 L$ w% n& o3 }
) v8 p2 ^* E2 }* ` SetTextColor(hdc,pWdInfo->Color);
7 P% d3 M) L& x5 \& w! | w7 U" l, P+ @ DrawText(hdc,pMyBuff,-1,&rect,0);& ]1 V1 G) w7 B; X0 j- C f
break;
4 n% R; v1 T% j3 R, a }
6 U" r4 P, H/ b }
" i& X6 F- o$ }0 d5 o; h pWdInfo = pWdInfo->NextLink;* A6 R9 n$ d4 [7 z3 i8 j
}
: g0 ] `9 f' e5 X% z }2 B/ [4 i9 ^; z) x% Q$ F
9 ]$ o( T- k! O$ Y pMyBuff += nlen1;+ R( e; O; V$ |
nBuffLen -= nlen1;
5 _( q5 [& h! B$ r }6 ~# F/ `) w, ^% x8 w( W5 b7 s
else N6 p7 g; D9 Z5 K9 k. R
{/ R3 ^( C, O9 y1 N6 E4 R8 [
pMyBuff++;3 E& M$ S4 I% @9 V
nBuffLen--;7 K$ X) H6 P6 i+ w8 t" Y
}+ W+ K" i& @# `
}1 C( E( A8 \6 h0 g3 R+ q
" M A9 O x" E, r( h SelectObject(hdc,hOldRgn);
0 o) L) s( w0 w+ _1 C DeleteObject(hRgn);
8 u! P3 ^9 L+ S5 [ SelectObject(hdc,hOldFont);
5 k4 D% h) n& m4 g ReleaseDC(hWnd,hdc);
/ v/ V1 j% q2 N2 m+ c5 ` ShowCaret(hWnd);7 ?0 f2 Q, E# @( V: f2 ^' Q
return nRet;
3 K$ @6 y7 Z2 J0 k" K& b1 b( U& o/ k* o3 c9 B% w' _
}
* O4 g- _$ E Z7 E% u( p' h1 U break;) v$ E8 }" q. N, A6 x- N
case WM_CLOSE:
- k" _& d- k0 u* k SetWindowLong(hWnd,GWL_WNDPROC,(long)OldWndProc);
; g5 X) E* t0 a6 ^2 A, E* ~ break;6 _" Z R: F1 H& p
default:
9 E% A7 c Z% _% F return CallWindowProc(OldWndProc,hWnd,Msg,wParam,lParam);
% v7 C1 n6 f. N8 M }
5 U: k. S4 S$ E. O; w0 L, j1 s1 i6 Q/ u# h0 o$ T$ S
return 0;
1 Z6 \0 w- [- ]7 e% b5 `} |