如何在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);
- wpf 保存控件中的内容为图片格式
黄色的是wpf控件的名称! //保存到特定路径 FileStream fs = new FileStream(@"C:\image.png", FileMod ...
- 如何在WindowsPhone Bing Map控件中显示必应中国中文地图、谷歌中国中文地图。
原文:如何在WindowsPhone Bing Map控件中显示必应中国中文地图.谷歌中国中文地图. 最近正好有点业余时间,所以在做做各种地图.Bing Map控件本身就能显示必应地图,但是很遗憾微软 ...
- MFC 对话框Picture Control(图片控件)中静态和动态显示Bmp图片
版权声明:本文为博主原创文章,转载请注明CSDN博客源地址! 共同学习,一起进步~ https://blog.csdn.net/Eastmount/article/details/26404733 ...
- 在MonthCalendar控件中选中日期
Calendar.MONTH Calendar now=Calendar.getInstance();System.out.print(now.get(Calendar.MONTH));得到的月份少1 ...
- winform窗体(六)——DataGridView控件及通过此控件中实现增删改查
DataGridView:显示数据表,通过此控件中可以实现连接数据库,实现数据的增删改查 一.后台数据绑定: List<xxx> list = new List<xxx> ...
- Winform(DataGridView)控件及通过此控件中实现增删改查
DataGridView:显示数据表,通过此控件中可以实现连接数据库,实现数据的增删改查 一.后台数据绑定: List<xxx> list = new List<xxx> ...
- .net dataGridView当鼠标经过时当前行背景色变色;然后【给GridView增加单击行事件,并获取单击行的数据填充到页面中的控件中】
1.首先在前台dataGridview属性中增加onRowDataBound属性事件 2.然后在后台Observing_RowDataBound事件中增加代码 protected void Obser ...
- 服务器控件中使用<%#...>, JS和html控件中使用<%=...>
//在服务器控件的属性中,需要用<%#...>来绑定其他控件的ID, 并且要在页面初始方法中,执行Page.DataBind(); <asp:ImageButton ID=" ...
- 在DataGridView控件中加入ComboBox下拉列表框的实现
在DataGridView控件中加入ComboBox下拉列表框的实现 转自:http://www.cnblogs.com/luqingfei/archive/2007/03/28/691372.htm ...
随机推荐
- nginx-rtmp-module 指令详解
译序:截至 Jul 8th,2013 官方公布的最新 Nginx RTMP 模块 nginx-rtmp-module 指令详解. Core rtmp 语法:rtmp { ... } 上下文:根 描述: ...
- d3操作svg路径动画,及dom移动
图片跟随路径循环运动,dom也跟着路径运动(利用实时获取坐标位置的方法,改变transform) 1,准备路径 a,自己脑补路径 b,在ps上画好,然后在保存成png-24图片,背景透明,在网站htt ...
- 报错 DOMDocument not found
php -m 查看有没有dom扩展 没有安装扩展 yum install php-dom php 常用扩展有 yum install php-solr php-opcache php-seasLog ...
- 简单介绍下怎么在spring中使用RabbitMQ
这篇文章主要介绍了简单了解如何在spring中使用RabbitMQ,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 常见的消息中间件产品: (1)Ac ...
- Ruby 类和对象
Ruby 类和对象 Ruby 是一种完美的面向对象编程语言.面向对象编程语言的特性包括: 数据封装 数据抽象 多态性 继承 这些特性将在 面向对象的 Ruby 中进行讨论. 一个面向对象的程序,涉及到 ...
- Android下载Android源码
使用Git,命令是:git clone http://android.googlesource.com/platform/frameworks/base.git
- 一句话下载总结(用于后渗透上传payload)
利用ftp来下载payload文件 echo open 192.168.1.1 21> ftp.txt echo ftp>> ftp.txt echo bin >> ft ...
- NX二次开发-UFUN写入本地文本文档uc4524
1 NX9+VS2012 2 3 #include <uf.h> 4 #include <uf_cfi.h> 5 #include <uf_ui.h> 6 7 us ...
- inobounce.js : 禁止IOS H5的滑动回弹
IOS的移动端/H5/webapp 页面如果滚动到底部或者在页面顶部再往上拉,都会出现一个回弹的效果. 想取消这个效果可以引入一个简单的库就行,不用再写繁琐的样式. github地址 直接引入就行 & ...
- slot 的简单用法
注:默认在父组件调用子组件时<SlotChild></SlotChild>中文字不会显示.但是在子组件加入<slot></slot>后,<Slot ...