在MFC对话框中,我有一个RichEditCtrl(2.0)。让我们想要突出显示文本字段中的每个 1 。因此,在对话框类中,我听ctrl的EN_CHANGE消息并调用以下函数
void CParentDlg::OnEnChange()
{
CHARRANGE sel;
mRichEdit.GetSel(sel);
CHARFORMAT2 numCharFormat;
mRichEdit.GetDefaultCharFormat(numCharFormat);
numCharFormat.dwMask |= CFM_COLOR;
numCharFormat.dwEffects &= ~CFE_AUTOCOLOR;
numCharFormat.crTextColor = RGB(0, 255, 0);
CHARFORMAT2 defaultCharFormat;
mRichEdit.GetDefaultCharFormat(defaultCharFormat);
CString text;
mRichEdit.GetWindowText(text);
for (int i = 0; i < text.GetLength(); ++i)
{
wchar_t c = text[i];
CHARRANGE cR = { i, i + 1 };
mRichEdit.SetSel(cR);
if (c == L'1')
{
mRichEdit.SetWordCharFormat(numCharFormat);
}
else
{
mRichEdit.SetWordCharFormat(defaultCharFormat);
}
}
mRichEdit.SetSel(sel);
}
这里,mRichEdit是CParentDlg的CRichEditCtrl成员。 着色效果很好。
问题是,所有中间选择和着色都被推到撤消堆栈上。按Ctrl + Z时,不会删除最后一个字母,而是还原最后一个选择或颜色。
是否可以忽略撤消堆栈的选择和颜色?或者我自己必须实现撤消堆栈?
对照的文本模式是42(sic!),即TM_RICHTEXT | TM_MULTILEVELUNDO | TM_MULTICODEPAGE