在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实现对阿里云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. 使

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

Python中bisect_left 函数实现高效插入与有序列表管理

《Python中bisect_left函数实现高效插入与有序列表管理》Python的bisect_left函数通过二分查找高效定位有序列表插入位置,与bisect_right的区别在于处理重复元素时... 目录一、bisect_left 基本介绍1.1 函数定义1.2 核心功能二、bisect_left 与

Spring中管理bean对象的方式(专业级说明)

《Spring中管理bean对象的方式(专业级说明)》在Spring框架中,Bean的管理是核心功能,主要通过IoC(控制反转)容器实现,下面给大家介绍Spring中管理bean对象的方式,感兴趣的朋... 目录1.Bean的声明与注册1.1 基于XML配置1.2 基于注解(主流方式)1.3 基于Java

C++/类与对象/默认成员函数@构造函数的用法

《C++/类与对象/默认成员函数@构造函数的用法》:本文主要介绍C++/类与对象/默认成员函数@构造函数的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录名词概念默认成员函数构造函数概念函数特征显示构造函数隐式构造函数总结名词概念默认构造函数:不用传参就可以

C++类和对象之默认成员函数的使用解读

《C++类和对象之默认成员函数的使用解读》:本文主要介绍C++类和对象之默认成员函数的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、默认成员函数有哪些二、各默认成员函数详解默认构造函数析构函数拷贝构造函数拷贝赋值运算符三、默认成员函数的注意事项总结一

解决mysql插入数据锁等待超时报错:Lock wait timeout exceeded;try restarting transaction

《解决mysql插入数据锁等待超时报错:Lockwaittimeoutexceeded;tryrestartingtransaction》:本文主要介绍解决mysql插入数据锁等待超时报... 目录报错信息解决办法1、数据库中执行如下sql2、再到 INNODB_TRX 事务表中查看总结报错信息Lock