CRichEditCtrl :: StreamIn теряет форматирование

Я создаю CRichEditCtrl контролировать и пытаться загрузить в него немного RTF. Кажется, что текст загружается нормально, но он теряет все форматирование, по сути становится простым текстом.

Я думаю, что некоторого примера кода должно быть достаточно, чтобы прояснить это:

class MyWindow : public CWnd {

void Setup();
static DWORD CALLBACK StreamInCallback_(
DWORD_PTR dwCookie, LPBYTE pbBuff,
LONG cb, LONG *pcb);
...
CRichEditCtrl content_;
};void MyWindow::Setup() {
RECT text_rect;
GetClientRect(&text_rect);
text_rect.left += 8;
text_rect.right -= 16;
text_rect.top += 8;
text_rect.bottom -= 36;

content_.Create(WS_CHILD | WS_VISIBLE | ES_MULTILINE,
text_rect, this, 1001);
content_.SetTextMode(TM_RICHTEXT);

CString text = L"{\\rtf1\\par Simple \\b example \\b0}";
EDITSTREAM es;
es.dwCookie = reinterpret_cast<DWORD_PTR>(&text);
es.pfnCallback = StreamInCallback_;
int n = content_.StreamIn(SF_RTF, es);
}

DWORD CALLBACK MyWindow::StreamInCallback_(DWORD_PTR dwCookie, LPBYTE pbBuff,
LONG cb, LONG *pcb) {
CString *pText = reinterpret_cast<CString *>(dwCookie);

if (cb > pText->GetLength()) {
cb = pText->GetLength();
}

// TODO: this will only work for US-ASCII
for (int i = 0; i < cb; i++) {
*(pbBuff + i) = (BYTE) pText->GetAt(i);
}

*pcb = cb;
*pText = pText->Mid(cb);

return 0;
}

Вы можете увидеть пример того, как это выглядит на скриншоте ниже:

введите описание изображения здесь

Как видите, у него есть текст ОК, но слово «пример» должно быть выделено жирным шрифтом. Я пробовал много разных RTF, даже взяв то, что сохранено в Wordpad, и использовал его напрямую, но он все равно отображает только текст в виде простого текста, и все форматирование теряется. Никаких ошибок не возвращается ни от одного из вызовов функций.

1

Решение

Конечно, выглядит правильно для меня. Хотя я никогда не использовал SetTextMode(TM_RICHTEXT) при работе с контентом RTF. Попробуйте удалить этот звонок.

Кроме того, ошибочный StreamInCallback может привести к странным текстовым проблемам. Я предлагаю вам сделать это правильно с самого начала:

DWORD CALLBACK CBStreamIn(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
CString *pstr = (CString*)dwCookie;

if (pstr->GetLength() < cb)
{
*pcb = pstr->GetLength();
memcpy(pbBuff, (LPCSTR) *pstr, *pcb);
pstr->Empty();
}
else
{
*pcb = cb;
memcpy(pbBuff, (LPCSTR) *pstr, *pcb);
*pstr = pstr->Right(pstr->GetLength() - cb);
}

return 0;
}
1

Другие решения

Попробуйте, если настройка заголовков в RTF работает. Проверьте следующую ссылку

http://www.biblioscape.com/rtf15_spec.htm

Проверьте, работает ли это в вашем richeditctrl.

{\\rtf1\\ansi\\deff0{\\fonttbl{\\f0\\fnil\\fcharset0 Calibri;}}\\par Simple \\b example \\b0}
0

По вопросам рекламы [email protected]