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...");
我将如何在 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...");