-
前几天,写一个RTF站换为TXT文件格式的程序。这个程序主要利用richeditorCtrl来实现此项功能。在具体实现时使用了ITextServices和ITextDocument两个接口。也就是使用无窗口的RichEditor。关键代码如下:
DWORD CALLBACK EditStreamInBack(DWORD dwCookie, LPBYTE pbBuff, LONG cb,LONG *pcb)
{
//将输入数据通过dwCookie参数,传递给pbBuff,也就是传递给控件
WideCharToMultiByte(CP_OEMCP,NULL,(LPCWSTR)dwCookie,-1,(LPSTR)pbBuff,cb,NULL,FALSE);
return 0;
}DWORD CALLBACK EditStreamOutBack(DWORD dwCookie, LPBYTE pbBuff, LONG cb,LONG *pcb)
{
//将控件的数据以txt的形式,从pbBuff复制到dwCookie,dwCookie可以为外部保存txt的变量地址
strcpy((LPWSTR)dwCookie,A2T((char*)pTx));
return 0;
}CString RtfToText(ITextServices* pTextServ,TCHAR* szRTF)
{
WCHAR szBuffer[4096];
//接收rtf
EDITSTREAM es;
es.dwError = 0;
es.pfnCallback = EditStreamInBack;
es.dwCookie = (DWORD_PTR)szRTF;//传递RTF数据
LRESULT lResult;
pTextServ->TxSendMessage(EM_STREAMIN,(WPARAM)SF_RTF,(LPARAM)&es,&lResult);//返回txt
es.dwCookie = (DWORD_PTR)szBuffer;//接收RTF数据
es.pfnCallback = EditStreamOutBack;
pTextServ->TxSendMessage(EM_STREAMOUT,(WPARAM) SF_TEXT,(LPARAM)&es,&lResult);
return szBuffer;
}当我进行测试使用如下的rtf数据;
{\rtf1\ansi\ansicpg936\deff0\deflang1033\deflangfe2052{\fonttbl{\f0\fswiss\fcharset0 Arial;}{\f1\fnil MS Shell Dlg 2;}}
{\colortbl ;\red0\green0\blue0;}
\viewkind4\uc1\pard\tx720\cf1\lang2052\f0\fs18 gfjhfg\f1\fs20\par
}
我直接将该数据赋值给一个CString. 结果EditStreamOutBack函数从来都没有被调用。而当我将接收数据的格式该为:SF_RTF时,该函数被调用。这使得我郁闷了好几天。最后怀疑是否RichEditorCtrl具有将rtf2txt的能力。今天我终于发现了问题所在,我的rtf测试数据存在问题,当该数据被赋值给CString后,"\"就变成了未知的字符。也就是该数据不是一个rtf格式的数据了。所以EditStreamOutBack没有被回调。将"\"修改为"\\",问题解决了。虽然我在调试时也看到了这种现象,但没有给与足够的重视。如果早期重视的话,不至于不能成功。
在今后的开发中,当问题出现时,一定要注意细节。







