如何在富编辑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代码和标题。
答案 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...");