gpt4 book ai didi

c++ - CRichEditCtrl::StreamIn 丢失格式

转载 作者:太空宇宙 更新时间:2023-11-04 12:05:21 24 4
gpt4 key购买 nike

我正在创建一个 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;
}

您可以在下面的屏幕截图中看到一个示例:

enter image description here

如您所见,它的文本没问题,但“example”这个词应该是粗体。我尝试了很多不同的 RTF,甚至使用写字板保存的内容并直接使用它,但它仍然只将文本显示为纯文本并且所有格式都丢失了。任何函数调用也不会返回错误。

最佳答案

当然对我来说看起来是正确的。不过,在处理 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;
}

关于c++ - CRichEditCtrl::StreamIn 丢失格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12399510/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com