我正在创建一个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保存的内容并直接使用它,但它仍然只显示纯文本文本,所有格式都丢失了。任何函数调用都不会返回任何错误。
答案 0 :(得分:1)
当然看起来对我不对。虽然,我在处理RTF内容时从未使用SetTextMode(TM_RICHTEXT)
。尝试删除该电话。
此外,错误的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 :(得分:0)
尝试在RTF中设置标头是否有效。检查以下链接
http://www.biblioscape.com/rtf15_spec.htm
检查你的richeditctrl是否有效。
{\\rtf1\\ansi\\deff0{\\fonttbl{\\f0\\fnil\\fcharset0 Calibri;}}\\par Simple \\b example \\b0}