概述
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控件使用方法大全RichEdit简介在基于对话框的程序里使用RichEditRichEdit之基本函数RichEdit之字体设置RichEdit之段落格式设置后记的全部内容,希望文章能够帮你解决MFC RichEdit控件使用方法大全RichEdit简介在基于对话框的程序里使用RichEditRichEdit之基本函数RichEdit之字体设置RichEdit之段落格式设置后记所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复