东阳网站优化,企业门户平台登录,做我女朋网站源码,wordpress网站统计插件你将会了解到关于的RichEdit更多的正文操作。特别是你将会学习到如何搜索/替换正文#xff0c;定位到某一指定的行号。
下载 例子程序.
Theory
Searching for Text
RichEdit 控件具有几种正文操作#xff0c;搜索指定正文就是其中的一种。搜索正文是通过发送 EM_FINDTEXT…你将会了解到关于的RichEdit更多的正文操作。特别是你将会学习到如何搜索/替换正文定位到某一指定的行号。下载 例子程序.TheorySearching for TextRichEdit 控件具有几种正文操作搜索指定正文就是其中的一种。搜索正文是通过发送 EM_FINDTEXT 或者 EM_FINDTEXTEX 消息来完成的。这两个消息有一点很小的不同点。EM_FINDTEXTwParam 搜索选项。 可以是下表中的任意组合值。这些选项对 EM_FINDTEXT 和 EM_FINDTEXTEX 都是一样的。FR_DOWN如果指定了这个标志值搜索操作从当前选定的 end 位置开始直到控件中正文的 end 位置结束(向下搜索)。这个标志仅影响 RichEdit 2.0 和以后版本: 这个是 RichEdit 1.0 的缺省行为。RichEdit 2.0 或以后版本的缺省行为是在当前选定正文内的从结尾搜索到开始位置(向前搜索)。概括来说就是如果你使用 RichEdit 1.0, 无论你做什么都没法影响搜索的方向它总使用向后搜索。但是如果你使用 RichEdit 2.0 而且你想使用向后搜索的话你必须指定这个标志值否则使用的是向前搜索了。FR_MATCHCASE如果指定了这个标志值搜索操作是大小写敏感的即区分大小写。FR_WHOLEWORD如果设置了这个标志值搜索操作就搜寻匹配指定搜索串的整个词。实际上还有更多的标志值但是它们都是跟非英语系正文操作相关的。lParam FINDTEXT 结构的指针。FINDTEXT STRUCTchrg CHARRANGE lpstrText DWORD ?FINDTEXT ENDSchrg 是一个 CHARRANGE 结构其定义如下CHARRANGE STRUCTcpMin DWORD ?cpMax DWORD ?CHARRANGE ENDScpMin 包含字符数组中第一个字符的字符索引。cpMax 包含紧跟在字符数组中最后一个字符的字符的字符索引。基本上要搜索一个正文串你必须指定要搜索的字符范围。cpMin 和 cpMax 的具体意义根据搜索是向后还是向前是不同的。如果是向后搜索cpMin 指定搜索的开始字符索引而 cpMax 则是结束字符索引。如果是向前搜索则反过来才对也就是说 cpMin 包含结束字符索引而cpMax 包含开始字符索引。lpstrText 是要搜索的正文串的指针。EM_FINDTEXT 返回控件中跟搜索串匹配的的正文串的一个字符的索引。如果没找到匹配的则返回 -1。EM_FINDTEXTEXwParam 搜索选项跟 EM_FINDTEXT 的一样。lParam FINDTEXTEX 结构的指针。FINDTEXTEX STRUCTchrg CHARRANGE lpstrText DWORD ?chrgText CHARRANGE FINDTEXTEX ENDSFINDTEXTEX 中开始的两个成员是跟 FINDTEXT 结构中的一样的。chrgText 是一个 CHARRANGE 结构如果搜索到匹配串的话其开始/结束字符索引会被填入这个结构中。EM_FINDTEXTEX 的返回值跟 EM_FINDTEXT的是一样的。EM_FINDTEXT 跟 EM_FINDTEXTEX 的不同处是 FINDTEXTEX 结构有一个另外的chrgText成员, 如果搜索到匹配串的话其开始/结束字符索引会被填入这个成员中。如果我们想对这个正文串进行更多的正文操作的话有这个就方便多了。替换/插入正文RichEdit 控件提供了 EM_SETTEXTEX 来进行正文替换/插入操作。这个消息混合了 WM_SETTEXT 和 EM_REPLACESEL 的功能. 它具有以下语法EM_SETTEXTEXwParam SETTEXTEX 结构的指针。SETTEXTEX STRUCTflags DWORD ?codepage DWORD ?SETTEXTEX ENDSflags 可以是以下值的组合:ST_DEFAULT删除Undo堆栈,丢弃RTF格式替换所有的正文。ST_KEEPUNDO保留Undo堆栈。ST_SELECTION替换选定正文并且保留RTF格式codepage 是一个常量指定你的正文想要的代码页。我们通常简单的使用 CP_ACP。正文选择我们可以使用消息 EM_SETSEL 或者 EM_EXSETSEL 来编程选择正文.其中任意的一个都可以工作的很好。要使用哪一个消息要根据可用的字符索引格式来选择。如果它们保存在一个 CHARRANGE 结构中则使用 EM_EXSETSEL更容易实现。EM_EXSETSELwParam 没有使用必须为 0 。lParam CHARRANGE 结构的指针包含想要选定的正文字符范围。事件通知在使用多行Edit控件时你必须子类化它以便得到输入信息象鼠标/键盘事件等。RichEdit 控件提供了一个更好的方案它可以把这些消息通知父窗口。为了注册得到通知消息父窗口发送 EM_SETEVENTMASK 消息给 RichEdit 控件指定它对哪些消息感兴趣。 EM_SETEVENTMASK 具有以下的语法EM_SETEVENTMASKwParam 没有使用必须为 0 。lParam 事件掩码值。他可以是以下表格里标志值的任意组合。ENM_CHANGE发送 EN_CHANGE 通知ENM_CORRECTTEXT发送 EN_CORRECTTEXT 通知ENM_DRAGDROPDONE发送 EN_DRAGDROPDONE 通知ENM_DROPFILES发送 EN_DROPFILES 通知ENM_KEYEVENTS为键盘消息发送 EN_MSGFILTER 通知ENM_LINKRich Edit 2.0 或以后版本 当鼠标在具有 CFE_LINK 风格的正文上面移过而且执行了一个或几个鼠标动作时就发送 EN_LINK 通知。ENM_MOUSEEVENTS为鼠标消息发送 EN_MSGFILTER 通知。ENM_OBJECTPOSITIONS发送 EN_OBJECTPOSITIONS 通知ENM_PROTECTED发送 EN_PROTECTED 通知ENM_REQUESTRESIZE发送 EN_REQUESTRESIZE 通知ENM_SCROLL发送 EN_HSCROLL 和 EN_VSCROLL 通知ENM_SCROLLEVENTS为鼠标滑轮发送 EN_MSGFILTER 通知。ENM_SELCHANGE发送 EN_SELCHANGE 通知ENM_UPDATE发送 EN_UPDATE 通知Rich Edit 2.0 和以后版本 这个标志值会被忽略而经常发送 EN_UPDATE 通知。然而如果 RichEdit 3.0 模拟 RichEdit 1.0的话你必须使用这个标志值来发送 EN_UPDATE 通知上面的所有通知都被做为 WM_NOTIFY 消息来发送你必须检查 NMHDR 结构的 code 成员来得到通知消息。譬如如果你想注册得到鼠标消息(也就是说你想提供一给上下文相关的弹出菜单), 你需要象下面这样做invoke SendMessage,hwndRichEdit,EM_SETEVENTMASK,0,ENM_MOUSEEVENTS..........WndProc proc hWnd:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD..........elseif uMsgWM_NOTIFYpush esimov esi,lParamassume esi:ptr NMHDR.if [esi].codeEN_MSGFILTER....[ do something here].....endifpop esi例子下面的例子是第33篇指南里的 IczEdit 的改进版。它为程序增加了搜索/替换功能和加速键。同时它处理鼠标消息点右键时会出现一个弹出菜单。.386.model flat,stdcalloption casemap:noneinclude \masm32\include\windows.incinclude \masm32\include\user32.incinclude \masm32\include\comdlg32.incinclude \masm32\include\gdi32.incinclude \masm32\include\kernel32.incincludelib \masm32\lib\gdi32.libincludelib \masm32\lib\comdlg32.libincludelib \masm32\lib\user32.libincludelib \masm32\lib\kernel32.libWinMain proto :DWORD,:DWORD,:DWORD,:DWORD.constIDR_MAINMENU equ 101IDM_OPEN equ 40001IDM_SAVE equ 40002IDM_CLOSE equ 40003IDM_SAVEAS equ 40004IDM_EXIT equ 40005IDM_COPY equ 40006IDM_CUT equ 40007IDM_PASTE equ 40008IDM_DELETE equ 40009IDM_SELECTALL equ 40010IDM_OPTION equ 40011IDM_UNDO equ 40012IDM_REDO equ 40013IDD_OPTIONDLG equ 101IDC_BACKCOLORBOX equ 1000IDC_TEXTCOLORBOX equ 1001IDR_MAINACCEL equ 105IDD_FINDDLG equ 102IDD_GOTODLG equ 103IDD_REPLACEDLG equ 104IDC_FINDEDIT equ 1000IDC_MATCHCASE equ 1001IDC_REPLACEEDIT equ 1001IDC_WHOLEWORD equ 1002IDC_DOWN equ 1003IDC_UP equ 1004IDC_LINENO equ 1005IDM_FIND equ 40014IDM_FINDNEXT equ 40015IDM_REPLACE equ 40016IDM_GOTOLINE equ 40017IDM_FINDPREV equ 40018RichEditID equ 300.dataClassName db IczEditClass,0AppName db IczEdit version 2.0,0RichEditDLL db riched20.dll,0RichEditClass db RichEdit20A,0NoRichEdit db Cannot find riched20.dll,0ASMFilterString db ASM Source code (*.asm),0,*.asm,0db All Files (*.*),0,*.*,0,0OpenFileFail db Cannot open the file,0WannaSave db The data in the control is modified. Want to save it?,0FileOpened dd FALSEBackgroundColor dd 0FFFFFFh ; default to whiteTextColor dd 0 ; default to blackhSearch dd ? ; handle to the search/replace dialog boxhAccel dd ?.data?hInstance dd ?hRichEdit dd ?hwndRichEdit dd ?FileName db 256 dup(?)AlternateFileName db 256 dup(?)CustomColors dd 16 dup(?)FindBuffer db 256 dup(?)ReplaceBuffer db 256 dup(?)uFlags dd ?findtext FINDTEXTEX .codestart:mov byte ptr [FindBuffer],0mov byte ptr [ReplaceBuffer],0invoke GetModuleHandle, NULLmov hInstance,eaxinvoke LoadLibrary,addr RichEditDLL.if eax!0mov hRichEdit,eaxinvoke WinMain, hInstance,0,0, SW_SHOWDEFAULTinvoke FreeLibrary,hRichEdit.elseinvoke MessageBox,0,addr NoRichEdit,addr AppName,MB_OK or MB_ICONERROR.endifinvoke ExitProcess,eaxWinMain proc hInst:DWORD,hPrevInst:DWORD,CmdLine:DWORD,CmdShow:DWORDLOCAL wc:WNDCLASSEXLOCAL msg:MSGLOCAL hwnd:DWORDmov wc.cbSize,SIZEOF WNDCLASSEXmov wc.style, CS_HREDRAW or CS_VREDRAWmov wc.lpfnWndProc, OFFSET WndProcmov wc.cbClsExtra,NULLmov wc.cbWndExtra,NULLpush hInstpop wc.hInstancemov wc.hbrBackground