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

Posted

技术标签:

【中文标题】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); 【发布时间】:2015-10-19 20:57:43 【问题描述】:

在将工具从 VC++ 6.0 转换为 VS2013 时发现问题。该错误不是代码中的实际错误,因为代码编译时没有“错误”并且工作正常。程序进行了最低限度的调整,几乎没有对代码进行真正的更改,以允许程序在 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 证实了这一点。

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

【问题讨论】:

我只是发布这个,因为我还没有解决这个问题。 【参考方案1】:

在故障排除期间,编写以下代码以将字符串推送到文本文件。

#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 文件扩展名。奇怪的是,该程序并没有查看我们所有的格式,而是在混合中添加了一些代码,因为写字板文件和文本文件的大小因大小而异。然后,我们将每个文件“拖放”到记事本程序中以供进一步审查。奇怪的是,“\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 格式放置在它丢失的地方的东西中。

另一种选择是让一个喜欢利用富文本的强大功能并能记住所有格式化方法的人在场。

如果你想勇敢,这里也是微软论坛的讨论:

Microsoft Forum GetRichEditCtrl().StreamIn breaks on formating

【讨论】:

以上是关于C++ MFC VC 6.0 到 VS2013 lStreamReturn = GetRichEditCtrl().StreamIn(SF_RTF, es);的主要内容,如果未能解决你的问题,请参考以下文章

实现 COM 接口 C++ / VC++ 6.0 / MFC

如何将 VC++6.0 项目升级到 VS2010?

MinGw与VC++6.0的区别有那些

VC6 到 VS2013 MFC 运行时错误

vc6.0 mfc窗口问题

从 C# 调用非托管 C++ VS 6.0 MFC dll