使用 AppWizard 建立 SDI/MDI 專案時選擇 `CRichEditView`,即可獲得支援富文本的視圖類別。但如何在文件類別或命令處理函數中,以程式碼向視圖寫入文字、插入格式化內容、操作選取範圍,是常見需求。本文整理三大核心操作模式:末尾追加、游標位置插入/取代、全選,並說明 `CRichEditView`、`CRichEditDoc`、`CRichEditCtrl` 三者關係與存取路徑。
// 文件類別中取得視圖指標
CRichEditView* pView = GetView(); // 可能有多個視圖,通常取第一個
// 視圖取得底層 RichEdit 控制項參考
CRichEditCtrl& edit = pView->GetRichEditCtrl();
// 直接操作 edit 即可
void CRichEditDoc::OnTextWriteAfter()
{
CRichEditView* pView = GetView();
if (!pView) return;
CRichEditCtrl& edit = pView->GetRichEditCtrl();
CString str = _T("ABCDEFG\r\n"); // 要寫入的內容
// 取得目前文字長度 = 末尾位置
int nLen = edit.GetWindowTextLength();
// 設定選取範圍為末尾(空選取)
edit.SetSel(nLen, nLen);
// 取代選取範圍(空選取即為插入)
edit.ReplaceSel(str);
}
void CRichEditDoc::OnTextWriteAtCursor()
{
CRichEditView* pView = GetView();
if (!pView) return;
CRichEditCtrl& edit = pView->GetRichEditCtrl();
CString str = _T("12345");
CHARRANGE cr;
edit.GetSel(cr); // 取得目前選取範圍
if (cr.cpMin != cr.cpMax)
{
// 有選取文字:取代選取範圍
edit.SetSel(cr.cpMin, cr.cpMax);
}
else
{
// 無選取:在游標處插入
edit.SetSel(cr.cpMax, cr.cpMax);
}
edit.ReplaceSel(str);
}
void CRichEditDoc::OnTextSelectAll()
{
CRichEditView* pView = GetView();
if (!pView) return;
CRichEditCtrl& edit = pView->GetRichEditCtrl();
edit.SetSel(0, -1); // cpMin=0, cpMax=-1 表示全選
}
使用 `CHARFORMAT2` 設定字體、顏色、粗體等,配合 `SetSelectionCharFormat`:
void CRichEditDoc::OnInsertFormattedText()
{
CRichEditView* pView = GetView();
if (!pView) return;
CRichEditCtrl& edit = pView->GetRichEditCtrl();
CHARFORMAT2 cf = {0}; cf.cbSize = sizeof(CHARFORMAT2);
cf.dwMask = CFM_BOLD | CFM_COLOR | CFM_FACE | CFM_SIZE;
cf.dwEffects = CFE_BOLD;
cf.crTextColor = RGB(255, 0, 0); // 紅色
_tcscpy_s(cf.szFaceName, _T("微軟正黑體"));
cf.yHeight = 240; // 12 點 = 240 twips
int nLen = edit.GetWindowTextLength();
edit.SetSel(nLen, nLen);
edit.SetSelectionCharFormat(cf); // 設定後續輸入格式
edit.ReplaceSel(_T("這是紅色粗體文字\r\n"));
// 重置為預設格式
cf.dwEffects = 0; cf.crTextColor = RGB(0,0,0);
_tcscpy_s(cf.szFaceName, _T("新細明體"));
cf.yHeight = 200;
edit.SetSelectionCharFormat(cf);
}
`CRichEditView` 封裝了 `CRichEditCtrl`,核心操作皆委派給底層控制項。掌握 `GetView()` → `GetRichEditCtrl()` → `SetSel/ReplaceSel/SetSelectionCharFormat` 三步驟,即可實現文末追加、游標插入、格式化插入、全選等所有程式化編輯需求。這是開發基於 RichEdit 的編輯器、日誌檢視器、報表產生器的基礎技能。