MFC RichEdit控件使用方法大全

RichEdit简介

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

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

MFC的工具箱里提供了RichEdit控件,我们可以直接拖放到对话框里。如图所示:
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的小程序,附上链接:
介绍
代码下载

猜你喜欢

转载自blog.csdn.net/qq_54121864/article/details/118673326