直接進入正題:
在RichEdit中實現關鍵字高亮的簡單方法。
如果要真正實現RichEdit的關鍵字高亮,那麼基本需要把整個RichEdit控件都重寫一遍,需要很大的工作量。
既然不想花太大的力氣實現,那實現出來的效果多少會有些差別。
在這裏,實現的方式是在RichEdit中邊輸入邊接收信息,逐一和已存的關鍵字比對。
首先先將RichEdit創建出來:
RichEdit = CreateWindowEx(WS_EX_CLIENTEDGE,
TEXT("RichEdit20A"),NULL,
ES_MULTILINE | WS_CHILD |WS_VISIBLE |WS_VSCROLL |WS_HSCROLL | ES_WANTRETURN,
170, 80, rcClient.right-180, rcClient.bottom/2-60,
hWnd, 0, hInstance, NULL);
在這之前不要忘記加上RichEdit的頭文件 #include "RichEdit.h"和 hInst = LoadLibrary(TEXT("RICHED20.dll"));
由於要對RichEdit中的內容進行動態的改變,所以需要一個新的窗口回調函數:
char buffer[1024 *10]; //設置一個緩衝區,存放所接收到的字符
LRESULT CALLBACK EditProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
HDC hdc;
DWORD FirstChar;
RECT rect;
TEXTRANGE txtrange;
char keybuffer[1024];
HRGN hRgn;
HRGN hOldRgn;
RECT RealRect;
LRESULT nRet;
switch(message)
{
case WM_PAINT:
{
nRet = CallWindowProc((WNDPROC)OldProc,hWnd,message,wParam,lParam);
hdc = GetDC(hWnd);
SendMessage(hWnd,EM_GETRECT,0,(LPARAM)&rect);
LRESULT nPos = SendMessage(hWnd,EM_CHARFROMPOS,0,(LPARAM)&rect);
LRESULT nLine = SendMessage(hWnd,EM_LINEFROMCHAR,nPos,0);
LONG nIndex = SendMessage(hWnd,EM_LINEINDEX,nLine,0);
txtrange.chrg.cpMin = nIndex;
FirstChar = nIndex;
LONG nNextPos = SendMessage(hWnd,EM_CHARFROMPOS,0,(LPARAM)&rect.right);
txtrange.chrg.cpMax = nNextPos;
RealRect.left = rect.left;
RealRect.top = rect.top;
RealRect.right = rect.right;
RealRect.bottom = rect.bottom;
hRgn = CreateRectRgn(RealRect.left,RealRect.top,RealRect.right,RealRect.bottom);
hOldRgn = (HRGN)SelectObject(hdc,hRgn);
txtrange.lpstrText = buffer;
SendMessage(hWnd,EM_GETTEXTRANGE,0,(LPARAM)&txtrange);
int i =0 ,j;
while(buffer[i] != '\0' ) //進行關鍵字匹配
{
while(buffer[i] != '\0' &&(buffer[i] ==' ' || buffer[i] == '\r' || buffer[i] =='\t' ||
buffer[i] == '\n' || buffer[i] == '(' || buffer[i] == ')'))
i++;
if(buffer[i] == '\0')
break;
for(j=0;buffer[i] != '\0' && buffer[i] !=' ' && buffer[i] != '\r' && buffer[i] !='\t' && buffer[i] != '\n' && buffer[i] != '(' && buffer[i] != ')'; i++,j++)
keybuffer[j] = buffer[i];
keybuffer[j]='\0';
if(Check(keybuffer)==1) //對已存的關鍵字進行逐一比對
{
SetTextColor(hdc,RGB(0,0,255));
int nWidth = SendMessage(RichEdit,EM_POSFROMCHAR,nIndex+i-j, 0);
rect.left = LOWORD(nWidth) ;
rect.top = HIWORD(nWidth);
DrawText(hdc,keybuffer,-1,&rect,0);
}
}
SelectObject(hdc,hOldRgn);
DeleteObject(hRgn);
ReleaseDC(hWnd,hdc);
}
break;
default:
return CallWindowProc((WNDPROC)OldProc, hWnd, message, wParam, lParam);
}
return nRet;
}
在初始化的時候進行下面的調用即可實現基本的關鍵字高亮:
OldProc = SetWindowLong(RichEdit, GWL_WNDPROC, (LONG)EditProc);//OldProc爲全局LONG類型的變量
注:
關鍵字爲自己設定,在我上邊的例子中在Check(char *str)這樣的函數進行對已存的關鍵字進行匹配。