RichEdit简介

RichEdit的意思是“富文本编辑控件”,在Edit的基础上添加了很多功能,如对不同字体、字号、文本颜色、背景色、插入Ole对象的支持,Windows系统的写字板就是基于RichEdit的。我也基于RichEdit做了一个模仿写字板的程序,具体介绍点击此处查看,完整代码点击此处下载。
注:关于MFC的程序,还是MSDN最详细,这里只是介绍常用功能,所以每一节我都会给出MSDN的链接,大家可以去查阅。

在基于对话框的程序里使用RichEdit

MFC的工具箱里提供了RichEdit控件,我们可以直接拖放到对话框里。如图所示:

我们把一个RichEdit放进对话框里,编译运行程序,发现对话框无法正常显示。我们要在CXXXApp(XXX是工程名)类的InitInstance函数中加入一句:

AfxInitRichEdit2();

这样,对话框就可以正常显示了。
Visual Studio 2019默认的RichEdit版本是2.0,而现在RichEdit已经出了很多新版本,如RichEdit 4.1。使用RichEdit 4.1的方法如下:
打开解决方案资源管理器,找到XXX.rc文件(XXX是工程名),右击,点击“查看代码”。

在里面我们可以找到一句

CONTROL         "",IDC_XXX,"RichEdit20W",WS_BORDER | WS_VSCROLL | WS_TABSTOP | 0x3144,0,35,345,175

把其中的"RichEdit20W"改为"RichEdit50W",然后InitInstance中的AfxInitRichEdit2();改为AfxInitRichEdit5();,就OK了。
注:修改为RichEdit 4.1后,MFC会识别不了,所以无法修改属性,建议在修改之前把RichEdit的属性修改好。

RichEdit之基本函数

RichEdit的功能被封装在CRichEditCtrl类里。我们可以为控件添加一个变量,或者通过GetDlgItem获取句柄。
点击此处跳转到MSDN的相关介绍
CRichEditCtrl类的常用函数如下:

获取/设置属性函数

注:以下函数除标*的外,均有与其对应的Set函数,功能也相对应,还有一些函数是派生过来的,如GetWindowText等,此处不再赘述。

GetSelectionCharFormat

DWORD GetSelectionCharFormat(CHARFORMAT2W& cf) const;

获取选定内容的字体格式。
cf:用来接收字体格式。

GetDefaultCharFormat

DWORD GetDefaultCharFormat(CHARFORMAT2& cf) const;

获取默认的字体格式。
cf:用来接收字体格式。

GetSel

void GetSel(CHARRANGE& cr) const;void GetSel(long& nStartChar,long& nEndChar) const;

获取用户选定的范围。
cr:用来接收范围。
nStartChar:用来接收选定内容的开始坐标。
nEndChar:用来接收选定内容的结束坐标。

GetSelText *

CString GetSelText() const;

用来获取选定内容。

GetParaFormat

DWORD GetParaFormat(PARAFORMAT2& pf) const;

获取选定内容的段落属性。
pf:用来接收字体格式。

GetEventMask

long GetEventMask() const;

获取RichEdit的事件掩码。
事件掩码说明了RichEdit把哪些消息通知给父窗口。该函数并不常用,常用的是SetEventMask。至于具体应该设置哪些属性,你添加一些消息处理事件时VS自动生成的注释会告诉你。如添加OnEnMsgfilterXXX函数时,VS会提示:

 // TODO:  控件将不发送此通知,除非您重写// CDialogEx::OnInitDialog() 函数,以将 EM_SETEVENTMASK 消息发送// 到该控件,同时将 ENM_KEYEVENTS 或 ENM_MOUSEEVENTS 标志//“或”运算到 lParam 掩码中。

这时,我们就需要使用SetEventMask函数设置属性。

设置/获取缩放比例

MFC没有把该功能封装成函数,但可以通过SendMessageW设置。格式如下:

RichEdit.SendMessageW(EM_SETZOOM,N,D);//设置缩放比例
RichEdit.SendMessageW(EM_GETZOOM,&N,&D);//获取缩放比例

N:缩放比例的分子。
D:缩放比例的分母。

撤销/恢复函数

CanUndo

BOOL CanUndo() const;

获取是否可以撤销。

CanRedo

BOOL CanRedo() const;

获取是否可以恢复。

EmptyUndoBuffer

void EmptyUndoBuffer();

清除撤销缓冲区,使RichEdit无法撤销。
注意:使用SetWindowText函数时,会自动清除撤销缓冲区。

Undo

BOOL Undo();

撤销一次操作。

Redo

BOOL Redo();

恢复上一次撤销的操作。

复制/粘贴函数

Copy

void Copy();

把选定内容复制到剪贴板。

CanPaste

BOOL CanPaste(UINT nFormat = 0) const;

获取是否能粘贴。
nFormat:想粘贴的剪贴板格式。0为不指定。

Paste

void Paste();

将剪贴板内容粘贴到RichEdit光标处。

PasteSpecial

void PasteSpecial(UINT nClipFormat,DWORD dvAspect = 0,HMETAFILE hMF = 0);

粘贴为特殊格式。
nClipFormat:想粘贴的剪贴板格式。
其余两个参数不常用,一般为默认值。

流输入/输出

StreamIn/StreamOut

long StreamIn(int nFormat,EDITSTREAM& es);
long StreamOut(int nFormat,EDITSTREAM& es);

将RichEdit中的内容输出到流中,或从流中输入到RichEdit。
nFormat:StreamIn只能是SF_TEXT(纯文本)或SF_RTF(RTF格式),(StreamOut还有其它设置,但不常用)指定输入或输出的格式。
这些值中的任意一个都可以与 SFF_SELECTION结合使用 。 如果指定了SFF_SELECTION ,StreamOut 则将当前选定内容输出到输出流中。 如果未指定, StreamOut 则输出整个RichEdit的内容。
es:指定输入/输出流。dwCookie参数一般设为CFile对象,pfnCallback是回调函数。详见此处。

查找/替换

FindText

long FindText(DWORD dwFlags,FINDTEXTEX* pFindText) const;

查找指定文本。
dwFlags:点击此处了解详情。
pFindText:点击此处了解详情。

RichEdit之字体设置

要注意,这里的字体不仅仅指我们平常说的字体,还包括字号、文本颜色、背景颜色、加粗、斜体等信息。这些信息被封装到CHARFORMAT2W结构体里,通过相关函数设置。下面,我们来介绍一下这个结构体。点击此处跳转到MSDN的相关介绍

typedef struct _charformat2w {UINT     cbSize;DWORD    dwMask;DWORD    dwEffects;LONG     yHeight;LONG     yOffset;COLORREF crTextColor;BYTE     bCharSet;BYTE     bPitchAndFamily;WCHAR    szFaceName[LF_FACESIZE];WORD     wWeight;SHORT    sSpacing;COLORREF crBackColor;LCID     lcid;union {DWORD dwReserved;DWORD dwCookie;};DWORD    dwReserved;SHORT    sStyle;WORD     wKerning;BYTE     bUnderlineType;BYTE     bAnimation;BYTE     bRevAuthor;BYTE     bUnderlineColor;
} CHARFORMAT2W;

cbSize:这个成员是结构体的大小,一般为sizeof(CHARFORMAT2W)
dwMask:这个成员相当于电闸,控制哪些成员是有效的。所有的标识符都由CFM开头,可以分为两类,一类是控制dwEffects的哪些值是有效的,一类是指定哪些成员是有效的。下面列举几个常用的例子。
控制成员变量的值:

意义
CFM_BACKCOLOR 背景颜色crBackColor有效
CFM_COLOR 字体颜色crTextColor有效
CFM_FACE 字体szFaceName有效
CFM_SIZE 文字大小yHeight有效
CFM_UNDERLINETYPE 下划线类型bUnderlineType有效

控制dwEffects的值和dwEffects的值基本相同,只是一个前缀是CFM一个是CFE而已。如果你想使用dwEffects的某个格式,如CFE_BOLD,你还需要在dwMask中也设上CFM_BOLD。
dwEffects:字符的特殊效果。具体可用的值如下表(机器翻译,可能有错误的地方)。

意义
CFE_ALLCAPS 字符都是大写字母。该值不影响控件显示文本的方式。此值仅适用于 Microsoft Rich Edit 3.0 之前的版本。
CFE_AUTOBACKCOLOR 背景颜色是GetSysColor( COLOR_WINDOW )的返回值。如果设置了此标志,则忽略crBackColor成员。
CFE_AUTOCOLOR 文本颜色是GetSysColor ( COLOR_WINDOWTEXT )的返回值。如果设置了此标志,则忽略crTextColor成员。
CFE_BOLD 字符是加粗的。
CFE_DISABLED 字符显示的阴影偏移了 3/4 点或一个像素,以较大者为准。
CFE_EXTENDED 字符是脚本中不太常见的成员。支持脚本的字体应该检查它是否具有此类字符的字形。
CFE_FONTBOUND 字体由 Rich Edit 控件选择,因为活动字体不支持字符。这个过程称为字体绑定。
CFE_HIDDEN 对于 Microsoft Rich Edit 3.0 及更高版本,不显示字符。
CFE_IMPRINT 字符显示为压印字符。该值不影响控件显示文本的方式。
CFE_ITALIC 字符为斜体。
CFE_LINK 当鼠标指针悬停在具有CFE_LINK效果的文本上时, Rich Edit 可以在收到鼠标消息时发送EN_LINK通知代码。
CFE_LINKPROTECTED 字符是友好名称链接的一部分。
CFE_MATH 字符是数学公式。
CFE_MATHNOBUILDUP 角色不参与数学构建。例如,当应用于 / 时,/ 将不会用于构建分数。
CFE_MATHORDINARY 字符在数学区域内显示为普通文本。
CFE_OUTLINE 字符显示为轮廓字符。该值不影响控件显示文本的方式。
CFE_PROTECTED 字符受到保护;尝试修改它们将导致EN_PROTECTED通知代码。
CFE_REVISED 字符被标记为修订。
CFE_SHADOW 字符显示为阴影字符。该值不影响控件显示文本的方式。
CFE_SMALLCAPS 字符为小写字母。该值不影响控件显示文本的方式。
CFE_STRIKEOUT 字符有删除线。
CFE_SUBSCRIPT 字符是下标。CFE_SUPERSCRIPT和CFE_SUBSCRIPT值是互斥的。对于这两个值,控件会自动计算偏移量和较小的字体大小。或者,您可以使用yHeight和yOffset成员显式指定下标和上标字符的字体大小和偏移量。
CFE_SUPERSCRIPT 字符是上标。
CFE_UNDERLINE 字符有下划线。

yHeight:指定字符高度,以twip为单位(1/1440 英寸,或 1/20 打印机点)。
yOffset:字符距基线的偏移量,以twip为单位。如果该成员的值为正,则该字符为上标;如果值为负,则该字符为下标。
crTextColor:文字颜色。要生成COLORREF,请使用RGB宏。
bCharSet:字符集值。它可以是为LOGFONT结构的lfCharSet成员指定的值之一。
bPitchAndFamily:指定字体间距。该成员与LOGFONT结构的lfPitchAndFamily成员相同。
szFaceName:指定字体名称。
crBackColor:背景颜色。
bUnderlineType:
指定下划线类型。具体参阅MSDN。
bUnderlineColor:下划线颜色。具体参阅MSDN。

根据这些知识,我们就可以修改RichEdit的字体了。
示例:

CHARFORMAT2W cf;ZeroMemory(&cf, sizeof(CHARFORMAT2W));wcscpy_s(cf.szFaceName, L"宋体");cf.dwMask = CFM_BACKCOLOR | CFM_CHARSET | CFM_COLOR | CFM_SUPERSCRIPT | CFM_SUBSCRIPT |CFM_FACE | CFM_ITALIC | CFM_SIZE | CFM_UNDERLINE | CFM_STRIKEOUT | CFM_BOLD |CFM_LINK | CFM_UNDERLINETYPE;cf.yHeight = 300;cf.crBackColor = RGB(255, 255, 0);cf.dwEffects=CFE_BOLD|CFE_STRIKEOUT|CFE_ITALIC;int l = RichEdit.GetWindowTextLengthW();RichEdit.SetSel(0, l);RichEdit.SetSelectionCharFormat(cf);RichEdit.SetSel(l, l);

RichEdit之段落格式设置

回想一下Word,里面除了字体功能经常用以外,还有一个常用的功能——段落功能。在RichEdit中,段落信息被封装到了PARAFORMAT2结构体里。点击此处跳转到MSDN的相关介绍

typedef struct _paraformat2 {UINT  cbSize;DWORD dwMask;WORD  wNumbering;union {WORD wReserved;WORD wEffects;};LONG  dxStartIndent;LONG  dxRightIndent;LONG  dxOffset;WORD  wAlignment;SHORT cTabCount;LONG  rgxTabs[MAX_TAB_STOPS];LONG  dySpaceBefore;LONG  dySpaceAfter;LONG  dyLineSpacing;SHORT sStyle;BYTE  bLineSpacingRule;BYTE  bOutlineLevel;WORD  wShadingWeight;WORD  wShadingStyle;WORD  wNumberingStart;WORD  wNumberingStyle;WORD  wNumberingTab;WORD  wBorderSpace;WORD  wBorderWidth;WORD  wBorders;
} PARAFORMAT2;

dwMask:同CHARFORMAT2W中的dwMask,指定哪些成员有效,下面列举几个常用值。

意义
PFM_ALIGNMENT 对齐方式wAlignment成员有效
PFM_LINESPACING 行间距dyLineSpacing和行间距类型bLineSpacingRule成员有效
PFM_SPACEAFTER/PFM_SPACEBEFORE 段前/段后空白dySpaceAfter/Before成员有效

控制dwEffects的值和dwEffects的值基本相同,只是一个前缀是PFM一个是PFE而已。如果你想使用dwEffects的某个格式你还需要在dwMask中也设上相应格式。
wAlignment:段落对齐方式。此成员可以是以下值之一。

意义
PFA_LEFT 左对齐
PFA_RIGHT 右对齐
PFA_CENTER 居中
PFA_JUSTIFY 两端对齐
5 分散对齐

dySpaceBefore/dySpaceAfter:段落上/下方间距。
dyLineSpacing:指定行间距的值。该值的意义取决于bLineSpacingRule。
bLineSpacingRule:行间距的类型,可以是以下值之一。

意义
0 单倍行距。 忽略dyLineSpacing成员。
1 1.5倍行距。 忽略dyLineSpacing成员。
2 2倍行距。忽略 dyLineSpacing成员。
3 最小值。当dyLineSpacing大于最小行距时,使用dyLineSpacing指定的行距,否则使用最小行距。单位:twip
4 固定值。严格使用dyLineSpacing指定的行距。单位:twip
5 dyLineSpacing / 20 (注意:它们是20倍关系)的值 是从一行到下一行的间距(以行为单位)。因此,将dyLineSpacing设置 为 20 会生成单倍行距的文本,40 是双倍行距,60 是三倍行距,依此类推。

其它成员参见MSDN。

后记

我最近用这些知识做了一个模仿Word的小程序,附上链接:
介绍
代码下载

MFC RichEdit控件使用方法大全相关推荐

  1. CATIA二次开发CAA实现MFC树形控件的方法研究

    CATIA使用CAA二次开发的时候,如果需要对树形数据对象实现管理,使用树形控件是非常好的选择.但是,CAA本身提供的控件较少,多数情况无法较好地满足项目要求,如果你的水平足够高,也可以使用CATNa ...

  2. 添加RichEdit控件导致MFC对话框程序无法执行的解决方法

    解决办法: 在应用程序类(App类)中的InitInstance函数体内添加以下语句: AfxInitRichEdit();         对应1.0版本 如果有2.0版本需要添加如下 AfxIni ...

  3. 【汉化】DevExpress插件中RichEdit控件的自定义汉化方法

    本文实现方法参考:http://blog.csdn.net/ljsql/article/details/5487460 DevExpress插件,官方提供的汉化包中关于RichEdit控件的汉化基本没 ...

  4. VS2008 在IE8中 调试 ActiveX控件 无法进入断点的解决方法 设置VS2008和IE8 调试ATL MFC ActiveX控件

    VS2008 在IE8中 调试 ActiveX控件 无法进入断点的解决方法 设置VS2008和IE8 调试ATL MFC ActiveX控件 参考文章: (1)VS2008 在IE8中 调试 Acti ...

  5. DELPHI第三方控件及组件大全(安装方法与使用)

    一,DELPHI第三方控件安装方法介绍 1.对于单个控件,Componet–>install component..–>PAS或DCU文件–>install; 2.对于带*.dpk文 ...

  6. richedit php,VC中RichEdit 控件的使用

    在mfc中使用工具栏里的RichEdit 控件时,应该在程序初始话时加入AfxInitRichEdit,或者 AfxInitRichEdit2 否则的话 程序会起不来.也没有任何错误信息. 这俩函数 ...

  7. 关于 richedit 控件

    发现在MFC程序里只要添加richedit控件,界面就显示不出来. 原来需要先进行初始化: InitCommonControls(); LoadLibrary( "RICHED32.DLL ...

  8. RichEdit控件的使用(未完)

    具体步骤: 新建一个基于对话框的工程,添加两个RichEdit控件,分别为:IDC_RichEdit_Show.IDC_RichEdit_Send.然后添加两个按钮,分别为IDC_SEND.IDC_C ...

  9. 金格控件java版本_金格控件宝典(问题大全.docx

    金格控件宝典(问题大全 蓝凌EKP-J 蓝凌EKP-J 金格控件宝典 文档控制/Document Control 修改记录 日期 作者 版本 备注 2013-3-22 苏韶勇 V1.0 2013-5- ...

最新文章

  1. docker logs 查看实时日志
  2. Apache Rewrite 规则详解
  3. 魔术引号 php,php怎么关闭魔术引号
  4. java 解析 csv_在Java中将数据从CSV解析到数组
  5. mysql如何查看表拥有的键_如何查看表或列的所有外键?
  6. pybind11用python调用C++代码
  7. 每日涉猎技术点存档(2018年6月)
  8. 外语学习的真实方法及误区(描述得非常深刻)
  9. 中科院博士论文《致谢》
  10. 计算机考试不及格的检讨,考试不及格的检讨书(精选10篇)
  11. Indian_pines 高光谱图像数据集的处理(1)
  12. s3c6410 时钟设置
  13. 【jeeWeb】jeeWeb在Tomcat跑起来
  14. python金融计算器
  15. Mac OS 如何在终端下打开 APP 应用程序?
  16. Python之OpenCV相机标定
  17. 用ASP技术进行动态WAP网站开发实例
  18. 深度学习入门整理学习(二)
  19. IOS微信小程序页面滚动导致滚动穿透的解决办法
  20. 自制读卡器写入受保护

热门文章

  1. mac系统下Redis安装和使用步骤详解
  2. 作家金庸谈他皈依佛教的心路历程
  3. SQL计算机名访问数据库失败-找不到网络路径
  4. 三年程序学习之一:(离开学校求职)
  5. 手机访问电脑的本地网站或者服务器
  6. 计算机网络安全总结与心得体会,网络安全学习心得200字
  7. python中decimal用法详解
  8. 批改网作文不允许粘贴
  9. 660. 零食(DAY 12)
  10. Spring Boot + 百度 OCR 图片文字识别功能