首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

MFC CRichEditView 設置光標位置:SetSel 與 ReplaceSel 用法

     編輯:程式設計疑難解答

需求場景

MFC 單文檔多視圖,繼承 CRichEditView,視圖前部加載小圖標,要求編輯時光標始終在圖標右側,即每次輸入起始位置固定。

解決方案

使用 CRichEditCtrl::SetSel() 設置選區(光標位置),ReplaceSel() 插入內容:

關鍵代碼


void CMyRichEditView::OnInitialUpdate() {
    CRichEditView::OnInitialUpdate();
    CRichEditCtrl& edit = GetRichEditCtrl();
    
    // 假設圖標佔用前 2 個字符位置(需根據實際測量調整)
    int iconLength = 2; 
    
    // 設置光標位置:起始=結束=iconLength,即插入點在圖標後
    edit.SetSel(iconLength, iconLength);
    
    // 可選:防止用戶移動光標到圖標前
    // 需處理 EN_SELCHANGE 通知,強制恢復
}

void CMyRichEditView::OnEnSelChange() {
    CRichEditCtrl& edit = GetRichEditCtrl();
    CHARRANGE cr;
    edit.GetSel(cr);
    if (cr.cpMin < iconLength || cr.cpMax < iconLength) {
        edit.SetSel(iconLength, iconLength); // 強制恢復
    }
    CRichEditView::OnEnSelChange();
}

函數詳解

  • SetSel(nStart, nEnd):設置選區範圍。nStart == nEnd 時為插入點(光標位置)。
  • ReplaceSel(lpszNewText, bCanUndo):替換當前選區內容,常用於程序化插入文本。
  • GetSel(CHARRANGE& cr):獲取當前選區。

進階:圖標佔位符方案

若圖標為 OLE 對象或圖片,可插入特殊字符作為佔位符:


edit.SetSel(0, 0);
edit.ReplaceSel(_T("□")); // 佔位符
edit.SetSel(1, 1); // 光標在佔位符後

並設置佔位符為只讀/保護格式,防止被刪除:


CHARFORMAT2 cf = {0};
cf.cbSize = sizeof(CHARFORMAT2);
cf.dwMask = CFM_PROTECTED;
cf.dwEffects = CFE_PROTECTED;
edit.SetSel(0, 1);
edit.SetSelectionCharFormat(cf);

總結

SetSel() 是設置光標位置的核心 API,配合 EN_SELCHANGE 通知可實現光標區域限制,滿足「圖標後輸入」需求。

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