RichEdit对ole 对象的相关支持总结

                                        

                                               RichEditole 的相关支持总结

1.       RichEdit要嵌入ole  objects必须要继承 IRichEditOleCallback 接口,这个接口让richEdit能够增加RichEditOle的嵌入支持。

 

  

首先在RichEditOnCreate中调用SetOLECallback函数,这样就设置了IRichEditOleCallback的接口实现者。

 

OnCreate中,还要记得注册 ole剪贴板格式,这个格式是我们自己定的,在处理复制和粘贴的时候,需要用到它。

 

       

 

这个接口的几个必须实现的接口函数:

(1) GetNewStorage

它为一个来自剪贴板粘贴的对象提供新的存储。

2QueryInsertObject

     它处理来自ole object的插入请求,如果同意插入,就返回S_OK,否则返回E_NOTIMPL

     在这个里面可以判断是否是自己需要的类型,如果不是,就可以拒绝插入。

 

 

3 DeleteObject

它处理删除ole  obj的请求,直接返回E_NOTIMPL即可。

 

 

 

4GetClipboardData

   在这个地方处理复制或拖拽

   创建一个 DataSource对象,将自己处理过的数据,存入ole 剪贴板,最好获得DataSource对象的 IDataObject接口,将它赋值给lpchrg参数。

 

5QueryAcceptData

      当有粘贴操作或者拖放操作的时候,询问是否应该接受这些操作。

      可以在这里处理粘贴和拖放,然后解析来自ole 剪贴板的数据,然后把他输出到richedit中。这些ole 剪贴板中的数据,是在GetClipboardData中写入的。

 

 

 

 

 

6GetContextMenu

      这个函数处理右键菜单。

 

 

 

 

 

1.   RichEdit中,怎么实现对复制的内容中,什么是普通文本,什么是ole对象的识别。

(1)  首先,创建一个Manager类,类里面有个vector,用来管理richedit中的 ole对象对应的结构体列表。

另外一个结构体OleStruct用来存储ole对象的相关的信息。

这些信息包括:ole对象在richedit中的位置nPos,这个很重要,因为在处理复制的时候,需要通过这个来判断,复制的是否是文字还是ole对象。

              Ole对象的Index,如果有的话

              Ole对象的 path,也就是插入到richedit的 图像的路径,这个是最重要的。

其他的一些信息。

 

Manager提供一个方法,这个方法传入一个位置nPos,如果这个位置是一个ole obj ,那么返回这个ole object对应的vector中的OleStruct对象,否则返回NULL.

在处理复制的时候,就调用这个方法,来将所有的ole obj的数据,替换为编码过的OleStruct对象的数据。然后在处理粘贴的时候,又解码,将对应的Ole object对象插入到

RichEdit中。

 

(2)  然后,响应richeditEN_CHANGE消息

注意在richEditOnCreate函数中启用EN_CHANGE消息,否则收不到这个消息:

           //设置让 EN_CHANGE  生效

  SetEventMask(GetEventMask() | ENM_CHANGE);

 

EN_CHANGE消息响应函数中:

首先获得整个richedit的内容,然后遍历内容,将所有的Ole objects 的信息都收集到 ole对象管理器中,这样就可以随时查询ole objects的相关信息了。

 

 

(3)  在处理复制和拖拽的时候,首先获得复制的内容,通过查询ole 对象管理器,可以知道对应的内容是否是ole obj对象。

将文本和ole 对象的数据分别用XML文档编码,编码为下面的两种类型:

 typedef   struct   _STR_OBJ_STRUCT

{

           string   strText; //文本内容

}STR_OBJ_STRUCT;

 

typedef   struct   _OLE_OBJ_STRUCT

{

          string   strOleFilePath; //路径

          int      iIndex;         //index

}OLE_OBJ_STRUCT;

 

然后再用XML插入这两种类型的结点,最终获得XML 的字符串。

通过ole剪贴板,将这个编码过的字符串保存起来。

 

4)在处理粘贴或拖放的时候:

        获得编码过的XML文本,然后解析XML文本,获得

        STR_OBJ_STRUCT结构体和OLE_OBJ_STRUCT结构体的对象。

 

        依次遍历这些对象,将他们插入到richedit中。这样就让richedit增加了对ole对象的复制粘贴和拖拽的支持。

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值