RichEditCtrl在撤消堆栈上推送着色和选择事件

时间:2015-09-11 13:51:20

标签: c++ user-interface mfc controls undo-redo

在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

0 个答案:

没有答案