博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何在CRichEditCtrl控件中直接读如RTF格式的文件
阅读量:4922 次
发布时间:2019-06-11

本文共 4957 字,大约阅读时间需要 16 分钟。

如何在CRichEditCtrl控件中直接读如RTF格式的文件

           Inserting an RTF string using StreamIn

--------------------------------------------------------------------------------

When inserting Rich Text Formatted text into the control there are two approaches you can take. Insert the control into the text, then select it and then format it. This can result in a lot of code and not very clean code at that. The other approach is that you can format the text into a CString variable and insert that in one fell swoop. This is much faster and reduces the number of lines of code.

Step 1: Define the EditStreamCallBack() callback function
When we stream in data into the rich edit control, we have to define a callback function that is called by the control to supply the actual data. This callback function can be called repeatedly by control till the function indicates that there is no more data.
One of the arguments passed to the callback function is an application defined value. We will use this value to pass in a CString object's address. The second argument is the address of the buffer where the data is to be written by the function, the third argument specifies the number of bytes requested by the rich edit control. The final argument is pointer to a long value. The callback function should set this value to the number of bytes actually copied to the buffer. If this value is less than the number of bytes requested by the control, then the control assumes that there is no more text available and it will stop calling this function.

We have defined the EditStreamCallBack() function as a file static function. This makes the function local to the file. We can define a function with the same name in another file. We could have defined this function as a class function but it would have had to be a class static function. Note the type CALLBACK. Forgetting to specify this can be cause for major headaches.

If you are a performance freak, you'll notice that this function is not very efficient for long strings. Also, this function modifies the string. You might want to enhance this if it is important to your application. For strings less than about 4KB this function is OK since it gets called only once.

static DWORD CALLBACK EditStreamCallBack(DWORD dwCookie, LPBYTE pbBuff, LONG cb,

     LONG *pcb)
{
 CString *pstr = (CString *)dwCookie;

 if( pstr->GetLength() < cb )

 {
  *pcb = pstr->GetLength();
  memcpy(pbBuff, (LPCSTR)*pstr, *pcb );
  pstr->Empty();
 }
 else
 {
  *pcb = cb;
  memcpy(pbBuff, (LPCSTR)*pstr, *pcb );
  *pstr = pstr->Right( pstr->GetLength() - cb );
 }
 return 0;
}

Step 2: Call StreamIn() with the right arguments

When inserting the RTF string, the information in the string should be complete otherwise it could mess up the formatting of the text in the control. That is, the string should contain the font information, the tab stops, the language, the font size etc. I won't go into the RTF format codes but the format code used in the sample code below should not be very difficult to decifer.
To build the RTF string, we use a prefix string with the preliminary information such as the font table, font size etc. We append our text to this string and at the end we add the postfix string, that completes the RTF string.

Here's the code snippet that calls the StreamIn() function. Note that in the call to StreamIn(), the first argument is a combination of SF_RTF and SFF_SELECTION. The first flag indicates that the text inserted into the rich edit control contains rich text formatting. The second flag indicates that the control should replace the selection with the inserted text. If you don't specify the SFF_SELECTION flag any previous text in the rich edit control will be cleared out.

The second argument to the function is the EDITSTREAM structure. This structure has three members. The first member is simply a value that is passed on to the callback function we defined. This member will contain the address of our string variable. The second argument is the error code returned by EditStreamCallBack() via the StreamIn() function. The last member is a pointer to EditStreamCallBack() - the callback function.

 CString rtfPrefix, rtfPostfix;

 rtfPrefix = "{\\rtf1\\ansi\\deff0\\deftab720{\\fonttbl{\\f0\\froman "
  "Times New Roman;}}\n{\\colortbl\\red0\\green0\\blue0;}\n"
  "\\deflang1033\\pard\\tx360\\tx720\\tx1080\\tx1440\\tx1800"
  "\\tx2160\\tx2520\\tx2880\\tx3240\\tx3600\\tx3960\\tx4320"
  "\\tx4680\\tx5040\\tx5400\\tx5760\\tx6120"
  "\\tx6480\\plain\\f3\\fs20 ";
 rtfPostfix = "\n\\par }";

 // The rtfString contains the word Bold in bold font.
 CString rtfString = rtfPrefix + "\\b Bold\\b0" + rtfPostfix;

 EDITSTREAM es = {(DWORD)&rtfString, 0, EditStreamCallBack};

 // richEd is the rich edit control

 richEd.StreamIn(SF_RTF | SFF_SELECTION, es);

 

 
2008-03-28 17:16
如果rtf中有图片的话,
可以参考CRichEditDoc::UpdateObjectCache()及CRichEditCntrItem的实现。
CRichEditView::OnTimer()会调用它们。见MSDN的WORDPAD例子。
  
  
  
  

转载于:https://www.cnblogs.com/carl2380/archive/2011/01/03/1924657.html

你可能感兴趣的文章
phpcms v9模版调用代码大全(全面而实用)
查看>>
缓存三大问题及解决方案
查看>>
win2003 session丢失
查看>>
windows下 ionic 打包app --以安卓版本为例
查看>>
XML文件操作类--创建XML文件
查看>>
(转)SqlServer2008 数据库同步:发布、订阅
查看>>
简介CentOS与 Ubuntu的不同
查看>>
桌面SVN文件操作
查看>>
SVN的两种存储方式FSFS和BDB比较【转】
查看>>
[bzoj3527][Zjoi2014]力_FFT
查看>>
评分卡模型建模的各步骤中的一些方法工具、开发要点、优化方向、调研总结...
查看>>
python selenium 滚动条处理、页面拖动
查看>>
轻松配置httpd的虚拟主机
查看>>
Perl处理数据(一):s替换、split和join
查看>>
CSS缎带效果
查看>>
JDK 动态代理分析
查看>>
LSTM(long short term memory)长短期记忆网络
查看>>
Linux NFS服务器的安装与配置
查看>>
BZOJ2242 [SDOI2011]计算器 【BSGS】
查看>>
第一次冲刺阶段(八)
查看>>