天天看點

MFC RichEdit控件使用方法大全RichEdit簡介在基于對話框的程式裡使用RichEditRichEdit之基本函數RichEdit之字型設定RichEdit之段落格式設定後記

RichEdit簡介

RichEdit的意思是“富文本編輯控件”,在Edit的基礎上添加了很多功能,如對不同字型、字号、文本顔色、背景色、插入Ole對象的支援,Windows系統的寫字闆就是基于RichEdit的。我也基于RichEdit做了一個模仿寫字闆的程式,具體介紹點選此處檢視,完整代碼點選此處下載下傳。

注:關于MFC的程式,還是MSDN最詳細,這裡隻是介紹常用功能,是以每一節我都會給出MSDN的連結,大家可以去查閱。

在基于對話框的程式裡使用RichEdit

MFC的工具箱裡提供了RichEdit控件,我們可以直接拖放到對話框裡。如圖所示:

MFC RichEdit控件使用方法大全RichEdit簡介在基于對話框的程式裡使用RichEditRichEdit之基本函數RichEdit之字型設定RichEdit之段落格式設定後記

我們把一個RichEdit放進對話框裡,編譯運作程式,發現對話框無法正常顯示。我們要在CXXXApp(XXX是工程名)類的InitInstance函數中加入一句:

這樣,對話框就可以正常顯示了。

Visual Studio 2019預設的RichEdit版本是2.0,而現在RichEdit已經出了很多新版本,如RichEdit 4.1。使用RichEdit 4.1的方法如下:

打開解決方案資料總管,找到XXX.rc檔案(XXX是工程名),右擊,點選“檢視代碼”。

MFC RichEdit控件使用方法大全RichEdit簡介在基于對話框的程式裡使用RichEditRichEdit之基本函數RichEdit之字型設定RichEdit之段落格式設定後記

在裡面我們可以找到一句

把其中的"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的小程式,附上連結:

介紹

代碼下載下傳

繼續閱讀