news 2026/5/1 11:08:34

汇编语言全接触-33.RichEdit 控件基础知识

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
汇编语言全接触-33.RichEdit 控件基础知识

有很多人要求我提供关于RichEdit控件的指南,经过这方面的大量编程实践,我想我终于可以开写关于RichEdit控件的指南了。诺,这个就是第一篇RichEdit指南。本指南将会描述涉及到RichEdit的几乎所有方面,起码是我所知道的关于它的所有方面。因为指南的信息量相当相当的大,所以我将它分成了几个部分,本篇是第一部分。在这篇指南里,你将会了解到什么是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 Name

RichEdit version

Richedit Class Name

Riched32.dll

1.0

RICHEDIT

RichEd20.dll

2.0

RICHEDIT20A

RichEd20.dll

3.0

RICHEDIT20A

你会注意到版本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 Name

Description

cbSize

该结构的大小. RichEdit控件使用该域来判断该结构的版本是 CHARFORMAT 还是 CHARFORMAT2

dwMask

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

CFM_BOLD

dwEffects 成语中的 CFE_BOLD 值是有效的.

CFM_CHARSET

bCharSet 成员是有效的。

CFM_COLOR

crTextColor 成员跟 dwEffects中的 CFE_AUTOCOLOR 值是有效的.

CFM_FACE

<FONT face="MS Sans Ser

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/26 15:41:39

【翼型】基于非主导排序遗传算法的翼型形状优化附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码获取及仿…

作者头像 李华
网站建设 2026/5/1 8:43:29

基于金枪鱼群优化算法优化概率神经网络分类(TSO-PNN)附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码获取及仿…

作者头像 李华
网站建设 2026/5/1 9:55:56

FT8440B输出12V350MA,18V300MA 非隔离电源方案 典型应用电路

FT8440B是离线非隔离 Buck 架构、集成 650V 高压启动与功率开关的电流模 PWM 控制器&#xff0c;主打高精度恒压&#xff08;3%&#xff09;、低成本与极简外围&#xff0c;适合 90–264Vac 输入、5–18V 输出、中小功率&#xff08;典型 12V/450mA、18V/300mA&#xff09;的恒…

作者头像 李华
网站建设 2026/4/27 1:05:16

LP3799FBC_48W隔离电源芯片(12V4A)典型应用电路

LP3799FBC&#xff08;TO220-6F&#xff0c;集成≥650V 高压管&#xff0c;原边反馈 PSR 反激&#xff09;适合 48W 级隔离 CV/CC 适配器 / 充电器&#xff0c;外围精简、EMI 友好、待机 < 75mW&#xff0c;量产与安规成本可控。典型应用场景与规格&#xff08;选型速览&…

作者头像 李华
网站建设 2026/4/27 3:25:56

在 Pr 中,3 种高效添加字幕和字幕样式的方法(剪辑师实战分享)

做视频剪辑久了你会发现&#xff0c;字幕本身并不难&#xff0c;难的是做得快、改得稳。 我自己长期用 Adobe Premiere Pro&#xff08;Pr&#xff09; 剪口播、教程和商业视频&#xff0c;踩过很多字幕的坑&#xff1a; 识别慢、断句乱、样式改一次就要返工一堆。 后来逐渐形成…

作者头像 李华
网站建设 2026/5/1 9:14:56

ArrayPool.Shared解说

NET 中频繁创建和销毁数组的情况下会导致垃圾回收器出现严重的内存压力&#xff0c;ArrayPool<T> 通过池化手段有效地降低了数组的分配和垃圾回收器的回收压力&#xff0c;同时 ArrayPool<T> 也是 MemoryPool<T> 和 PipeWriter、PipeReader 的底板。ArrayPoo…

作者头像 李华