使用MFC开发ActiveX(ocx)控件

合集下载

【干货】孙鑫MFC建立ActiveX_Clock控件属性设置Interval崩溃问题

【干货】孙鑫MFC建立ActiveX_Clock控件属性设置Interval崩溃问题

【干货】孙鑫MFC建立ActiveX_Clock控件属性设置Interval崩溃问题学习MFC编程第18讲ActiveX控件,然后编写了测试程序,发现在控件属性变化时,程序会崩溃,截图为:孙鑫老师或则网上的前辈们总结为:Clock控件放到VB 的Form上时,该控件的窗体已经创建,也就是说,CClockCtrl 类的OnCreate()方法被执行了,这样就设置了定时器,而在VC 的对话框上插入Clock 控件时,却没有调用CClockCtrl类的OnCreate()方法,而在修改Interval 属性时,会调用CClockCtrl 类的OnIntervalChanged() 方法,在这个方法中,调用了KillTimer(1) ,因为定时器根本就没有创建,因此就出现了非法操作。

这可能是因为对话框并不是真正的容器组件。

解决办法,用一个变量保存定时器的返回值,然后在OnIntervalChanged() 方法中对返回值进行判断。

可是经过上述说法,我更改了程序,主要有头文件int m_nTimer;// 一个变量保存定时器的返回值m_Interval;//保存定时器时间间隔OnCreate函数int CCActiveXCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct){if (COleControl::OnCreate(lpCreateStruct) == -1)return -1;// TODO: 在此添加您专用的创建代码m_nTimer = SetTimer(1,m_Interval,NULL);return 0;}定时器处理void CCActiveXCtrl::OnIntervalChanged(void){AFX_MANAGE_STATE(AfxGetStaticModuleState());// TODO: 在此添加属性处理程序代码if (m_Interval<1000 | m_Interval>6000){m_Interval = 1000;}else{m_Interval = m_Interval/1000*1000;}if (m_nTimer != 0){KillTimer(m_nTimer);}SetTimer(m_nTimer,m_Interval,NULL);BoundPropertyChanged(0x2);}更改完以后,经过不断测试,发现上述问题没有改善。

使用C++MFC开发ActiveX控件

使用C++MFC开发ActiveX控件

return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj); } const DWORD dwSupportedBits = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA; const DWORD dwNotSupportedBits = ~ dwSupportedBits;
return ResultFromScode(E_FAIL); } // can't set bits we do support to zero dwEnabledOptions &= dwSupportedBits; // (we already know there are no extra bits in mask ) if ((dwOptionSetMask & dwEnabledOptions) !=
HRESULT STDMETHODCALLTYPE CHbisMfcFVOCXCtrl::XObjSafe::GetInterfaceSafetyOptions(
/* [in] */ REFIID riid, /* [out] */ DWORD __RPC_FAR *pdwSupportedOptions, /* [out] */ DWORD __RPC_FAR *pdwEnabledOptions) { METHOD_PROLOGUE(CHbisMfcFVOCXCtrl, ObjSafe) HRESULT retval = ResultFromScode(S_OK); // does interface exist? IUnknown FAR* punkInterface; retval = pThis->ExternalQueryInterface(&riid, (void * *)&punkInterface); if (retval != E_NOINTERFACE) { // interface exists punkInterface->Release(); // release it--just checking! }

VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程

VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程

VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程最近在弄ocx控件发布到网站上使用,就是用户在使用过程中,自动下载安装ocx控件。

(此文章也是总结了网上好多人写的文章,我只是汇总一下,加上部分自己的东西,在这里感谢所有在网上发表相关内容的朋友们。

)ActiveX控件用于Web的过程是将控件嵌入主页中,用户通过浏览器访问该主页时,将主页中的控件下载,并在用户机器上注册,以后就可在用户的浏览器上运行。

控件下载一次后就驻留在用户本地机器上,下次再访问相同的主页时,可不再下载该控件,而是直接运行用户本地的控件。

这里控件容器就是浏览器,用户不需要通过浏览器调用控件的属性或方法。

因此,开发面向Web 的ActiveX控件比开发桌面的控件还要简单些,所复杂的是如何将该控件很好地嵌入主页,使用户能正常浏览。

下面介绍这个问题。

一.创建MFC ActiveX项目1.打开VS2005新建MFC项目。

这里我们取名为“ActiveXDemo”。

2.输入项目名称为“ActiveXDemo”和项目位置。

点击“确定”按钮,打开向导对话框。

WoSign 免费提供的时间戳服务URL:/timestamp时间戳服务非常重要,添加时间戳后,即使您的代码签名证书已经过期,但由于您的代码是在证书有效期内签名的,则时间戳服务保证了此代码仍然可信,最终用户仍然可以放心下载,使得即使代码签名证书已经过期,您也无需重签和重新发布已经签名的代码。

3.选择“控件设置”选项卡,具体设置可参考上图。

其它选项卡为默认设置。

最后点击“完成”按钮保存设置。

二.添加控件方法VC2005会为我们自动创建好MFC ActiveX程序框架,我们只要给该ActiveX控件添加方法即可。

现在我们给控件添加一个“AddFun”方法,这个方法是将两个数相加并返回结果。

1.点击“视图”,打开“类视图”窗口。

2.展开“ActiveXDemoLib”项,选中“_DActiveXDemo”项。

ActiveX控件的MFC设计之旅

ActiveX控件的MFC设计之旅

ActiveX控件的MFC设计之旅ActiveX控件的MFC设计之旅在csdn中碰到了好几个问使用MFC设计ActiveX控件的朋友,联想到自己以前也干过这事,突然想写些文章,介绍介绍我所知道的一些设计技巧。

无奈,千头万绪,不知如何着手,最后,决定干脆设计一控件,将在控件中碰到的一些问题,一些方法写出来。

想一想,就设计一网格控件吧,取名为LiteGrid。

(忘了说了,咱这文稍微还是有点深度的,如果各位想看怎么添加属性,事件的,抱歉了,本文不提供)第一个要加的酷酷的功能是加上层次结构,看看VB中的好多控件,都有这种结构,以ListView控件为例,就有ListView1.ListItems(0).Checked=True这种以对象作为属性的结构是怎么实现的,网上有资料的,杨老师的<<关于IDispatch 接口的LPDispatch 属性的实现>>一文中就有介绍在msdn中的教程AutoClick中也有介绍,总之呢就是用IDispatch作为控件的属性就行了。

好了,闲话少说,那咱就开始了:1.添加一个派生自CCmdTarget的类CCell,用该类表示网格控件的一格,注意Automation 用Creatable by Type ID选项2.在ClassWizard中为CCell类添加上属性Text3.实现Text属性,如下void CCell::OnTextChanged(){// TODO: Add notification handler codeAfxMessageBox(m_text, MB_OK | MB_ICONINFORMATION,0);}4.为CLiteGrid添加上LPDISPATCH类型的只读带参数属性Cell(long nCol, long nRow),这个我想一般的都会加吧,就简单说一下了在ClassWizard的Automation中的AddProperty对话框中,在Implementation一项中,选择Get/Set methods,删除掉Set function一项中的所有内容,以设置为只读属性在Parameter list一项中,添加上两个参数long nCol和long nRow这里要声明两点,一个是在VB中Integer类型对应的应是short,Long类型对应的则是long,另一个是这里的带参数属性和前面的ListView的ListItems还是有些不同的,具体的咱以后再谈了5.接下来咱就实现这个Cell属性了LPDISPATCH CLiteGridCtrl::GetCell(short nCol, short nRow){// TODO: Add your property handler hereCCell* pcell = new CCell;return pcell->GetIDispatch(FALSE);}CCmdTarget的GetIDispatch函数原型为LPDISPATCH GetIDispatch( BOOL bAddRef );这里我们将bAddRef设为FALSE是因为,在构造CCell时,引用值已经设为1了,而GetCell 之后,我们就不需要pcell对象了。

用MFC制作ActiveX控件

用MFC制作ActiveX控件

够充 分发 挥熟悉 不 同开发 工具 的程 序员 的想象 力 与
创 造力 。 Aci X拄 件 经 注 册 后 , 以 进 行 诸 如 计 算 和 分 te v 可
2 利 用 M C制 作 A t e F c vX控 件 i
可 以开 发 制 作 A te 控件 的 工 具 非 常 多 , cvX i 如 V 、 C+ 、 J + 、 e h 、 B等 。 每 种 开 发 工 具 都 B V + v + Dl iP p 有 自己 的 特 点 , 对 控 件 的 执 行 效 率 要 求 不 是 很 高 当维普资讯 ht Nhomakorabeap://
赣薛设计s漉试
用 MF C制作 A t e ci X控件 v
姚 勇 陈金 勇
( 电子 第 5 4研 究所 石 家庄 00 0 ) 50 2
摘 要 舟招 了 A t e c v X技 术 的基 本 背景 和 A t e i c v X控 件 技 术 的接 口机制 , 用 V sa C+ i 应 i l u +开 发 工具 噩 其 M C的 F
在 V C++集 成 开 发 环 境 中 . 照 以 下 过 程 : i 按 Fl e — Ne — Poe t “ C A t e o t l zr ” 输 人 w rjc ̄ MF ci X C nr Wiad , v o
须 通 过 C na e, 件 和 C na e 都 必 须 支 持 一 些 ot nr 控 i oti r n 特 定 的 接 口协 议 = 控 件 具 备 如 下 几 项 主 要 的 性 能 机
制:
工 程 名 ( 如 :c) 其 所 在 的 目 录 , 定 后 将 生 成 例 at 及 确 应用 程 序 的 框 架 。最 简 单 的 控 件 只 包 含 三 个 类 : ① 从 C lC n o dl Oe ot l ue派 生 的 C c p ; 从 C l r Mo At p ② A Oe —

OCX控件编写

OCX控件编写

OCX控件新建->项目->MFCActiveX完成后编译器自动添加四个类。

型如:一.事件的添加方法:1.常用事件右键Ctrl类->添加->添加事件->常用事件(Click事件为例)在其他程序调用控件时在控件事件中就可以添加Click事件。

在点击新建的对话框中的控件时就会执行Click事件函数。

如下图2.自定义方法右键.lib类的第一个节点->添加方法添加后在其他程序调用控件时就可以给控件添加变量并调用方法。

二.添加属性以背景色为例,右键Lib类的第一个节点,添加属性,选择常用属性中的BackColor属性(当然也可以自定义属性):在Listcpp中手动添加属性页代码:在OnDraw手动添加:其中上图圈出部分为手动添加的代码,用于当控件被调用时打开改控件的颜色属性面板改变控件的颜色。

而COLORREF col=TranslateColor(GetBackColor);这行代码实现了获取下图颜色面板的颜色并返回给col;如何在新程序中添加控件并实时改变控件的GDI?方法:右键xxxlib文件的第一节点添加方法;完成后在xxxCtrl.cpp文件会添加该函数,例如:void Cocx004Ctrl::myfun1(DOUBLE parag){AFX_MANAGE_STATE(AfxGetStaticModuleState());if(parag>250){parag=0;}CDC*dc=GetDC();CRect rec;GetClientRect(&rec);CBrush bru;CPen pen;pen.CreatePen(PS_SOLID,4,RGB(100,parag,100));dc->SelectObject(&pen);bru.CreateSolidBrush(RGB(parag,100,100));dc->SelectObject(&bru);dc->MoveTo(rec.left,rec.top);dc->LineTo(rec.right,rec.bottom);dc->Ellipse(&rec);ReleaseDC(dc);//TODO:在此添加调度处理程序代码}以上代码实现了控件的简单绘图注:默认属性中除颜色属性外还有字体等属性,这儿未整理。

用MFC编写ActiveX控件

用MFC编写ActiveX控件

数据之中的。嵌入控件的包容器可以通过调用控件的IOleObject::GetMiscStatus方法来确定
用MFC编写ActiveX控件
ActiveX控件是一种可执行组件,设计它们的目的是将其嵌入窗口或Web页中,来实现一 些完备的功能。ActiveX这个名字是新的,但是,它的技术是成熟的。ActiveX控件形成了 Microsoft的ActiveX技术的唯一组成部分,它们是建立在Component Object Model(组件对象 模型,COM)和OLE的基础之上的。OLE用于代表Object Linking and Embedding(对象链接与 嵌入),但是,因为对象嵌入很早就是OLE能力中的很小的一部分,所以Microsoft 已经抛弃 了这个缩略语。目前,OLE已经有了新的含义第8章演示了在使用MFC的情况下,创建ActiveX 控件并不特别需要理解OLE和COM基础结构。很显然,在编写ActiveX控件时亦是如此。MFC可 以处理诸多的细节,你不必关心它太多复杂的基础信息,便可以编写控件。如果你决定不用 MFC来编写自己的ActiveX控件(这个想法的理由很充足),那么,你对项目的实现就更加有信 心了。根据你的方法和控件的复杂性,你可能需要仔细地了解ActiveX和Component Object Model的原理。本章继续前一章的内容。它从服务器而不是客户的角度来检查ActiveX控件, 介绍了Visual C++帮助想编写而不只是使用ActiveX控件的开发者的一些方法。Visual C++ 提供了三个不同的工具来帮助建立ActiveX控件项目:n 对ActiveX控件的MFC支持。n BaseCtl 框架。n Active Template Library。,不再具有版本号了。它已经从为特定目的而创建的一 门技术,转化到了一种作为其他技术(其中包括ActiveX)基础的一般结构。OLE定义了为创建 和连接包括叫做OLE自定义控件在内的多种程序组件定义了一个标准的蓝图。至少,它们过去 被称作OLE控件,Microsoft现在叫它们为ActiveX控件。,Microsoft从VBX术语中借用了三个 接口类型,它们定义了OLE控件和它的客户、包容器应用程序之间的通信。n Methods(方法): OLE控件展现给包容器应用程序的函数,允许客户调用该控件。n Properties(属性):控件和 包容器内部的公共数据,它可以用来向对方描述自己。在启动期间,一个控件可以读取该包 容器的属性,并且调整它的初始化过程,以便它与包容器的外观和特性相配。当控件处于活 动状态的时候,包容器可以读取该控件的属性,来了解它当前的状态,如果控件允许的话, 还可以重写属性,以改变控件的行为。n Events(事件):控件发送给包容器的通知,本章稍 后将详细介绍这个问题。一个事件通知是通过调用包容器中的一个函数来发生的,也就是众 所周知的“点燃”事件。就在人们已经注意到16位VBX的局限的时候,OLE(那些日子是叫OLE2) 已逐渐趋于成熟,从逻辑上来说,它已成为以OLE控件形式存在的VBX的接任者,现在叫做 ActiveX控件。用于创建ActiveX控件的Visual C++工具MFC提供了创建ActiveX控件的最容易 的方法。以前在Microsoft DeveloperNetwork上提供的Control Development kit已经作为一 套工具并入Visual C++中,该套工具包括已经重命名了的MFC Active ControlWizard:Test Container和ControlWizard。正如本章稍后用例子所演示的那样,ControlWizard将生成包含 有原始代码的源文件,该代码使用MFC来管理几乎所有的COM详细资料。生成的源代码可以处 理串行方式,显示控件的属性表,并为程序员和用户提供其他许多方便之处。你仅仅需要添 加必要的代码来画出该控件,对用户的输入做出反应和触发事件。使用MFC编写ActiveX控件 可以使OCX文件相当小,但是,这是一种误导,因为该控件永远依靠两个大文件的存在而存在。 这是MFC的缺点。如果控件的OCX文件在用户的计算机上不可用,该用户的浏览器程序必须下 载这个文件,才能显示它,因此,小的可执行文件尺寸对于用于Web页的控件来说就特别重要。 一个ActiveX控件不能与MFC静态链接起来,这就意味着,如果用户硬盘上不存在MFC库DLL文 件的正确版本,那么该文件必须随控件一起传输。更为糟糕的是,MFC需要C运行时间库,因 此Msrcrt.dll文件也可能需要下载。当用户首先遇到一个显示依靠MFC的ActiveX控件的Web 页的时候,将自动传输库文件。尽管对于用户通过快速网络连向的内部Web站点来说,这是很 合理的,但是对于Internet来说却是不现实的。既然MFC的大小大约为1兆字节,因此,使通 过快速快速调制解调器下载该文件,也要花上几分钟的时间。BaseCtrl框架也就是人们所熟 知的ActiveX Controls框架,是MFC的一个简便的替代方案。尽管BaseCtrl为开发者提供的支

VisualC++2010MFCActiveX控件小结

VisualC++2010MFCActiveX控件小结

VisualC++2010MFCActiveX控件小结前言:参照《VC++深入详解》--孙鑫第18章ActiveX控件,书中编译环境为VC6.0一、ActiveX控件ActiveX控件是基于组件对象模型COM--Components Object Modem的可重用软件组件,旨在用于普通的ActiveX控件容器和Internet上的网页,这里介绍用MFC创建ActiveX控件。

一个典型的ActiveX控件,具有方法、属性、事件这三种特性。

二、ActiveX控件的测试与注册1、使用ActiveX控件测试容器对控件进行测试对于VC6.0,安装Common\Tools目录下的TSTCON32.EXE即可使用。

而vs2010中的TSTCON( ActiveX Control Test Container )工具非自动安装,而是作为一个例程提供。

所以应找到该例程,并编译:如vs2010安装在默认路径则1, 进入:C:\Program Files\Microsoft Visual Studio 10.0\Samples\1033,可找到VC2010Samples.zip文件,2, 将其解决到同一个文件夹,解压后将出现一个C++子文件夹。

3, TstCon例程在:C:\Program Files\Microsoft Visual Studio 10.0\Samples\1033\C++\MFC\ole\TstCon,双击其中的.sln文件启动工程,直接编译,4, 编译后在Debug子文件夹中将出现一个TstCon.exe文件,将其复制到:C:\Program Files\Microsoft Visual Studio 10.0\Common7\Tools文件夹。

5, 在vs2010中的Tools菜单点击“External T ools...”,出现如下对话框,点击“Add”添加一项工具。

6, 新工具项的"Title"为:ActiveX Control Test Container,"Command" 为:C:\Program Files\Microsoft Visual Studio 10.0\Common7\Tools \TstCon.exe。

用MFC ActiveX Control Wizard生成的OCX控件

用MFC ActiveX Control Wizard生成的OCX控件
/* [in] */REFIID riid,
/* [out] */DWORD __RPC_FAR *pdwSupportedOptions,
/* [out] */DWORD __RPC_FAR *pdwEnabledOptions
);
STDMETHOD_(HRESULT, SetInterfaceSafetyOptions) (
#include"stdafx.h"
#include"OCXTest.h"
#include <objsafe.h>//新增内容
#ifdef _DEBUG
#definenew DEBUG_NEW
#endif
COCXTestApp NEAR theApp;
constGUID CDECL BASED_CODE _tlid =
需要头文件:#include "objsafe.h"
1、在XXXCtrl.h文件中DECLARE_DYNCREATE(CXXXCtrl)后添加:
C/C++ code
DECLARE_INTERFACE_MAP()
BEGIN_INTERFACE_PART(ObjSafe, IObjectSafety)
STDMETHOD_(HRESULT, GetInterfaceSafetyOptions) (
解决方案有2种:
1、OCX注册同时注册安全入口
2、实现安全接口IObjectSafety
具体实现:
第一种:OCX注册同时注册安全入口
修改XXX.cpp文件(OCXTest-XXX):将"新增内容"加入到原有对应文件中,编译即可
C/C++ code

运用MFC来实现ActiveX控件的方法

运用MFC来实现ActiveX控件的方法

运用MFC来实现ActiveX控件的方法
刘海文;朱辉
【期刊名称】《电脑编程技巧与维护》
【年(卷),期】1999(000)001
【摘要】1.何谓ActiveX 简言之,Active X是一种允许程序(即ActiveX控件)在网
络(如Internet)上与其它程序交互通信的体系结构。

这种体系结构均使用微软公司的组件对象模型(COM)和分布式组件对象模型(DCOM)标准。

其中,COM允许不同的应用程序实现本地相互交谈,而DCOM提供在网络上的(应用程序间)通信。

2.使用MFC创建ActiveX控件 VC++5.0提供了MFC ActiveX ControlWizard来生
成ActiveX控件的框架文件,并使用Class Wizard来定义控件的属性、方法和事件。

同时,
【总页数】3页(P28-29,35)
【作者】刘海文;朱辉
【作者单位】湖北武汉大学电信学院97研;湖北武汉大学新闻学院
【正文语种】中文
【中图分类】TP311
【相关文献】
1.用MFC实现基于OpenGL的三维图形ActiveX控件 [J], 叶钦媚;黎绍发;梁宇涛
2.用MFC制作ActiveX控件 [J], 姚勇;陈金勇
3.用MFC开发ActiveX控件以激活Web页面 [J], 赵国庆;刘家彬
4.使用MFC开发具有图像处理功能的ActiveX控件 [J], 王安静;金赞;张新鹏
5.运用MFC来实现ActiveX控件的方法 [J], 吴世才;刘海文
因版权原因,仅展示原文概要,查看原文内容请购买。

ActiveX控件(MFC篇)

ActiveX控件(MFC篇)
I
目录
1.7.4 实现属性存取 ...........................................................................................21 1.7.5 绘制控件 ...................................................................................................22 1.7.6 实现LDown事件 .......................................................................................23 1.7.7 保存、恢复属性值 ...................................................................................24 1.7.8 属性页 .......................................................................................................26 1.8 类型库 ............................................................................................................31 1.8.1 VC++6.0 的一个BUG...............................................................................32 1.9 控件注册与注销 ............................................................................................32 1.9.1 命令 ...........................................................................................................32 1.9.2 注册表 .......................................................................................................33 1.10 ProgID...........................................................................................................37 1.10.1 处理重复 .................................................................................................37 1.11 控件位图 ......................................................................................................38 1.12 AfxOleRegisterControlClass ........................................................................39

使用MFC开发ActiveX控件全过程

使用MFC开发ActiveX控件全过程

Visual C++是开发ActiveX控件的强大工具,它的特点是开发周期短、便于使用,因此它已经成为开发ActiveX控件的主要工具之一。

Visual C++集成开发环境,使用了微软自己的类库MFC,MFC对开发ActiveX控件提供了全面的支持,本文讲述的过程均在Visual C++ 6.0(以下简称VC)中实现。

1、? 创建工程:对于使用过VC的人,可以很容易地创建一个开发ActiveX控件的工程,没有使用过VC的人,按照下面的操作步骤,也可以很快创建一个同样的工程出来。

第一步:“File”—>“New”—>“(Projects)MFC ActiveX ControlWizard”,在“Project Name”中输入合适的工程名(以test为例),在“Location”中选择工程文件存放路径,然后,“OK”进入下一步;第二步:选择你想在这个工程中生成的ActiveX控件的个数(至少一个),其余选项决定是否生成一些辅助文件,通常按照默认设置即可,“Next”进入下一步;第三步:编辑你的工程中各个类和文件的名称,配置一些辅助选项,可以全部选择默认设置,“Finish”进入下一步;第四步:展示向导为你的工程生成的各种配置信息,“Cancel”重新设置不满意的选项,“OK”结束工程的创建。

2、? 绘制控件:MFC将对ActiveX控件的支持封装在COleControl类中,所有ActiveX控件均从这个类派生。

绘制控件的全部操作则集中在一个虚函数中—OnDraw(),其默认实现如下:void CTestCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid) {// TODO: Replace the following code with your own drawing code.pdc->FillRect(rcBounds,CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));pdc->Ellipse(rcBounds);}可以看到,OnDraw()函数的默认实现是在矩形rcBounds中绘制一个椭圆,通过改写OnDraw()函数中的内容,就可以绘制自己想要的控件了。

MFCActiveX控件的创建与使用(VS2010)

MFCActiveX控件的创建与使用(VS2010)

MFCActiveX控件的创建与使⽤(VS2010)1.ActiveX的基本概念ActiveX控件可以看作是⼀个极⼩的服务器应⽤程序,它不能独⽴运⾏,必须嵌⼊到某个容器程序中,与该容器⼀起运⾏。

这个容器包括WEB⽹页,应⽤程序窗体等。

ActiveX控件的后缀名是OCX或者DLL。

⼀般是以OCX和动态库共存的形式打包成cab或者exe的⽂件放在服务器上,客户端下载后运⾏安装cab或exe解压成OCX和动态库共存的⽂件,然后注册ocx⽂件。

ActiveX控件是基于com标准,使得软件部件在⽹络环境中进⾏交互的技术集。

它与具体的编程语⾔⽆关。

作为针对Internet应⽤开发的技术,ActiveX被⼴泛应⽤于WEB服务器以及客户端的各个⽅⾯。

同时,ActiveX技术也被⽤于⽅便地创建普通的桌⾯应⽤程序,此外ActiveX⼀般具有界⾯。

2.三个概念:ActiveX、OLE和COM从时间的⾓度讲,OLE是最早出现的,然后是COM和 ActiveX;从体系结构⾓度讲,OLE和ActiveX是建⽴在COM之上的,所以COM是基础;单从名称⾓度讲,OLE、ActiveX是两个商标名称,⽽COM则是⼀个纯技术名词,这也是⼤家更多的听说ActiveX和OLE的原因。

COM是应OLE的需求⽽诞⽣的,所以虽然COM是OLE的基础,但OLE的产⽣却在COM之前。

COM的基本出发点是,让某个软件通过⼀个通⽤的机构为另⼀个软件提供服务。

ActiveX最核⼼的技术还是COM。

ActiveX和OLE的最⼤不同在于,OLE针对的是桌⾯上应⽤软件和⽂件之间的集成,⽽ ActiveX则以提供进⼀步的⽹络应⽤与⽤户交互为主。

COM对象可以⽤C++、Java和VB等任意⼀种语⾔编写,并可以⽤DLL或作为不同过程⼯作的执⾏⽂件的形式来实现。

使⽤COM对象的浏览器,⽆需关⼼对象是⽤什么语⾔写的,也⽆须关⼼它是以DLL还是以另外的过程来执⾏的。

从浏览器端看,⽆任何区别。

mfc调用active控件

mfc调用active控件

mfc调用active控件
MFC(Microsoft Foundation Class)是一种用于开发Windows 应用程序的C++类库,而ActiveX控件是一种可重用的软件组件,通常用于在Web浏览器或其他容器应用程序中显示交互式内容。

在MFC中调用ActiveX控件可以通过以下步骤实现:
1. 首先,你需要在MFC应用程序中创建一个对话框或视图来容纳ActiveX控件。

你可以在资源编辑器中添加一个ActiveX控件,或者在代码中动态创建和添加ActiveX控件。

2. 然后,你需要在MFC应用程序中使用类向导来生成ActiveX 控件的包装类。

在Visual Studio中,你可以使用“添加类”对话框来生成包装类。

3. 生成包装类后,你可以在对话框或视图类的代码中实例化ActiveX控件的包装类对象,并调用其方法或设置其属性。

例如,你可以使用Create函数创建ActiveX控件的实例,并使用其提供的方法来实现所需的功能。

4. 最后,在MFC应用程序的消息映射函数中处理ActiveX控件
的事件,例如按钮点击事件或文本框内容改变事件。

你可以通过包装类提供的事件映射功能来实现对ActiveX控件事件的处理。

总的来说,MFC调用ActiveX控件涉及到创建包装类、实例化控件对象、调用控件方法和处理控件事件等步骤。

通过这些步骤,你可以在MFC应用程序中有效地使用ActiveX控件实现丰富的交互式功能。

使用MFC开发具有图像处理功能的ActiveX控件

使用MFC开发具有图像处理功能的ActiveX控件
彩 色 图 变 为 灰 度 图 ,进 行 简 单 的 平 滑 、灰 度 线 性 变 化 等 。 由 于 图像 处 理 的 数 据 较 大 和 所 要 求 的速 度较 快 ,一 般 条 件
初始化的功 能:一般情况对 cm gPoes p I ae rcsA p类不需要做 大的
改动 。
后 臼手 节 数 L
Wn 2 BtC u t / 图 侍 数 据 数 g 4 i o n; / s / B 】 教 据 / MPj 件 = / 指针 DI 据 柄 B数
二 、A t e 控 件 ci X v
A te c vX控 件 是 一 组 封 装 在 C M( o pnn b c Moe, i O C m o et j t dl O e
u s e o g m Ig i Cou t n i d ln u n 8B t gn s n;
L B T p M P i D t; P Y E m/ B Fl aa e L B T p 1 BtMo e P Y E mJ 8mg i s v;
LPBYTE m l p241 gBisM o m t ve
些功能 中的大部 分代码 ,这样 开发人 员就可 以把精力集 中在 控
件 应 具 有 的 特 定 的 功 能 上 ,包 括 控 件 的 属 性 、方 法 和事 件 。
t : D PoE cag ( 中增 加 一 行 代 码 。 r : o rp xh ne ) l
PX S ot p X T{ h r{ P Ap e n e ) m_ Ap e n e ) p aa c r , s p a a c ,1 r
1 填 加 cm gPoes t 类 成 员 变 量 . I ae rcsc r l 使 用 Cas zr l Wi d为 Cm gPoes t 类 填 加 如 下 成 员 变 s a l ae rcsCr l 量 ,且 都 为 Pia 。 r t ve
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

作者: 中国电波传播研究所青岛分所郎锐时间: 2004-03-09出处: yesky一、前言二、建立工程框架三、属性、方法以及事件的添加四、实现属性表五、在包容程序中使用ActiveX控件六、小结前言ActiveX控件是一种实现了一系列特定接口而使其在使用和外观上更象一个控件的COM组件。

ActiveX控件这种技术涉及到了几乎所有的COM和OLE的技术精华,如可链接对象、统一数据传输、OLE文档、属性页、永久存储以及OLE 自动化等。

ActiveX控件作为基本的界面单元,必须拥有自己的属性和方法以适合不同特点的程序和向包容器程序提供功能服务,其属性和方法均由自动化服务的IDispatch接口来支持。

除了属性和方法外,ActiveX控件还具有区别于自动化服务的一种特性--事件。

事件指的是从控件发送给其包容程序的一种通知。

与窗口控件通过发送消息通知其拥有者类似,ActiveX控件是通过触发事件来通知其包容器的。

事件的触发通常是通过控件包容器提供的 IDispatch接口来调用自动化对象的方法来实现的。

在设计ActiveX控件时就应当考虑控件可能会发生哪些事件以及包容器程序将会对其中的哪些事件感兴趣并将这些事件包含进来。

与自动化服务不同,ActiveX控件的方法、属性和事件均有自定义(custom)和库存(stock)两种不同的类型。

自定义的方法和属性也就是是普通的自动化方法和属性,自定义事件则是自己选取名字和Dispatch ID的事件。

而所谓的库存方法、属性和事件则是使用了ActiveX控件规定了名字和Dispatch ID的"标准"方法、属性和事件。

ActiveX控件可以使COM组件从外观和使用上能与普通的窗口控件一样,而且还提供了类似于设置Windows标准控件属性的属性页,使其能够在包容器程序的设计阶段对ActiveX控件的属性进行可视化设置。

ActiveX控件提供的这些功能使得对其的使用将是非常方便的。

本文下面即以MFC为工具对ActiveX控件的开发进行介绍。

建立工程框架通过"MFC ActiveX ControlWizard"向导可以非常容易的建立一个MFC ActiveX控件工程框架。

按照默认的选项将建立如图1所示的工程结构:图1 使用缺省选项建立的ActiveX控件工程结构其中,_DSample68和_DSample68Events这两个接口将为客户程序提供本控件的属性、方法以及可能响应的事件。

全局函数 DllRegisterServer()和DllUnregisterServer()分别用于控件在注册表的注册和注销,一般不需要对其进行改动。

应用程序类从COleControlModule继承。

而COleControlModule有是从CWinApp派生,提供了初始化控件模块的功能。

CSample68PropPage的基类是COlePropertyPage,CDialog类的派生类,主要负责对属性页中对图形界面下用户控件属性的显示。

控件类CSample68Ctrl类是这几个类中比较重要的一个类,大部分实质性工作都在该类完成,其基类为COleControl,从CWnd 和CCmdTarget 继承,因此能够为控件对象提供与MFC窗口对象相同的功能同时也提供了一系列事件触发函数和一个分发映射表,使ActiveX控件能够同包容器程序有效地进行交互。

该类的派生类将可以在满足特定的条件时向控件的包容器发送消息或是触发事件,以通知包容器程序在控件内有一些重要的事件发生。

分发映射表是其中很重要的一个部分,负责向包容器程序暴露控件提供的方法和属性。

图2展示了COleControl类在控件与包容器通信中所起的作用。

可以看出,ActiveX 控件与其包容器之间的所有通信过程都是由COleControl来完成的:图2 COleControl在ActiveX控件与包容器通信中的作用控件类对基类COleControl的OnDraw()函数进行了重载,向导生成了如下缺省代码,其作用是在控件的客户区绘制一个椭圆。

在编程过程中通常要对其进行替换:void CSample68Ctrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid){// TODO: Replace the following code with your own drawing code. pdc->FillRect(rcBounds,CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));pdc->Ellipse(rcBounds);}图3 插入ActiveX控件图4 插入的待测试控件对向导生成的代码进行编译后,将产生扩展名为ocx的ActiveX控件。

ActiveX控件并不能独立运行,只能在包容器程序中才能够运行。

通常,为了调试方便而多使用VC++附带的ActiveX Control Test Container工具以在测试阶段对ActiveX控件进行调试。

在测试工具的客户区点击鼠标右键,并选中弹出菜单的"Insert New Control…"菜单项,将弹出图3所示的对话框,左侧的列表框中列出了当前系统中所有注册的ActiveX控件,选中要测试的控件并将其插入到测试程序即可通过"Control"菜单下的各菜单项对控件的方法、属性以及事件等进行测试。

在位于下方的分割视图中将跟踪显示出调试记录(参见图4)。

属性、方法以及事件的添加图5 属性的添加图6 方法的添加对ActiveX控件属性、方法和事件的添加均有库存和自定义两种。

其中对属性和方法的添加在MFC ClassWizard对话框的Automation页中通过按钮"Add Property…"和"Add Method…"弹出如图5和图6所示的添加属性和添加方法的对话框来完成。

对于库存属性和方法,可以直接从External name组合框的下拉列表中选取,Implementation项将自动设置为Stock。

对于自定义属性和方法的添加与在自动化对象中为接口添加属性和方法的过程一样,ClassWizard将在.odl文件和控件类生成相应的代码,下面给出的是在控件类中实现的部分分发映射代码:……// Dispatch maps//{{AFX_DISPATCH(CSample68Ctrl)CString m_message;afx_msg void OnMessageChanged();afx_msg short GetXPos();afx_msg void SetXPos(short nNewValue);afx_msg short GetYPos();afx_msg void SetYPos(short nNewValue);afx_msg short MessageLen();//}}AFX_DISPATCHDECLARE_DISPATCH_MAP()// Dispatch and event IDspublic:enum {//{{AFX_DISP_ID(CSample68Ctrl)dispidMessage = 1L,dispidXPos = 2L,dispidYPos = 3L,dispidMessageLen = 4L,//}}AFX_DISP_ID};……BEGIN_DISPATCH_MAP(CSample68Ctrl, COleControl)//{{AFX_DISPATCH_MAP(CSample68Ctrl)DISP_PROPERTY_NOTIFY(CSample68Ctrl, "Message", m_message, OnMessageChanged, VT_BSTR)DISP_PROPERTY_EX(CSample68Ctrl, "XPos", GetXPos, SetXPos, VT_I2) DISP_PROPERTY_EX(CSample68Ctrl, "YPos", GetYPos, SetYPos, VT_I2)DISP_FUNCTION(CSample68Ctrl, "MessageLen", MessageLen, VT_I2, VTS_NONE) DISP_STOCKPROP_BACKCOLOR()DISP_STOCKPROP_CAPTION()DISP_STOCKPROP_FORECOLOR()//}}AFX_DISPATCH_MAPEND_DISPATCH_MAP()……在这里共添加了一个自定义方法MessageLen()和三种库存属性BackColor、Caption和ForeColor(分别表示控件的背景色、标题和前台色)、两个以Get/Set 方式获取的自定义属性XPos、YPos和一个以成员变量方式实现的自定义属性Message。

这几个自定义属性分别表示要显示字符串的x、y坐标和要显示的内容。

对于采取Get/Set方式获取的属性,应当在控件类中为其添加相应的成员函数,并修改其Get、Set成员函数的实现过程:short m_nYPos;short m_nXPos;……short CSample68Ctrl::GetXPos(){return m_nXPos;}void CSample68Ctrl::SetXPos(short nNewValue){m_nXPos = nNewValue;SetModifiedFlag();}short CSample68Ctrl::GetYPos(){return m_nYPos;}void CSample68Ctrl::SetYPos(short nNewValue){m_nYPos = nNewValue;SetModifiedFlag();}对于以成员变量方式创建的属性Message,向导还为其生成了一个消息响应函数:void CSample68Ctrl::OnMessageChanged(){SetModifiedFlag();}只要该属性的值被更改,OnMessageChanged()函数即会被调用。

为了使上述属性设置如背景色、前景色等能够与控件实际联系起来,需要替换控件类OnDraw()函数中由向导生成的那部分代码。

例如,下面这段代码即以前面添加的属性设置作为参数值,在控件中显示一串字符:// 用背景色设置画刷CBrush Brush(TranslateColor(GetBackColor()));// 用前台色设置字体颜色pdc->SetTextColor(TranslateColor(GetForeColor()));// 绘制背景pdc->FillRect(rcBounds, &Brush);// 设置字体背景透明pdc->SetBkMode(TRANSPARENT);// 显示字符pdc->TextOut(m_nXPos, m_nYPos, m_message);为了使属性设置更改后,其效果能够立即在控件上显示出来,应当在与属性设置相关的函数实现中调用InvalidateControl()以更新控件的显示。

相关文档
最新文档