我尝试将文本(以 RTF 格式)加载到我的RTF控件中,但是它不起作用。我什至尝试使用
WriteFile((HANDLE)dwCookie, myBuff, cb, (DWORD*)pcb, NULL);
代替
*pcb = rtf->readsome((char*)pbBuff, cb);
void CreateRichEdit(HWND hwndOwner, int x, int y, int width, int height, HINSTANCE hinst)
{
LoadLibrary(TEXT("Msftedit.dll"));
edittext = CreateWindowEx(0, TEXT("RICHEDIT50W"), TEXT("Type here"), ES_MULTILINE | WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP | ES_AUTOVSCROLL | WS_VSCROLL,
x, y, width, height,
hwndOwner, NULL, hinst, 0);
std::string teext = "{\rtf1\ansi{\fonttbl{ \f0\fnil\fcharset0\fprq0\fttruetype Helvetica; }{\f1\fnil\fcharset0\fprq0\fttruetype Bitstream Charter; }}{\f1\fs24 Ceci est un texte accentu\'e9}\par{ \f0\fs24 avec des caract\'e8res {\b gras},}\par{ \f1 des{ \fs18 petits } et des{ \fs32 gros }. }}";
std::stringstream rtf("{\rtf1\ansi{\fonttbl{ \f0\fnil\fcharset0\fprq0\fttruetype Helvetica; }{\f1\fnil\fcharset0\fprq0\fttruetype Bitstream Charter; }}{\f1\fs24 Ceci est un texte accentu\'e9}\par{ \f0\fs24 avec des caract\'e8res {\b gras},}\par{ \f1 des{ \fs18 petits } et des{ \fs32 gros }. }}");
//std::stringstream rtf("...");
EDITSTREAM es = { 0 };
es.dwError = 0;
es.dwCookie = (DWORD_PTR)&rtf;
es.pfnCallback = EditStreamInCallback;
SendMessage(edittext, EM_STREAMIN, SF_RTF, (LPARAM)&es);
}
DWORD CALLBACK EditStreamInCallback(DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG * pcb)
{
std::stringstream * rtf = (std::stringstream*) dwCookie;
std::string text = (*rtf).str();
char myBuff[500];
*pcb = rtf->readsome((char*)pbBuff, cb);
return *pcb;
}
我也试图取消注释std::stringstream rtf("...");
,仅是为了在编辑控件中写入...
,但这不起作用。
答案 0 :(得分:2)
通过返回从流中读取的字节数(在这种情况下为非零字节数),您可以告诉控件编辑流回调不成功。尝试使用return *pcb > 0 ? 0 : 1;
返回EditStreamInCallback
。您也可以考虑使用rtf->fail()
来确定此回调是否成功。此外,针对rtf
或NULL
测试nullptr
是一个好主意(以及成功或失败的指示)。
https://docs.microsoft.com/en-us/windows/desktop/api/Richedit/nc-richedit-editstreamcallback
回调函数返回零表示成功。
回调函数返回非零值以指示错误。如果发生错误,则读或写操作将结束,并且丰富编辑控件将丢弃pbBuff缓冲区中的所有数据。