MFC SDI rich edit 2.0控件加粗字

MFC SDI rich edit 2.0 control bolding words

我将如何在 Rich Edit 2.0 控件中设置文本格式?截至目前,我只有一个简单的小 MFC 程序,带有一个视图和一个 rich edit 2.0 控件。它目前是空的,但我想在其中插入一些文本。

控件本身被标记为 StringToChange2,我的 class 中的成员是 m_StringToChange2。

    TCHAR INIValue2[256] = _T("Here is some random text!");
    SetDlgItemText(StringToChange2, INIValue2);

现在,当我 运行 我的程序将文本插入到我的控件中时。我怎样才能把整个字符串中的一个词加粗?

例如我只想说:"Here is some random text!" 就目前而言,我可以将整个控件设为粗体,但我不想让整个控件都变得粗体,只是一个字。

This Link 有一个与我要问的问题非常相似的问题,但它有两处错误。首先,几乎所有评论都告诉他使用 HTML 控件,我还不想求助于它。其次,确实回复他的人有这么长的代码片段,我不明白发生了什么。最后的答案建议他使用写字板,因为它使用 RTF?

我试图将 RTF 代码插入到我的 INIValue2 中,但它不接受。除非我用错了,否则情况很可能如此。

我一直在跟踪 MSDN 并阅读函数,但我对 MFC 和 richedit 控件的专业知识水平非常有限。如果有人可以 post 这方面的一个小例子,它甚至不必与我的问题相关,但我可以将其用作基础。

Edit1:不是我的 INIValue2 不接受它,而是当它出现在我的单一视图中时 - 它显示了所有内容 - 包括所有 RTF 代码和 header.

您必须使用 EM_SETCHARFORMAT 消息格式化文本。在MFC中,可以使用CRichEditCtrl::SetSelectionCharFormat

首先,在您的对话框中声明 CRichEditCtrl 成员数据或 window class

CRichEditCtrl m_richedit;

OnInitDialog中放

m_richedit.SubclassDlgItem(IDC_RICHEDIT21, this);

应用CHARFORMAT如下:

CHARFORMAT cf = { sizeof(cf) };
cf.dwEffects = CFM_BOLD;
cf.dwMask = CFM_BOLD;
m_richedit.SetSel(0,2);
m_richedit.SetSelectionCharFormat(cf);

您可以使用辅助函数来简化此过程。例如看这个 post


要直接分配 RTF 文本,您必须使用 EM_STREAMIN。由于某些原因 MFC 没有这方面的功能,因此您必须编写自己的功能

DWORD __stdcall callback_rtf_settext(DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
    CString *psBuffer = (CString*)dwCookie;
    if (cb > psBuffer->GetLength()) 
        cb = psBuffer->GetLength();
    for (int i = 0; i < cb; i++) 
        *(pbBuff + i) = (BYTE)psBuffer->GetAt(i);
    *pcb = cb;
    *psBuffer = psBuffer->Mid(cb);
    return 0;
}

bool setrtf(CRichEditCtrl &edit, const CString &s)
{
    EDITSTREAM es;
    edit.SetSel(0, -1);
    edit.Clear();
    memset(&es, 0, sizeof(es));
    es.dwCookie = (DWORD_PTR)&s;
    es.pfnCallback = callback_rtf_settext;
    edit.StreamIn(SF_RTF, es);
    return es.dwError == 0;
}

用法:

setrf(m_richedit, L"\rtf data...");