MFC SDI rich edit 2.0 слова управления жирным шрифтом
Как мне отформатировать текст в элементе управления edit 2.0? На данный момент у меня есть просто небольшая программа MFC с одним представлением и только один элемент управления rich edit 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 и заголовок.
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...");