• 前几天,写一个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没有被回调。将"\"修改为"\\",问题解决了。虽然我在调试时也看到了这种现象,但没有给与足够的重视。如果早期重视的话,不至于不能成功。
    在今后的开发中,当问题出现时,一定要注意细节。