CRichEditCtrl附加彩色文字?

时间:2012-12-01 02:40:07

标签: c++ text mfc colors cricheditctrl

我在MFC项目中有一个CRichEditCtrl,我将其用作报告日志。 根据给定的情况,我需要在控件上附加不同颜色的文本(例如,标准通知的蓝线,错误的红线等)。 我已经非常接近让它工作,但它仍然表现得很奇怪:

void CMyDlg::InsertText(CString text, COLORREF color, bool bold, bool italic)
{
    CHARFORMAT cf = {0};
    CString txt;
    int txtLen = m_txtLog.GetTextLength();
    m_txtLog.GetTextRange(0, txtLen, txt);

    cf.cbSize = sizeof(cf);
    cf.dwMask = (bold ? CFM_BOLD : 0) | (italic ? CFM_ITALIC : 0) | CFM_COLOR;
    cf.dwEffects = (bold ? CFE_BOLD : 0) | (italic ? CFE_ITALIC : 0) |~CFE_AUTOCOLOR;
    cf.crTextColor = color;

    m_txtLog.SetWindowText(txt + (txt.GetLength() > 0 ? "\n" : "") + text);
    m_txtLog.SetSel(txtLen, m_txtLog.GetTextLength());
    m_txtLog.SetSelectionCharFormat(cf);
}

最好的结果是,新添加的线条被适当地着色,但之前的所有文本都变黑了。最重要的是,对于每个附加的文本行,起始选择似乎增加1.例如:

Call #1:
- [RED]This is the first line[/RED]

Call #2:
- [BLACK]This is the first line[/BLACK]
- [GREEN]This is the second line[/GREEN]

Call #3:
- [BLACK]This is the first line[/BLACK]
- [BLACK]This is the second line[/BLACK]
- [BLUE]This is the third line[/BLUE]

Call #4:
- [BLACK]This is the first line[/BLACK]
- [BLACK]This is the second line[/BLACK]
- [BLACK]This is the third line[/BLACK]
- [BLACK]T[/BLACK][YELLOW]his is the fourth line[/YELLOW]

Call #5:
- [BLACK]This is the first line[/BLACK]
- [BLACK]This is the second line[/BLACK]
- [BLACK]This is the third line[/BLACK]
- [BLACK]This is the fourth line[/BLACK]
- [BLACK]Th[/BLACK][ORANGE]is is the fifth line[/ORANGE]

etc...

那么我该如何解决这个问题呢?所有以前的文字和格式都保持原样,同时附加一行新的彩色文字?

3 个答案:

答案 0 :(得分:5)

您的示例代码通过调用GetTextRange()从对话框中读取旧文本。这不包括任何丰富的格式,因此,当文本放回原位时,它不会格式化。您可以通过在文本区域的末尾“插入”而不进行任何选择并调用ReplaceSel()来完全放弃。

我认为你的方法应该是这样的:

void CMFCApplication2Dlg::InsertText(CString text, COLORREF color, bool bold, bool italic)
{
    CHARFORMAT cf = {0};
    int txtLen = m_txtLog.GetTextLength();

    cf.cbSize = sizeof(cf);
    cf.dwMask = (bold ? CFM_BOLD : 0) | (italic ? CFM_ITALIC : 0) | CFM_COLOR;
    cf.dwEffects = (bold ? CFE_BOLD : 0) | (italic ? CFE_ITALIC : 0) |~CFE_AUTOCOLOR;
    cf.crTextColor = color;

    m_txtLog.SetSel(txtLen, -1); // Set the cursor to the end of the text area and deselect everything.
    m_txtLog.ReplaceSel(text); // Inserts when nothing is selected.

    // Apply formating to the just inserted text.
    m_txtLog.SetSel(txtLen, m_txtLog.GetTextLength());
    m_txtLog.SetSelectionCharFormat(cf);
}

答案 1 :(得分:0)

我从尝试使之工作中学到的东西是,您不能像上面的示例那样仅设置标志。这样做:

export BOOTSTRAP_SERVERS=localhost:9096
export SOURCE_TOPIC=source_topic
export TARGET_TOPIC=target_topic

kafkacat -C -b $BOOTSTRAP_SERVERS -o beginning -e -t $SOURCE_TOPIC  | kafkacat -P -b $BOOTSTRAP_SERVERS  -t $TARGET_TOPIC

可以工作一半,但是如果使用CRichEditCtrl(作为示例)并获取当前格式,则将浪费很多时间(尽管我认为这对我来说是没有发生的。)问题是上面的标志用于设置要切换的值。因此,这实际上更有效:

 cf.dwMask = (bold ? CFM_BOLD : 0) | (italic ? CFM_ITALIC : 0) | CFM_COLOR;

如果您不这样做,即使您清除它,格式也将保留。它使我挠了一下头,并且做了很多谷歌搜索来修复它。

答案 2 :(得分:0)

在插入新文本之前分配格式。如果在插入后应用格式,则最终将得到格式错误的文本。

app/build/outputs/**/mapping.txt