RichEdit簡介
RichEdit的意思是“富文本編輯控件”,在Edit的基礎上添加了很多功能,如對不同字型、字号、文本顔色、背景色、插入Ole對象的支援,Windows系統的寫字闆就是基于RichEdit的。我也基于RichEdit做了一個模仿寫字闆的程式,具體介紹點選此處檢視,完整代碼點選此處下載下傳。
注:關于MFC的程式,還是MSDN最詳細,這裡隻是介紹常用功能,是以每一節我都會給出MSDN的連結,大家可以去查閱。
在基于對話框的程式裡使用RichEdit
MFC的工具箱裡提供了RichEdit控件,我們可以直接拖放到對話框裡。如圖所示:
我們把一個RichEdit放進對話框裡,編譯運作程式,發現對話框無法正常顯示。我們要在CXXXApp(XXX是工程名)類的InitInstance函數中加入一句:
這樣,對話框就可以正常顯示了。
Visual Studio 2019預設的RichEdit版本是2.0,而現在RichEdit已經出了很多新版本,如RichEdit 4.1。使用RichEdit 4.1的方法如下:
打開解決方案資料總管,找到XXX.rc檔案(XXX是工程名),右擊,點選“檢視代碼”。
在裡面我們可以找到一句
把其中的"RichEdit20W"改為"RichEdit50W",然後InitInstance中的
AfxInitRichEdit2();
改為
AfxInitRichEdit5();
,就OK了。
注:修改為RichEdit 4.1後,MFC會識别不了,是以無法修改屬性,建議在修改之前把RichEdit的屬性修改好。
RichEdit之基本函數
RichEdit的功能被封裝在CRichEditCtrl類裡。我們可以為控件添加一個變量,或者通過GetDlgItem擷取句柄。
點選此處跳轉到MSDN的相關介紹
CRichEditCtrl類的常用函數如下:
擷取/設定屬性函數
注:以下函數除标*的外,均有與其對應的Set函數,功能也相對應,還有一些函數是派生過來的,如GetWindowText等,此處不再贅述。
GetSelectionCharFormat
擷取標明内容的字型格式。
cf:用來接收字型格式。
GetDefaultCharFormat
擷取預設的字型格式。
cf:用來接收字型格式。
GetSel
void GetSel(CHARRANGE& cr) const;
void GetSel(
long& nStartChar,
long& nEndChar) const;
擷取使用者標明的範圍。
cr:用來接收範圍。
nStartChar:用來接收標明内容的開始坐标。
nEndChar:用來接收標明内容的結束坐标。
GetSelText *
用來擷取標明内容。
GetParaFormat
擷取標明内容的段落屬性。
pf:用來接收字型格式。
GetEventMask
擷取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
擷取是否可以撤銷。
CanRedo
擷取是否可以恢複。
EmptyUndoBuffer
清除撤銷緩沖區,使RichEdit無法撤銷。
注意:使用SetWindowText函數時,會自動清除撤銷緩沖區。
Undo
撤銷一次操作。
Redo
恢複上一次撤銷的操作。
複制/粘貼函數
Copy
把標明内容複制到剪貼闆。
CanPaste
擷取是否能粘貼。
nFormat:想粘貼的剪貼闆格式。0為不指定。
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:行間距的類型,可以是以下值之一。
值 | 意義 |
---|---|
單倍行距。 忽略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的小程式,附上連結:
介紹
代碼下載下傳