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 通知可實現光標區域限制,滿足「圖標後輸入」需求。