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...");
Другие вопросы по тегам