在RichEdit控件中插入OLE对象(ActiveX控件)

2024-04-24 20:18

本文主要是介绍在RichEdit控件中插入OLE对象(ActiveX控件),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        有时候,我们需要在一个容器中插入各种不同的对象,比如,QQ聊天对话框里可以插入各种静态和动态的图片,甚至还可以插入flash文件,这些都是通过OLE技术来实现的。OLE技术是基于COM的,而COM又是非常复杂的东西,想要学习COM得花很多的时间,《COM技术内幕》,《COM原理和应用》,《INSIDE OLE 2》都是非常好的学习COM和OLE的书,但要把这些书啃完,弄懂,几个月甚至半年都过去了。学习COM是一个郁闷、漫长的过程,虽然进步很慢,但坚持下去会很有意思。如果我们仅仅是使用别人的组件,并将别人的组件插入到自己的容器中,也不是很复杂,下面就是一个例子。

  我们以MSDN的ATL Tutorial中创建的组件做为我们要插入的对象(该组件的创建请看MSDN)。
1、创建一个COM客户端基于对话框的工程,命名为Client,按默认选项设置工程。
2、在主对话框中加入一个RichEdit控件,用ClassWizard为添加一个表示该控件的变量,为m_re,记住类型设为control。为主对话框加入一个按钮,ID设为IDC_INSERTPOLYGON,Caption设置为InsertPolygon。
3、在CClientApp::InitInstance()函数中,在创建对话框的代码前加入如下代码:

if (AfxInitRichEdit() == FALSE){return FALSE;}
如果不加入上面的代码,应用程序将无法运行。

4、在Client.cpp中添加头文件

#include "..\\Polygon.h"  //DLL模块头文件#include "..\\Polygon_i.c" //接口定义#include "Richole.h"
BOOL CClientDlg::InsertPolygon(IRichEditOle* lpRichEditOle){IStorage*  lpStorage  = NULL;//存储接口IOleObject*  lpOleObject  = NULL;//OLE对象LPLOCKBYTES  lpLockBytes  = NULL;//LOCKBYTEIOleClientSite* lpOleClientSite = NULL; IPolyCtl*       lpPolyCtl = NULL;    //控件CLSID   clsid;REOBJECT  reobject;HRESULT   hr;if(lpRichEditOle == NULL)return FALSE;//创建PolyCtl对象并获取接口hr = ::CoCreateInstance(CLSID_PolyCtl,NULL,CLSCTX_INPROC,IID_IPolyCtl,(LPVOID*)&lpPolyCtl);if( lpPolyCtl == NULL ){return FALSE;}// USES_CONVERSION;BOOL bRet = TRUE;try{hr = lpPolyCtl->QueryInterface(&lpOleObject);//获得数据对象接口if( hr != S_OK ) AfxThrowOleException(hr);hr = lpOleObject->GetUserClassID(&clsid);if ( hr != S_OK)AfxThrowOleException(hr);hr = ::CreateILockBytesOnHGlobal(NULL, TRUE, &lpLockBytes);//创建LOCKBYTE对象if (hr != S_OK)AfxThrowOleException(hr);ASSERT(lpLockBytes != NULL);hr = ::StgCreateDocfileOnILockBytes(lpLockBytes,//创建复合文档STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE, 0, &lpStorage);if (hr != S_OK){VERIFY(lpLockBytes->Release() == 0);lpLockBytes = NULL;AfxThrowOleException(hr);}lpRichEditOle->GetClientSite(&lpOleClientSite);ZeroMemory(&reobject, sizeof(REOBJECT));//初始化一个对象  reobject.cbStruct = sizeof(REOBJECT);reobject.clsid  = clsid;reobject.cp   = REO_CP_SELECTION;reobject.dvaspect = DVASPECT_CONTENT;reobject.dwFlags = REO_BELOWBASELINE;reobject.poleobj = lpOleObject;reobject.polesite = lpOleClientSite;reobject.pstg  = lpStorage;hr = lpRichEditOle->InsertObject( &reobject );if (hr != S_OK)AfxThrowOleException(hr);OleSetContainedObject(lpOleObject,TRUE);}catch( COleException* e ){TRACE(_T("OleException code:%d"),e->m_sc);e->Delete();bRet = FALSE;}// release the interfaceif( lpPolyCtl     != NULL )  lpPolyCtl->Release();if( lpOleObject  != NULL )  lpOleObject->Release();if( lpOleClientSite != NULL ) lpOleClientSite->Release();if( lpStorage  != NULL ) lpStorage->Release();return bRet;}6、为InsertPolygon按钮添加响应函数,定义如下:void CClientDlg::OnInsertpolygon() {IRichEditOle* lpRichEditOle = NULL;lpRichEditOle = m_re.GetIRichEditOle();if (lpRichEditOle != NULL){InsertPolygon(lpRichEditOle);lpRichEditOle->Release();}}

5、为对话框类加入私有成员函数BOOL InsertPolygon(IRichEditOle* lpRichEditOle);将该函数定义如下:


这篇关于在RichEdit控件中插入OLE对象(ActiveX控件)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/932741

相关文章

使用Python在Excel中插入、修改、提取和删除超链接

《使用Python在Excel中插入、修改、提取和删除超链接》超链接是Excel中的常用功能,通过点击超链接可以快速跳转到外部网站、本地文件或工作表中的特定单元格,有效提升数据访问的效率和用户体验,这... 目录引言使用工具python在Excel中插入超链接Python修改Excel中的超链接Python

JSON字符串转成java的Map对象详细步骤

《JSON字符串转成java的Map对象详细步骤》:本文主要介绍如何将JSON字符串转换为Java对象的步骤,包括定义Element类、使用Jackson库解析JSON和添加依赖,文中通过代码介绍... 目录步骤 1: 定义 Element 类步骤 2: 使用 Jackson 库解析 jsON步骤 3: 添

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

C#实现WinForm控件焦点的获取与失去

《C#实现WinForm控件焦点的获取与失去》在一个数据输入表单中,当用户从一个文本框切换到另一个文本框时,需要准确地判断焦点的转移,以便进行数据验证、提示信息显示等操作,本文将探讨Winform控件... 目录前言获取焦点改变TabIndex属性值调用Focus方法失去焦点总结最后前言在一个数据输入表单

Java如何通过反射机制获取数据类对象的属性及方法

《Java如何通过反射机制获取数据类对象的属性及方法》文章介绍了如何使用Java反射机制获取类对象的所有属性及其对应的get、set方法,以及如何通过反射机制实现类对象的实例化,感兴趣的朋友跟随小编一... 目录一、通过反射机制获取类对象的所有属性以及相应的get、set方法1.遍历类对象的所有属性2.获取

java中VO PO DTO POJO BO DO对象的应用场景及使用方式

《java中VOPODTOPOJOBODO对象的应用场景及使用方式》文章介绍了Java开发中常用的几种对象类型及其应用场景,包括VO、PO、DTO、POJO、BO和DO等,并通过示例说明了它... 目录Java中VO PO DTO POJO BO DO对象的应用VO (View Object) - 视图对象

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE

Java将时间戳转换为Date对象的方法小结

《Java将时间戳转换为Date对象的方法小结》在Java编程中,处理日期和时间是一个常见需求,特别是在处理网络通信或者数据库操作时,本文主要为大家整理了Java中将时间戳转换为Date对象的方法... 目录1. 理解时间戳2. Date 类的构造函数3. 转换示例4. 处理可能的异常5. 考虑时区问题6.

顺序表之创建,判满,插入,输出

文章目录 🍊自我介绍🍊创建一个空的顺序表,为结构体在堆区分配空间🍊插入数据🍊输出数据🍊判断顺序表是否满了,满了返回值1,否则返回0🍊main函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”

Java第二阶段---09类和对象---第三节 构造方法

第三节 构造方法 1.概念 构造方法是一种特殊的方法,主要用于创建对象以及完成对象的属性初始化操作。构造方法不能被对象调用。 2.语法 //[]中内容可有可无 访问修饰符 类名([参数列表]){ } 3.示例 public class Car {     //车特征(属性)     public String name;//车名   可以直接拿来用 说明它有初始值     pu