这个变量被用来保存跟 EM_FINDTEXTEX 一起使用的搜索标志。 之后,通过 EM_EXGETSEL ,我们得到当前选定的正文, 因为我们需要知道搜索操作的开始位置。 invoke IsDlgButtonChecked,hWnd,IDC_DOWN .if eax==BST_CHECKED or uFlags,FR_DOWN mov eax,findtext.chrg.cpMin .if eax!=findtext.chrg.cpMax push findtext.chrg.cpMax pop findtext.chrg.cpMin .endif mov findtext.chrg.cpMax,-1 .else mov findtext.chrg.cpMax,0 .endif
下一步就有一点精巧了。我们检查搜索方向Radio按钮来得到要按什么方向进行搜索。 如果是向下搜索,我们设置 uFlags 为FR_DOWN 标志值。然后我们比较 cpMin 和 cpMax, 检查是否要在选定的正文里搜索。如果两者的值不相等,说明有当前选定正文, 我们需要从选定正文的结尾开始搜索,到控件中的正文的结尾结束。 从而我们需要替换 cpMax 的值为 cpMin ,并改变 cpMax 的值为 -1 (0FFFFFFFFh)。 如果没有当前选定正文,搜索的范围是从当前插入点(光标)到所有正文的结尾。
如果用户选择了向前搜索,我们使用的范围是从选定正文的开始到控件中正文的开始处。 这个就是我们只改变 cpMax 的值为 0 原因。在使用向前搜索的情况下, cpMin 包含搜索范围中最后一个字符的的字符索引。 而cpMax 则是搜索范围中第一个字符的字符索引。向后搜索则刚刚相反。 invoke IsDlgButtonChecked,hWnd,IDC_MATCHCASE .if eax==BST_CHECKED or uFlags,FR_MATCHCASE .endif invoke IsDlgButtonChecked,hWnd,IDC_WHOLEWORD .if eax==BST_CHECKED or uFlags,FR_WHOLEWORD .endif mov findtext.lpstrText,offset FindBuffer
我们继续检查搜索标志的检查框,也就是 FR_MATCHCASE and FR_WHOLEWORD。 最后,我们把要搜索的正文串的偏移量放入 lpstrText 成员中。
invoke SendMessage,hwndRichEdit,EM_FINDTEXTEX,uFlags,addr findtext .if eax!=-1 invoke SendMessage,hwndRichEdit, EM_EXSETSEL,0,addr findtext.chrgText .endif .endif
现在我们已经准备好发送 EM_FINDTEXTEX 消息了。之后, 我们检查通过 SendMessage 返回的搜索结果。如果返回 -1, 表示没有找到匹配的正文串。否则,FINDTEXTEX 结构的 chrgText 成员里会被填入匹配正文串的字符索引。 因此我们继续使用 EM_EXSETSEL 消息来选定该正文串。
替换操作也是以差不多的方式来完成。 invoke GetDlgItemTe xt,hWnd,IDC_FINDEDIT,addr FindBuffer,sizeof FindBuffer invoke GetDlgItemText,hWnd,IDC_REPLACEED IT,addr ReplaceBuffer,sizeof ReplaceBuffer
我们先找到要搜索的正文串和用来替换的正文串。
mov findtext.chrg.cpMin,0 mov findtext.chrg.cpMax,-1 mov findtext.lpstrText,offset FindBuffer
为容易起见,替换操作在整个控件的所有正文中进行。因此开始索引为 0 ,结束索引为 -1。
mov settext.flags,ST_SELECTION mov settext.codepage,CP_ACP
我们初始化 SETTEXTEX 结构来表明我们想替换当前选定的文本和使用系统缺省的代码页。
.while TRUE invoke SendMessage,hwndRichEdit, EM_FINDTEXTEX,FR_DOWN,addr findtext .if eax==-1 .break .else invoke SendMessage,hwndRichEd it,EM_EXSETSEL,0,addr findtext.chrgText invoke SendMessage,hwndRichEd it,EM_SETTEXTEX,addr settext,addr ReplaceBuffer .endif .endw
我们进入无限循环,来搜索匹配的正文。如果找到一个, 我们就通过EM_EXSETSEL 来选定它,并通过EM_SETTEXTEX 替换它。 当没找到其他匹配串时,我们就退出循环体。
Find Next 和 Find Prev. 以跟Find操作相似方式使用 EM_FINDTEXTEX 消息实现的功能。
上一篇:破解 女性基础体温管理软件 v1.2
下一篇:DFCG破解入门第二课
|