关于RichEdit中设置和获取RTF格式时碰到的有关问题,有经验的请进
关于RichEdit中设置和获取RTF格式时碰到的问题,有经验的请进
我用SetRTF函数对RICHEDIT设置了RTF文本,但设置完后用GetRTF查看时获得的RTF文本和设置的不完全一致。
以下是SetRTF和GetRTF的实现
void COutLookRichEdit::SetRTF(CString sRTF)
{
EDITSTREAM es;
es.dwError = 0;
es.pfnCallback = CBStreamIn;
es.dwCookie = (DWORD) &sRTF;
StreamIn(SF_RTF, es); // Do it.
}
DWORD CALLBACK COutLookRichEdit::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;
}
CString COutLookRichEdit::GetRTF()
{
CString sRTF;
EDITSTREAM es;
es.dwError = 0;
es.pfnCallback = CBStreamOut;
es.dwCookie = (DWORD) &sRTF;
StreamOut(SF_RTF| SFF_SELECTION, es); // Do it.
return sRTF;
}
DWORD CALLBACK COutLookRichEdit::CBStreamOut(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
CString *psEntry = (CString*) dwCookie;
CString tmpEntry = _T( " ");
tmpEntry = (CString) pbBuff;
*psEntry += tmpEntry.Left(cb);
return 0;
}
RTF格式的字符串如下:
RICHEDIT中原始的RTF串: {\rtf1\ansi\ansicpg932\deff0\deflang1033\deflangfe1041{\fonttbl{\f0\fswiss\fprq2\fcharset0 MS Sans Serif;}}
\viewkind4\uc1\pard\lang1041\f0\fs17
\par }
设置的RTF串:{\rtf1\ansi\deff0\deftab720{\fonttbl{\f0\fswiss MS Sans Serif;}{\f1\froman\fcharset2 Symbol;}{\f2\froman Times New Roman;}{\f3\fswiss Arial;}}{\colortbl\red0\green0\blue0;\red0\green0\blue255;}\deflang1033\pard\plain\f2\fs20 Click \plain\f2\fs20\cf1\ul here\plain\f2\fs20 to see the about box.}
设置完后用GetRTF读取出来的RTF串: {\rtf1\ansi\deff0\deflang1033{\fonttbl{\f0\froman Times New Roman;}}
{\colortbl ;\red0\green0\blue255;}
\viewkind4\uc1\pard\f0\fs20 Click \cf1\ul here\cf0\ulnone to see the about box.
\par }
问题:
1) 为什么设置后读取出来的RTF串和设置串不完全一致?
2) 我如果想往RICHEDIT中插入一段RTF格式的内容,请问该如何实现?
------解决方案--------------------
CBStreamOut似乎有问题
DWORD CALLBACK COutLookRichEdit::CBStreamOut(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
CString *psEntry = (CString*) dwCookie;
CString tmpEntry = _T( " ");
tmpEntry = (LPCTSTR)pbBuff;
*psEntry += tmpEntry.Left(cb);
return 0;
}
------解决方案--------------------
每个人看的虽然不一样,但是运行的结果应该是一样的吧
他们的设置哪儿不一样了.
我用SetRTF函数对RICHEDIT设置了RTF文本,但设置完后用GetRTF查看时获得的RTF文本和设置的不完全一致。
以下是SetRTF和GetRTF的实现
void COutLookRichEdit::SetRTF(CString sRTF)
{
EDITSTREAM es;
es.dwError = 0;
es.pfnCallback = CBStreamIn;
es.dwCookie = (DWORD) &sRTF;
StreamIn(SF_RTF, es); // Do it.
}
DWORD CALLBACK COutLookRichEdit::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;
}
CString COutLookRichEdit::GetRTF()
{
CString sRTF;
EDITSTREAM es;
es.dwError = 0;
es.pfnCallback = CBStreamOut;
es.dwCookie = (DWORD) &sRTF;
StreamOut(SF_RTF| SFF_SELECTION, es); // Do it.
return sRTF;
}
DWORD CALLBACK COutLookRichEdit::CBStreamOut(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
CString *psEntry = (CString*) dwCookie;
CString tmpEntry = _T( " ");
tmpEntry = (CString) pbBuff;
*psEntry += tmpEntry.Left(cb);
return 0;
}
RTF格式的字符串如下:
RICHEDIT中原始的RTF串: {\rtf1\ansi\ansicpg932\deff0\deflang1033\deflangfe1041{\fonttbl{\f0\fswiss\fprq2\fcharset0 MS Sans Serif;}}
\viewkind4\uc1\pard\lang1041\f0\fs17
\par }
设置的RTF串:{\rtf1\ansi\deff0\deftab720{\fonttbl{\f0\fswiss MS Sans Serif;}{\f1\froman\fcharset2 Symbol;}{\f2\froman Times New Roman;}{\f3\fswiss Arial;}}{\colortbl\red0\green0\blue0;\red0\green0\blue255;}\deflang1033\pard\plain\f2\fs20 Click \plain\f2\fs20\cf1\ul here\plain\f2\fs20 to see the about box.}
设置完后用GetRTF读取出来的RTF串: {\rtf1\ansi\deff0\deflang1033{\fonttbl{\f0\froman Times New Roman;}}
{\colortbl ;\red0\green0\blue255;}
\viewkind4\uc1\pard\f0\fs20 Click \cf1\ul here\cf0\ulnone to see the about box.
\par }
问题:
1) 为什么设置后读取出来的RTF串和设置串不完全一致?
2) 我如果想往RICHEDIT中插入一段RTF格式的内容,请问该如何实现?
------解决方案--------------------
CBStreamOut似乎有问题
DWORD CALLBACK COutLookRichEdit::CBStreamOut(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
CString *psEntry = (CString*) dwCookie;
CString tmpEntry = _T( " ");
tmpEntry = (LPCTSTR)pbBuff;
*psEntry += tmpEntry.Left(cb);
return 0;
}
------解决方案--------------------
每个人看的虽然不一样,但是运行的结果应该是一样的吧
他们的设置哪儿不一样了.