1

我将如何在 Rich Edit 2.0 控件中格式化文本?到目前为止,我只有一个简单的 MFC 小程序,只有一个视图和一个丰富的编辑 2.0 控件。它目前是空的,但我想在其中插入一些文本。

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

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

所以就目前而言,当我运行我的程序时,它会将文本插入到我的控件中。如何从整个字符串中使单词变为粗体?

例如,我只想让它说:“这是一些随机文本!” 就目前而言,我可以使整个控件加粗,但我不希望整个控件加粗,只是一个字。

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

我试图将 RTF 代码插入到我的 INIValue2 中,但它不会接受它。除非我用错了,否则很可能是这样。

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

Edit1:并不是我的 INIValue2 不接受它,而是当它出现在我的单个视图上时 - 它显示了所有内容 - 包括所有 RTF 代码和标题。

4

1 回答 1

1

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

首先,CRichEditCtrl在对话框或窗口类中声明成员数据

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);

您可以使用辅助函数来简化此操作。例如看这篇文章


要直接分配 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...");
于 2016-05-28T04:38:20.437 回答