RichEdit 控件基础知识

本文详细介绍了RichEdit控件的基础知识及其不同版本的功能差异。包括如何加载RichEdit DLL,创建控件实例,设置文本和背景颜色等。适用于希望深入了解并应用此控件的开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  RichEdit 控件基础知识
理论

 

A richedit control can be thought of as a souped-up edit control. 它提供了普通简单Edit控件所缺少的很多令人合意的功能,譬如可以 使用 多种字体和字体大小,多级Undo/Redo,文本搜索,内嵌OLE对象,编辑的拖放支持等等。由于RichEdit控件有这么多功能,因此它独存于一个单独的DLL文件。这个意味着如果你要使用RichEdit控件,就不能象使用其他普通控件那样只调用InitCommonControls 函数。你必须先使用 LoadLibrary 来载入RichEdit DLL文件。

这里有个问题,就是至今为止RichEdit控件共有3个版本,版本1,2和3。下面的表格显示了每个版本的相应的DLL文件名。

DLL NameRichEdit versionRichedit Class Name
Riched32.dll1.0RICHEDIT
RichEd20.dll2.0RICHEDIT20A
RichEd20.dll3.0RICHEDIT20A

你会注意到版本2和3都使用了相同的DLL文件名,而且它们也使用了相同的类名!这样在你想要明确的使用RichEdit 3.0的功能的时候就会产生问题. 到目前为止,我还找到一个正式的 方法 来区分版本2.0和3.0.不过,有个解决方法工作良好,我会在后面演示给你看.

.data   RichEditDLL db "RichEd20.dll",0
.....
.data?
hRichEditDLL dd ?
.code
invoke LoadLibrary,addr RichEditDLL
mov hRichEditDLL,eax
......
invoke FreeLibrary,hRichEditDLL

当Richedit DLL文件被载入时,它会注册 RichEdit 窗口类,因此需要在你创建Richedit控件之前必须先要载入DLL.Richedit控件的类名是不同的。现在你可能会有一个问题要提:我怎么样才能够知道我要使用哪个版本的Richedit控件?如果你不需要使用那些特别的功能,使用最新的版本也不定是最适宜的.下面的表格列出了每个RichEdit版本提供的功能.

功能版本 1.0版本 2.0版本 3.0
选择条
x
x
x
Unicode 编辑
x
x
字符段落格式
x
x
x
文本搜索
向前搜索
向前/向后搜索
向前/向后搜索
内嵌OLE
x
x
x
拖放编辑
x
x
x
Undo/Redo
单级
多级
多级
自动 URL 识别
x
x
加速键支持
x
x
非窗口操作
x
x
分行符
CRLF
CR
CR (可以 模拟 1.0版本)
Zoom
x
Paragraph numbering
x
simple table
x
normal and heading styles
x
underline coloring
x
hidden text
x
font binding
x

上面的表格不是全面的:我只是列出了那些重要的功能.

创建RchEdit 控件

载入DLL文件后,你可以调用CreateWindowEx 来创建RichEdit控件,创建控件时你可以使用Edit控件风格和普通窗口风格,但是ES_LOWERCASE, ES_UPPERCASE 和 ES_OEMCONVERT 风格除外.

.const	RichEditID equ 300.data	RichEditDLL db "RichEd20.dll",0
RichEditClass db "RichEdit20A",0 ....data?
hRichEditDLL dd ? hwndRichEdit dd ?.code ..... invoke LoadLibrary,addr RichEditDLL mov hRichEditDLL,eax
invoke CreateWindowEx,0,addr RichEditClass
,WS_VISIBLE or ES_MULTILINE or WS_CHILD or WS_VSCROLL or WS_HSCROLL, / CW_USEDEFAULT,CW_USEDEFAULT
,CW_USEDEFAULT,CW_USEDEFAULT,hWnd,RichEditID,hInstance,0 mov hwndRichEdit,eax

设置缺省的文本和背景颜色

在使用Edit控件时设置文本和 背景 颜色可能有点问题,但是在RichEdit控件中已经修正了这个问题.要设置RichEdit的背景色,你要发送 EM_SETBKGNDCOLOR 消息给RichEdit控件.这个消息具有以下语法.

wParam == 颜色选项. 如果是0说明Windows使用 lParam 中的颜色值作为背景色.如果该参数不为0,Windows使用 系统 背景色.因为我们要发送该消息来改变背景色,所以我们必须令wParam为0.
lParam == 指定要设置的颜色的 COLORREF 结构,仅当 wParam 为 0 时才有效.

譬如, 如果我要设置背景为纯蓝色,我需要写入以下代码:

		invoke SendMessage,hwndRichEdit,EM_SETBKGNDCOLOR,0,0FF0000h

要设置文本颜色,RichEdit控件提供了另外的新消息,EM_SETCHARFORMAT来做这个 工作 . 这个消息控制控件中一段选定的文本或者全部正文的格式. 这个消息的语法如下:

wParam == 格式选项:

SCF_ALL本次操作影响控件中全部文本.
SCF_SELECTION本次操作仅影响选定的文本
SCF_WORD or SCF_SELECTION本次操作仅影响所选定的那个单词. 如果选定是空的话,仅将插入点(光标)设置到指定字的位置. SCF_WORD 标志必须跟 SCF_SELECTION 一起使用.

lParam == CHARFORMAT 或者 CHARFORMAT2 结构的指针,说明要使用的正文格式. CHARFORMAT2 只在 Richedit 2.0 和更高版本才提供.这个不是说在RichEdit 2.0以后你一定要使用 CHARFORMAT2 . 如果你不需要使用到 CHARFORMAT2 中新加的功能, 你仍然可以使用CHARFORMAT .

CHARFORMATA STRUCT 	cbSize DWORD ? 	dwMask DWORD ? 	dwEffects DWORD    ? 	yHeight DWORD ? 	yOffset DWORD ? 	crTextColor COLORREF ? 	bCharSet BYTE ? 	bPitchAndFamily    BYTE ? 	szFaceName BYTE LF_FACESIZE dup(?) 	_wPad2 WORD ? CHARFORMATA ENDS 
Field NameDescript_ion
cbSize该结构的大小. RichEdit控件使用该域来判断该结构的版本是 CHARFORMAT 还是 CHARFORMAT2
dwMask

位标记, 用来指定下面的那些成员是有效的.

CFM_BOLDdwEffects 成语中的 CFE_BOLD 值是有效的.
CFM_CHARSETbCharSet 成员是有效的。
CFM_COLORcrTextColor 成员跟 dwEffects中的 CFE_AUTOCOLOR 值是有效的.
CFM_FACE<FONT face="MS Sans Ser


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值