当前位置: 首页 > news >正文

汇编语言全接触-34.RichEdit 控件:更多的正文操作

你将会了解到关于的RichEdit更多的正文操作。特别是你将会学习到如何搜索/替换正文,定位到某一指定的行号。

下载 例子程序.

Theory

Searching for Text

RichEdit 控件具有几种正文操作,搜索指定正文就是其中的一种。搜索正文是通过发送 EM_FINDTEXT 或者 EM_FINDTEXTEX 消息来完成的。这两个消息有一点很小的不同点。

EM_FINDTEXT

wParam == 搜索选项。 可以是下表中的任意组合值。这些选项对 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 STRUCT

chrg CHARRANGE <>

lpstrText DWORD ?

FINDTEXT ENDS

chrg 是一个 CHARRANGE 结构,其定义如下:

CHARRANGE STRUCT

cpMin DWORD ?

cpMax DWORD ?

CHARRANGE ENDS

cpMin 包含字符数组中第一个字符的字符索引。

cpMax 包含紧跟在字符数组中最后一个字符的字符的字符索引。

基本上,要搜索一个正文串,你必须指定要搜索的字符范围。

cpMin 和 cpMax 的具体意义根据搜索是向后还是向前是不同的。

如果是向后搜索,cpMin 指定搜索的开始字符索引,而 cpMax 则是结束字符索引。

如果是向前搜索,则反过来才对,也就是说 cpMin 包含结束字符索引而cpMax 包含开始字符索引。

lpstrText 是要搜索的正文串的指针。

EM_FINDTEXT 返回控件中跟搜索串匹配的的正文串的一个字符的索引。如果没找到匹配的则返回 -1。

EM_FINDTEXTEX

wParam == 搜索选项,跟 EM_FINDTEXT 的一样。

lParam == FINDTEXTEX 结构的指针。

FINDTEXTEX STRUCT

chrg CHARRANGE <>

lpstrText DWORD ?

chrgText CHARRANGE <>

FINDTEXTEX ENDS

FINDTEXTEX 中开始的两个成员是跟 FINDTEXT 结构中的一样的。

chrgText 是一个 CHARRANGE 结构,如果搜索到匹配串的话,其开始/结束字符索引会被填入这个结构中。

EM_FINDTEXTEX 的返回值跟 EM_FINDTEXT的是一样的。

EM_FINDTEXT 跟 EM_FINDTEXTEX 的不同处是 FINDTEXTEX 结构有一个另外的chrgText成员, 如果搜索到匹配串的话,

其开始/结束字符索引会被填入这个成员中。如果我们想对这个正文串进行更多的正文操作的话,有这个就方便多了。

替换/插入正文

RichEdit 控件提供了 EM_SETTEXTEX 来进行正文替换/插入操作。这个消息混合了 WM_SETTEXT 和 EM_REPLACESEL 的功能. 它具有以下语法:

EM_SETTEXTEX

wParam == SETTEXTEX 结构的指针。

SETTEXTEX STRUCT

flags DWORD ?

codepage DWORD ?

SETTEXTEX ENDS

flags 可以是以下值的组合:

ST_DEFAULT

删除Undo堆栈,丢弃RTF格式,替换所有的正文。

ST_KEEPUNDO

保留Undo堆栈。

ST_SELECTION

替换选定正文并且保留RTF格式

codepage 是一个常量,指定你的正文想要的代码页。我们通常简单的使用 CP_ACP。

正文选择

我们可以使用消息 EM_SETSEL 或者 EM_EXSETSEL 来编程选择正文.其中任意的一个都可以工作的很好。要使用哪一个消息要根据可用的字符索引格式来选择。如果它们保存在一个 CHARRANGE 结构中,则使用 EM_EXSETSEL更容易实现。

EM_EXSETSEL

wParam == 没有使用,必须为 0 。

lParam == CHARRANGE 结构的指针,包含想要选定的正文字符范围。

事件通知

在使用多行Edit控件时,你必须子类化它以便得到输入信息象鼠标/键盘事件等。RichEdit 控件提供了一个更好的方案,它可以把这些消息通知父窗口。为了注册得到通知消息,父窗口发送 EM_SETEVENTMASK 消息给 RichEdit 控件,指定它对哪些消息感兴趣。 EM_SETEVENTMASK 具有以下的语法:

EM_SETEVENTMASK

wParam == 没有使用,必须为 0 。

lParam == 事件掩码值。他可以是以下表格里标志值的任意组合。

ENM_CHANGE

发送 EN_CHANGE 通知

ENM_CORRECTTEXT

发送 EN_CORRECTTEXT 通知

ENM_DRAGDROPDONE

发送 EN_DRAGDROPDONE 通知

ENM_DROPFILES

发送 EN_DROPFILES 通知

ENM_KEYEVENTS

为键盘消息发送 EN_MSGFILTER 通知

ENM_LINK

Rich 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 uMsg==WM_NOTIFY

push esi

mov esi,lParam

assume esi:ptr NMHDR

.if [esi].code==EN_MSGFILTER

....

[ do something here]

....

.endif

pop esi

例子:

下面的例子是第33篇指南里的 IczEdit 的改进版。它为程序增加了搜索/替换功能和加速键。同时它处理鼠标消息,点右键时会出现一个弹出菜单。

.386

.model flat,stdcall

option casemap:none

include \masm32\include\windows.inc

include \masm32\include\user32.inc

include \masm32\include\comdlg32.inc

include \masm32\include\gdi32.inc

include \masm32\include\kernel32.inc

includelib \masm32\lib\gdi32.lib

includelib \masm32\lib\comdlg32.lib

includelib \masm32\lib\user32.lib

includelib \masm32\lib\kernel32.lib

WinMain proto :DWORD,:DWORD,:DWORD,:DWORD

.const

IDR_MAINMENU equ 101

IDM_OPEN equ 40001

IDM_SAVE equ 40002

IDM_CLOSE equ 40003

IDM_SAVEAS equ 40004

IDM_EXIT equ 40005

IDM_COPY equ 40006

IDM_CUT equ 40007

IDM_PASTE equ 40008

IDM_DELETE equ 40009

IDM_SELECTALL equ 40010

IDM_OPTION equ 40011

IDM_UNDO equ 40012

IDM_REDO equ 40013

IDD_OPTIONDLG equ 101

IDC_BACKCOLORBOX equ 1000

IDC_TEXTCOLORBOX equ 1001

IDR_MAINACCEL equ 105

IDD_FINDDLG equ 102

IDD_GOTODLG equ 103

IDD_REPLACEDLG equ 104

IDC_FINDEDIT equ 1000

IDC_MATCHCASE equ 1001

IDC_REPLACEEDIT equ 1001

IDC_WHOLEWORD equ 1002

IDC_DOWN equ 1003

IDC_UP equ 1004

IDC_LINENO equ 1005

IDM_FIND equ 40014

IDM_FINDNEXT equ 40015

IDM_REPLACE equ 40016

IDM_GOTOLINE equ 40017

IDM_FINDPREV equ 40018

RichEditID equ 300

.data

ClassName db "IczEditClass",0

AppName db "IczEdit version 2.0",0

RichEditDLL db "riched20.dll",0

RichEditClass db "RichEdit20A",0

NoRichEdit db "Cannot find riched20.dll",0

ASMFilterString db "ASM Source code (*.asm)",0,"*.asm",0

db "All Files (*.*)",0,"*.*",0,0

OpenFileFail db "Cannot open the file",0

WannaSave db "The data in the control is modified. Want to save it?",0

FileOpened dd FALSE

BackgroundColor dd 0FFFFFFh ; default to white

TextColor dd 0 ; default to black

hSearch dd ? ; handle to the search/replace dialog box

hAccel 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 <>

.code

start:

mov byte ptr [FindBuffer],0

mov byte ptr [ReplaceBuffer],0

invoke GetModuleHandle, NULL

mov hInstance,eax

invoke LoadLibrary,addr RichEditDLL

.if eax!=0

mov hRichEdit,eax

invoke WinMain, hInstance,0,0, SW_SHOWDEFAULT

invoke FreeLibrary,hRichEdit

.else

invoke MessageBox,0,addr NoRichEdit,addr AppName,MB_OK or MB_ICONERROR

.endif

invoke ExitProcess,eax

WinMain proc hInst:DWORD,hPrevInst:DWORD,CmdLine:DWORD,CmdShow:DWORD

LOCAL wc:WNDCLASSEX

LOCAL msg:MSG

LOCAL hwnd:DWORD

mov wc.cbSize,SIZEOF WNDCLASSEX

mov wc.style, CS_HREDRAW or CS_VREDRAW

mov wc.lpfnWndProc, OFFSET WndProc

mov wc.cbClsExtra,NULL

mov wc.cbWndExtra,NULL

push hInst

pop wc.hInstance

mov wc.hbrBackground

http://www.jsqmd.com/news/111057/

相关文章:

  • AI Agent 也搞不定的“最后一公里”:为什么交付还得靠人?
  • 新品广告制胜法则:亚马逊破局增长与品牌沉淀的科学路径
  • Java并发编程中的线程安全问题与解决方案全解析
  • 2025年12月聚丙烯粗纤维,仿钢纤维,纤维厂家推荐:行业测评与选择指南 - 品牌鉴赏师
  • Mermaid数据可视化:让图表绘制像写文档一样简单![特殊字符]
  • 现代化视频聚合与播放应用KVideo
  • Oracle DBCA命令删除数据库
  • 程序员职业发展路线图
  • 2025年12月GEO优化,GEO系统,GEO技术公司权威推荐:模型先进性与ROI数据深度解析 - 品牌鉴赏师
  • Python爬取ZLibrary元数据实战
  • 2025年市面上正规的包衣机供应厂家哪家好,高效包衣机附件/高效糖衣包衣机/薄膜包衣机制造商选哪家 - 品牌推荐师
  • 汇编语言全接触-35.RichEdit 控件:语法高亮显示
  • Synbo项目重点进展|完成可扩展的流动性市场框架集成设计
  • Aavlonia的Popup
  • 2025义乌国际物流服务商综合竞争力推荐榜—聚焦美国双清包税与DDP服务,甄选本地可靠合作伙伴 - 呼呼拉呼
  • 2025年AI模型产品经理转型指南:零基础入门,少走两年弯路,快速成为AI产品经理高手!
  • 2025年全自动玻片扫描仪厂家权威推荐榜单:DNA快速合成仪/引物快速合成仪/玻片扫描仪源头厂家精选 - 品牌推荐官
  • 2025年最受好评的清障车企业,你选对了吗?,常奇清障车/程力清障车/五十铃清障车/落地清障车/清障车/8吨清障车企业排行榜 - 品牌推荐师
  • 2025上海装修公司实力排名:二级资质加持+15000平生产基地(防坑必读) - 品牌排行榜
  • SikuBERT:让AI读懂古籍的智能钥匙,古文处理从此简单
  • 2025最新螺旋叶片厂家 Top5 推荐:聚焦实力企业,精准适配多元需求 - 深度智识库
  • 速藏!Java程序员转AI大模型:从编码到AI的职业升级宝典
  • 26、实用脚本与趣味游戏:探索Shell脚本的多元魅力
  • 2025年12月GEO,GEO优化,GEO技术公司推荐:AI搜索适配评测与选型实用指南 - 品牌鉴赏师
  • 2025年12月混凝土抗裂纤维,混凝土增韧纤维,高延性混凝土纤维厂商推荐:聚焦企业综合实力与核心竞争力 - 品牌鉴赏师
  • 测试博文标题 at 12/18/2025 6:09:29 PM
  • 2025年12月西安财税公司TOP10权威榜出炉!商华会计99.99分五颗星登顶,全区域服务覆盖无忧 - 品牌智鉴榜
  • AI 时代顶极人才的五力能力
  • DevUI 实战教程:从零构建电商后台管理系统(完整版) - 指南
  • IDM完整功能使用指南:解锁高效下载体验