我想做一个单文档RichEdit视图的程序,自行实现RTF压缩功能,有何建议?

shineryu 2008-01-06 03:45:34
我的问题主要集中在重载CRichEditDoc::Serialize(CArchive& ar)函数的存储语句上。
我目前的思路是:
采用CRichEditCtrl::StreamOut()函数。MSDN中流输出的例子如下:
// My callback procedure that reads the rich edit control contents
// from a file.
static DWORD CALLBACK
MyStreamOutCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
CFile* pFile = (CFile*) dwCookie;

pFile->Write(pbBuff, cb);
*pcb = cb;

return 0;
}

// The example code.
// The pointer to my rich edit control.
extern CRichEditCtrl* pmyRichEditCtrl;
// The file to store the contents of the rich edit control.
CFile cFile(TEXT("myfile.rtf"), CFile::modeCreate|CFile::modeWrite);
EDITSTREAM es;

es.dwCookie = (DWORD) &cFile;
es.pfnCallback = MyStreamOutCallback;
pmyRichEditCtrl->StreamOut(SF_RTF, es);

我完全可以修改例子中的MyStreamOutCallback函数,在函数里先将pbBuff指向内存里的数据压缩后再保存到文件中。
但MSDN中又说了:
In the EDITSTREAM parameter es, you specify a callback function which fills a buffer with text. This callback function is called repeatedly, until the output stream is exhausted.

就是说,如果你的内容太多,StreamOut函数要多次调用MyStreamOutCallback函数来保存输出流。
这样的话,MyStreamOutCallback函数里pbBuff指向的内存就不一定是连续的了,也就是说,我要保存的文件就可能是分段压缩,这就会降低压缩效率。
当然也有一个方法,就是先开足够大的内存,等完全写入此内存后再做压缩存储。但是问题是不知道到底要开多大的内存,开太大占用资源太多,不是个好办法。

哪位有更好的办法吗?
...全文
177 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
shineryu 2008-01-08
  • 打赏
  • 举报
回复
我想,CRichEditCtrl这个类应该有存放控件内容的缓冲区,既然总要在内存中存放其数据,干脆一次把所有内容都格式化输出得了,干嘛搞那么麻烦?而且我直接找到CRichEditCtrl的实现,却没有找到我需要的缓冲区,MFC是怎么做到存取控件内容的?
可能我真要放弃我的想法了,分段压缩也不至于差到什么地步。
jameshooo 2008-01-06
  • 打赏
  • 举报
回复
取决于你的压缩算法,某些压缩算法是前后相关的,这种情况需要一次性压缩,某些压缩算法是分段进行的,你可以一段一段分别进行,多余的才做缓冲
shineryu 2008-01-06
  • 打赏
  • 举报
回复
谢过2楼。
那样的话似乎不太现实,而且但凡要分段输出了,肯定是要输出的内存量大,如果缓冲一下,那至少要两倍的内存,再加上压缩又要内存,不太经济。
jameshooo 2008-01-06
  • 打赏
  • 举报
回复
自己缓冲一下吧,等最后一次回调被调用时才执行你的压缩
shineryu 2008-01-06
  • 打赏
  • 举报
回复
另外问一个问题,StreamOut函数一次输出多少字节?是固定的吗?如果是固定输出字节量,而且量足够大,就不必串接内存了。

15,976

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧