MFC SDI富编辑2.0控制粗体字

时间:2016-05-28 01:45:07

标签: c++ mfc format bold sdi

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

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

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

现在看来,当我运行我的程序时,它会将文本插入到我的控件中。如何从整个字符串中加粗?

例如我只想说:“这是一些随机文字!” 就目前而言,我可以使整个控制变得大胆,但我不希望整个事情变得大胆,只是一个字。

This Link与我提出的问题有一个非常相似的问题,但它有两个问题。首先,几乎所有的评论都告诉他使用我不想转向的HTML控件。其次,对他做出回应的那个人有如此长的代码片段,我不明白发生了什么。最后一个答案建议他使用字垫,因为它使用RTF?

我尝试将RTF代码插入到我的INIValue2中,但它不会接受它。除非我错误地使用它,否则情况可能就是这样。

我一直在跟踪MSDN并阅读这些功能,但我对MFC和richedit控制的专业水平非常有限。如果有人可以发布一个小例子,它甚至不必涉及我的问题,而是我可以用作基础的东西。

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

1 个答案:

答案 0 :(得分:0)

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

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

CRichEditCtrl m_richedit;

OnInitDialog put

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