我用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格式的内容,请问该如何实现?
以下是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格式的内容,请问该如何实现?
解决方案 »
- 看看以下代码是否能完成大写字母转换成小写字母的功能...........
- 设置编辑框的文字,很奇怪
- 用MFC框架CView及CFrameWnd类作打印模块在打印预览里按打印后为何不能继续?
- 有关异常处理问题
- 关于listBox控件问题。 很简单的。
- 我该怎么办,救救我呀.(来着有分,,不能见死不救呀)
- 我在查询后,如何判断记录集是否是空的?
- 关于在mfc中使用stl中的警告问题?
- 怎样用CreateWindow函数生成的窗体在任务栏不显示?
- 在未装ACCESS的机器上用自己写的程序访问*.mdb文件出错......(详细情况请入内)
- vc++ 中如何在两个Dialog传送数据谢谢!!
- 散分,交编程朋友了
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;
}
请问CBStreamOut有什么问题?
似乎应改为
tmpEntry = (LPCTSTR)pbBuff;