C++ MFC VC 6.0 到 VS2013 lStreamReturn = GetRichEditCtrl().StreamIn(SF_RTF, es);

C++ MFC VC 6.0 to VS2013 lStreamReturn = GetRichEditCtrl().StreamIn(SF_RTF, es);

在将工具从 VC++ 6.0 转换到 VS2013 时发现问题。该错误不是代码中的实际错误,因为代码在没有 "errors" 的情况下编译并且工作正常。该程序已进行了最低限度的调整,几乎没有对代码进行真正的更改,以允许该程序 运行 并在 VS2013 中正常运行,或者我认为如此。当我们测试从外部存储设备读取的代码时,它在应用程序的左窗格中显示了 RichText 树,它似乎可以处理所有存在的数据,但我们已经习惯了 Rich Text主应用程序的右窗格中不存在目视。最让我感兴趣的是,在原来的程序中你不能编辑文本,但在我们最新编译的程序中,你可以看到该区域并没有改变它的原始状态。几乎就好像数据正在进入应用程序,但由于某些奇怪的原因,在显示到窗格之前就被解雇或删除了。

这就是问题所在,当 WCARichEdit.cpp 执行此操作时 “

EDITSTREAM es;    
es.dwError=0;    
es.dwCookie =  (DWORD) &Report;    
es.pfnCallback = CBStreamIn;    
lStreamReturn  = GetRichEditCtrl().StreamIn(SF_RTF, es);    
GetRichEditCtrl().SetReadOnly(TRUE);

"
除非 SF_RTF 更改为 SF_TEXT,否则它会中断或抛出错误 0。然后代码生成所有数据,但格式被读入文本流。那是一个巨大的流。我们假设此代码中的格式是编译代码时文本未显示的罪魁祸首。所以当 SplitterFrame.CPP 这样做时

Void CSplitterFrame::DisplayReport(CString Report)

{

   CWcaRichEdit*RichEditView = (CWcaRichEdit*) m_wndSplitter.GetPane(0,1);

   CH1_MainteanceToolDoc*pDoc = (CH1_MainteanceToolDoc*)
      ((CMainFrame *)AfxGetMainWnd())->GetActiveDocument();

   RichEditView->DisplayReport(pDoc, Report);
}

” RichEditView->DisplayReport(pDoc, Report) 似乎没有得到任何代码,因为它只是被清零了。当 SF_RTF 保持不变时,dwError=0 显示没有变化证实了这一点。

关于如何显示此富文本的任何想法?

在故障排除过程中,编写了以下代码以将字符串推送到文本文件。

#if
DWORD dwError;

CFile testfile;
if (0 == testfile.Open ("C:\...rtftestfile.txt", CFile::modeCreate | CFile:modeWrite | CFile::shareDenyNone))
{
    dwError = GetLastError();
{
testfile.Write((LPCTSTR) Report, Report.GetLength());
testfile.Close();
#endif

文件创建成功,一时兴起,决定用写字板打开.text文件后保存文件。然后我们将该文件另存为新的 .rtf 文件扩展名。奇怪的是,该程序没有查看我们所有的格式,而是在混合中添加了一些代码,因为写字板文件和文本文件的大小因大小而异。然后我们将每个文件 "Drag and Drop" 编辑到记事本程序中以供进一步审查。奇怪的是,“\rtf1”被添加到我们巨大的字符串的开头。奇怪,写字板为什么要添加……等等。意识到这一点,我们返回并更改了我们的代码

const char RTF_Header[] = "{\ansi\ansicpg1252\deff0\deflang1033{\fontbl{\f0\fnil\fcharset0 Courier New;}}\viewkind4\uc1\pard\fs17 ";

const char RTF_Header[] = "{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fontbl{\f0\fnil\fcharset0 Courier New;}}\viewkind4\uc1\pard\fs17 ";

学习点是这样的,如果您知道您的格式正在破坏您的代码,请将这个巨大的字符串打印到一个文件中以查看它在做什么并将其推送到将 rtf 格式放在它丢失的地方的地方。

另一种选择是让一个喜欢利用 Rich Text 强大功能并且能记住格式化它的所有方法的人在身边。

如果你想勇敢一点,这里还有 Microsoft 论坛讨论:

Microsoft Forum GetRichEditCtrl().StreamIn breaks on formating