MFC RichEdit控件使用方法大全
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控件使用方法大全相关推荐
- CATIA二次开发CAA实现MFC树形控件的方法研究
CATIA使用CAA二次开发的时候,如果需要对树形数据对象实现管理,使用树形控件是非常好的选择.但是,CAA本身提供的控件较少,多数情况无法较好地满足项目要求,如果你的水平足够高,也可以使用CATNa ...
- 添加RichEdit控件导致MFC对话框程序无法执行的解决方法
解决办法: 在应用程序类(App类)中的InitInstance函数体内添加以下语句: AfxInitRichEdit(); 对应1.0版本 如果有2.0版本需要添加如下 AfxIni ...
- 【汉化】DevExpress插件中RichEdit控件的自定义汉化方法
本文实现方法参考:http://blog.csdn.net/ljsql/article/details/5487460 DevExpress插件,官方提供的汉化包中关于RichEdit控件的汉化基本没 ...
- VS2008 在IE8中 调试 ActiveX控件 无法进入断点的解决方法 设置VS2008和IE8 调试ATL MFC ActiveX控件
VS2008 在IE8中 调试 ActiveX控件 无法进入断点的解决方法 设置VS2008和IE8 调试ATL MFC ActiveX控件 参考文章: (1)VS2008 在IE8中 调试 Acti ...
- DELPHI第三方控件及组件大全(安装方法与使用)
一,DELPHI第三方控件安装方法介绍 1.对于单个控件,Componet–>install component..–>PAS或DCU文件–>install; 2.对于带*.dpk文 ...
- richedit php,VC中RichEdit 控件的使用
在mfc中使用工具栏里的RichEdit 控件时,应该在程序初始话时加入AfxInitRichEdit,或者 AfxInitRichEdit2 否则的话 程序会起不来.也没有任何错误信息. 这俩函数 ...
- 关于 richedit 控件
发现在MFC程序里只要添加richedit控件,界面就显示不出来. 原来需要先进行初始化: InitCommonControls(); LoadLibrary( "RICHED32.DLL ...
- RichEdit控件的使用(未完)
具体步骤: 新建一个基于对话框的工程,添加两个RichEdit控件,分别为:IDC_RichEdit_Show.IDC_RichEdit_Send.然后添加两个按钮,分别为IDC_SEND.IDC_C ...
- 金格控件java版本_金格控件宝典(问题大全.docx
金格控件宝典(问题大全 蓝凌EKP-J 蓝凌EKP-J 金格控件宝典 文档控制/Document Control 修改记录 日期 作者 版本 备注 2013-3-22 苏韶勇 V1.0 2013-5- ...
最新文章
- docker logs 查看实时日志
- Apache Rewrite 规则详解
- 魔术引号 php,php怎么关闭魔术引号
- java 解析 csv_在Java中将数据从CSV解析到数组
- mysql如何查看表拥有的键_如何查看表或列的所有外键?
- pybind11用python调用C++代码
- 每日涉猎技术点存档(2018年6月)
- 外语学习的真实方法及误区(描述得非常深刻)
- 中科院博士论文《致谢》
- 计算机考试不及格的检讨,考试不及格的检讨书(精选10篇)
- Indian_pines 高光谱图像数据集的处理(1)
- s3c6410 时钟设置
- 【jeeWeb】jeeWeb在Tomcat跑起来
- python金融计算器
- Mac OS 如何在终端下打开 APP 应用程序?
- Python之OpenCV相机标定
- 用ASP技术进行动态WAP网站开发实例
- 深度学习入门整理学习(二)
- IOS微信小程序页面滚动导致滚动穿透的解决办法
- 自制读卡器写入受保护