RichEdit關鍵字高亮的簡單實現

RichEdit控件基本使用在網上介紹的已經很多了,在這裏就不多說了。


直接進入正題:

                                   在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)這樣的函數進行對已存的關鍵字進行匹配。

發佈了40 篇原創文章 · 獲贊 23 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章