在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

相关文章

sqlserver、mysql、oracle、pgsql、sqlite五大关系数据库的对象名称和转义字符

《sqlserver、mysql、oracle、pgsql、sqlite五大关系数据库的对象名称和转义字符》:本文主要介绍sqlserver、mysql、oracle、pgsql、sqlite五大... 目录一、转义符1.1 oracle1.2 sqlserver1.3 PostgreSQL1.4 SQLi

JavaScript对象转数组的三种方法实现

《JavaScript对象转数组的三种方法实现》本文介绍了在JavaScript中将对象转换为数组的三种实用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录方法1:使用Object.keys()和Array.map()方法2:使用Object.entr

使用MapStruct实现Java对象映射的示例代码

《使用MapStruct实现Java对象映射的示例代码》本文主要介绍了使用MapStruct实现Java对象映射的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、什么是 MapStruct?二、实战演练:三步集成 MapStruct第一步:添加 Mave

Java中实现对象的拷贝案例讲解

《Java中实现对象的拷贝案例讲解》Java对象拷贝分为浅拷贝(复制值及引用地址)和深拷贝(递归复制所有引用对象),常用方法包括Object.clone()、序列化及JSON转换,需处理循环引用问题,... 目录对象的拷贝简介浅拷贝和深拷贝浅拷贝深拷贝深拷贝和循环引用总结对象的拷贝简介对象的拷贝,把一个

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定

javaSE类和对象进阶用法举例详解

《javaSE类和对象进阶用法举例详解》JavaSE的面向对象编程是软件开发中的基石,它通过类和对象的概念,实现了代码的模块化、可复用性和灵活性,:本文主要介绍javaSE类和对象进阶用法的相关资... 目录前言一、封装1.访问限定符2.包2.1包的概念2.2导入包2.3自定义包2.4常见的包二、stati

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

SpringMVC高效获取JavaBean对象指南

《SpringMVC高效获取JavaBean对象指南》SpringMVC通过数据绑定自动将请求参数映射到JavaBean,支持表单、URL及JSON数据,需用@ModelAttribute、@Requ... 目录Spring MVC 获取 JavaBean 对象指南核心机制:数据绑定实现步骤1. 定义 Ja

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使