首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

VC++ 在 RichEditView 中以程式碼寫入文字:末尾追加、游標插入、全選

     編輯:VC 教學

前言

使用 AppWizard 建立 SDI/MDI 專案時選擇 `CRichEditView`,即可獲得支援富文本的視圖類別。但如何在文件類別或命令處理函數中,以程式碼向視圖寫入文字、插入格式化內容、操作選取範圍,是常見需求。本文整理三大核心操作模式:末尾追加、游標位置插入/取代、全選,並說明 `CRichEditView`、`CRichEditDoc`、`CRichEditCtrl` 三者關係與存取路徑。

一、架構關係與存取路徑


// 文件類別中取得視圖指標
CRichEditView* pView = GetView(); // 可能有多個視圖,通常取第一個
// 視圖取得底層 RichEdit 控制項參考
CRichEditCtrl& edit = pView->GetRichEditCtrl();
// 直接操作 edit 即可

二、核心操作範例

1. 在文件末尾追加文字(含換行)


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);
}

2. 在游標位置插入或取代選取文字


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);
}

3. 全選文件內容


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);
}

四、常見問題與技巧

  • 多視圖:`GetView()` 僅回傳第一個視圖。分割視窗時需遍歷 `GetFirstViewPosition()` / `GetNextView()` 找對應視圖。
  • UNDO 支援:`ReplaceSel` 會自動記入撤銷堆疊。若批次大量寫入,可用 `SetUndoLimit(0)` 暫停,完成後恢復。
  • 效能:大量文字建議 `SetRedraw(FALSE)` → 操作 → `SetRedraw(TRUE)` + `Invalidate()`。
  • RTF 流:完整文件匯入/匯出用 `EDITSTREAM` + `StreamIn/StreamOut` 回調函數。

五、結語

`CRichEditView` 封裝了 `CRichEditCtrl`,核心操作皆委派給底層控制項。掌握 `GetView()` → `GetRichEditCtrl()` → `SetSel/ReplaceSel/SetSelectionCharFormat` 三步驟,即可實現文末追加、游標插入、格式化插入、全選等所有程式化編輯需求。這是開發基於 RichEdit 的編輯器、日誌檢視器、報表產生器的基礎技能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved