ACTIVEX网页控件开发(详细)
使用MFC开发ActiveX(ocx)控件
作者: 中国电波传播研究所青岛分所郎锐时间: 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控件提供的这些功能使得对其的使用将是非常方便的。
activeX 网页应用开发指南
Reader 控件函数库目录目录 (2)1.1 控件注册 (5)1.2 读卡器功能开发流程 (6)1.2.1 设备驱动的打开与关闭 (6)1.2.2 获取天线感应区的标签 (6)1.2.3标签数据区的读写 (8)2.编程接口 (11)2.1 读卡器通用接口 (11)2.1.1 RDR_OpenPort (11)2.1.2 RDR_OpenUSB (12)2.1.3 RDR_OpenNet (13)2.1.4 RDR_Close (14)2.1.5 COMPort_Enum (15)2.1.6 COMPort_GetEnumItem (16)2.1.7 RDR_InitInventory (17)2.1.8 RDR_Enable15693 (18)2.1.9 RDR_Enable14443A (19)2.1.10 RDR_Inventory (20)2.1.11 RDR_GetRecordCnt (21)2.1.12 GetRecord (22)2.13 RDR_FinishInventory (23)2.1.14 RDR_SetCommuImmeTimeout (24)2.1.15 RDR_ResetCommuImmeTimeout (25)2.1.16 RDR_SetAcessAntenna (26)2.1.17 RDR_OpenRFTransmitter (27)2.1.18 RDR_CloseRFTransmitter (28)2.1.19 RDR_GetOutputCount (29)2.1.20 RDR_GetOutputName (30)2.1.21 RDR_GetReaderInfor (31)2.1.22 RDR_TagDisconnect (32)2.1.23 RDR_SetOutput (33)2.1.24 RDR_GetReaderLastReturnError (34)2.2 ISO15693协议通用接口 (35)2.2.1 ISO15693_Connect (35)2.2.2 ISO15693_ReadSingleBlock (36)2.2.3 ISO15693_WriteSingleBlock (37)2.2.4 ISO15693_ReadMultiBlocks (38)2.2.5 ISO15693_WriteMultipleBlocks (39)2.2.6 ISO15693_LockBlock (40)2.2.7 ISO15693_WriteAFI (41)2.2.8 ISO15693_LockAFI (42)2.2.9 ISO15693_WriteDSFID (43)2.2.11 ISO15693_GetSystemInfo (45)2.2.12 ISO15693_LockMultipleBlocks (46)2.3 NXP ICODE-SLI自定义命令 (47)2.3.1 NXPICODESLI_EableEAS (47)2.3.2 NXPICODESLI_DisableEAS (48)2.3.3 NXPICODESLI_LockEAS (49)2.3.4 NXPICODESLI_EASAlarm (50)2.4 NXP ICODE-SLIX 自定义命令 (51)1.4.1 NXPICODESLIX_EableEAS (51)2.4.2 NXPICODESLIX_DisableEAS (52)2.4.3 NXPICODESLIX_LockEAS (53)2.4.4 NXPICODESLIX_EASAlarm (54)2.4.5 NXPICODESLIX_GetRandomNum (55)2.4.6 NXPICODESLIX_SetPassword (56)2.4.7 NXPICODESLIX_WritePassword (57)2.4.8 NXPICODESLIX_LockPassword (58)2.4.9 NXPICODESLIX_PasswordProtect (59)2.5 Tag-it HF-I plus 自定义命令 (60)2.5.1 TIHFIPLUS_Write2Blocks (60)2.5.2 TIHFIPLUS_Lock2Blocks (61)2.6 ST M24LR16E 自定义命令 (62)2.6.1 STM24LR16E_UpdatePassword (62)2.6.2 STM24LR16E_AuthPassword (63)2.6.3 STM24LR16E_ActivateSectorSecurity (64)2.6.4 STM24LR16E_ReadCFGByte (65)2.6.5 STM24LR16E_SetCFGEH (66)2.6.6 STM24LR16E_SetCtrlRegEHEN (67)2.6.7 STM24LR16E_ReadCtrlReg (68)2.7 ST M24LR64 自定义命令 (69)2.7.1 STM24LR64_UpdatePassword (69)2.7.2 STM24LR64_AuthPassword (70)2.7.3 STM24LR64_ActivateSectorSecurity (71)2.8 mifare classic (S50和S70)函数接口 (72)2.8.1 MFCL_Connect (72)2.8.2 MFCL_ReadBlock (73)2.8.3 MFCL_WriteBlock (74)2.8.4 MFCL_Authenticate (75)2.8.5 MFCL_Increment (76)2.8.6 MFCL_Decrement (77)2.8.7 MFCL_Restore (78)2.8.8 MFCL_FormatValueBlock (79)2.8.9 MFCL_CreateAccessCondition (80)2.8.10 MFCL_Sector2Block (81)2.8.12 MFCL_IsTailerBlock (83)2.9 mifare ultralight 函数接口 (84)2.9.1 ULTRALIGHT_Connect (84)2.9.2 ULTRALIGHT_Read (85)2.9.3 ULTRALIGHT_Write (86)2.9.4 ULTRALIGHT_LockPage (87)2.9.5 ULTRALIGHT_LockBlock (88)2.9.6 ULTRALIGHT_ReadMultiplePages (89)2.9.7 ULTRALIGHT_WriteMultiplePages (90)2.9.8 ULTRALIGHT_Authenticate (91)2.9.9 ULTRALIGHT_UpdatePassword (92)2.9.10 ULTRALIGHT_UpdateAuthConfig (93)2.9.11 ULTRALIGHT_AuthenSafe (94)3. 空中接口协议类型编码和标签类型编码定义 (95)3.1.空中接口协议类型编码定义 (95)3.2. 标签类型编码定义 (95)3.2.1. ISO15693标签类型编码定义 (95)3.2.2. ISO14443A 标签类型编码定义 (95)4. RFIDLIB API错误代码表 (96)1.控件调用流程1.1 控件注册进入目录“.\rfid_reader-读卡器开发包\HF-高频\samples\activeX\ocx”,如图1-1所示。
ActiveX网页控件
三 、 实 现
1 .项 目
打 开 Vsa S d . e 2 0 ,建 立 _ 个解 决 方 案 或项 目 i l t i N t 05 u u o 一
D a U B e。 在项 目类 型 中选 择 Vsa C+ +下 的 A L 项 , en S K y i l u T 选 在 模 板 中选 择 “ T r et ,项 目名 为 D aU B e。 点 击 A L Po c” j en S K y 确 定 , 系统 就 在 指 定 的 目录 下 建 了 D a U B e en S K y项 目和 解 决
维普资讯
- 一
。 … 一
实用第一 智慧 密集
… … … … . … … … … … … … . … … . … 。
A t e 网 页 件 cvX i 控
张德 强
摘
要 A t e ci X插件技 术 广泛地 运 用 于 B S系统 中 ,本 文 通过 一 个项 目实例 ,详 细介 绍 用 v /
一
控件来完成读取硬件 U B K Y的信息 。硬件 U B K Y选用飞 S E S E
天 诚 信 的 e as0 0 D产 品 。 Psl0 N
个 产 生 C+ +/ O 代 码 的 框 架 , 专 门 用 于 开 发 C M 组 C M O
件 。A L提 供 了小 巧 、高效 、灵 活 的 类 ,这 些 类 为 创 建 可 相 互 T 操 作 的 C M 组 件 提 供 了 基 本 的设 施 。 A L完 全 面 向 C M 组 O T O 件 ,其 结 构完 全 针 对 C M 中 的诸 多规 范 。 是编 写 C M 组 件 的 O O
在 C M 模 型 中 ,对 象 本 身 对 于 客 户 来 说 是 不 可 见 的 ,客 O 户 请 求 服 务 时 ,只 能通 过 接 口进 行 。 一 接 口是 不会 改 变 的 。 般
microsoft web browser activex使用方法
microsoftwebbrowseractivex使用方法**一、概述**ActiveX是一种由Microsoft开发的控件,可用于在Web浏览器中嵌入和执行各种应用程序。
它允许开发人员创建在Internet上运行的自定义应用程序,并提供了一个方便的集成方式。
ActiveX也广泛用于Microsoft的InternetExplorer浏览器中。
**二、安装和启用**要使用ActiveX,首先需要确认您的操作系统是否支持。
通常,大多数现代操作系统都内置了ActiveX的支持。
对于Windows操作系统,您可以按照以下步骤进行安装和启用:1.打开控制面板,并找到“程序和功能”选项。
2.在程序列表中找到并选中“InternetExplorer”,然后点击“打开或关闭Windows功能”。
3.在打开的窗口中,找到ActiveX控件和插件复选框,勾选它们以启用ActiveX。
4.确认更改并重启浏览器。
**三、使用方法**一旦ActiveX被启用,您就可以在Web浏览器中使用它了。
下面是一些基本的使用方法:1.打开InternetExplorer并访问一个包含ActiveX控件的网站。
2.通常,您不需要做任何特殊操作,因为ActiveX控件会自动在您的浏览器中加载并开始工作。
3.如果您需要更改ActiveX控件的设置或属性,通常可以在浏览器的工具栏中找到相关的选项或菜单项。
4.如果您遇到任何问题或错误,请尝试查看浏览器的错误报告或调试工具,以获取更多信息。
**四、注意事项**1.请注意,不是所有的网站都支持ActiveX控件。
一些网站可能会阻止或限制ActiveX的使用,以保护用户的安全和隐私。
2.某些ActiveX控件可能包含不安全的漏洞,因此请务必保持您的浏览器和操作系统更新到最新版本,以获得最佳的安全性。
3.避免在不信任或不安全的网站上加载和使用未知来源的ActiveX控件。
总的来说,MicrosoftWeb浏览器中的ActiveX使用相对简单和直观。
QtActiveX开发、调用、调试(带附件)
QtActiveX开发、调用、调试(带附件)
Qt ActiveX创建、调用和调试
1.创建并设置工程
vs2008新建Qt ActiveX工程:
下一步默认选择,加载Core library、GUI library、ActiveQt server library,默认下一步,finish.
设置工程的属性:
属性->配置属性->调试命令:在用浏览器测试ocx的时候用得到,建议填写IE的绝对路径;命令参数:填写嵌入你的ocx的html的绝对路径。
2.在第一部设置好后,随便写几个信号和槽链接,生成一个dll组件(Active 控件可使ocx或dll,我这里是dll),将生成的dll用depends工具查看该dll的所有依赖项,将所有的依赖项拷贝到当前目录,编写ActiveX控件注册脚本,将regsvr32.exe ActiveXTest.dll 重命名为reg.cmd放在生成目录下,双击此文件等待注册成功:
我的生成目录:
3.编写html脚本嵌入ocx
如果ocx想要通过IE浏览器调用,则必须编写html脚本掉用控件,通常的例子如下,保持你的html路径与你在设置工程时的路径一致。
acitvex 的原理
acitvex 的原理
ActiveX 是一种基于微软的 COM 技术的框架,用于开发可重用
的软件组件。
它允许开发者创建可嵌入到其他应用程序中的功能丰
富的组件,例如控件、插件等。
ActiveX 的原理涉及以下几个方面:
1. COM(Component Object Model),ActiveX 是基于 COM 的,COM 是一种面向对象的编程模型,它定义了组件之间的交互方式。
COM 组件可以通过接口来相互通信和交互,这种松耦合的设计使得
组件可以被灵活地组合和重用。
2. 封装和封装,ActiveX 组件通常以动态链接库(DLL)的形
式存在,它封装了特定功能的代码和数据。
这些组件可以被其他程
序引用和调用,使得开发者可以利用这些组件的功能而无需重复编
写代码。
3. 安全性,ActiveX 组件可以被网页引用,因此安全性是一个
重要考虑因素。
为了确保安全,ActiveX 组件需要经过数字签名和
用户授权才能被下载和执行。
此外,浏览器通常会对 ActiveX 控件
进行安全设置,以防止恶意控件对系统造成损害。
4. 与浏览器的集成,ActiveX 控件可以嵌入到网页中,通过浏览器来展示和运行。
这种集成方式使得开发者可以为网页添加丰富的交互功能,例如多媒体播放、数据输入等。
总之,ActiveX 的原理涉及到基于 COM 的组件模型、封装和封装技术、安全性和与浏览器的集成等方面。
它为开发者提供了一种灵活、可重用的组件开发和集成方式,使得软件开发更加高效和便利。
web上用Activex控件开发步骤
hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);
// 标记控件初始化安全.
// 创建初始化安全组件种类
hr = CreateComponentCategory(CATID_SafeForInitializing,
L"Controls safely initializable from persistent data!");
if (SUCCEEDED(hr))
{
// Register this category as being "implemented" by the class.
CATID rgcatid[1] ;
rgcatid[0] = catid;
return ResultFromScode(SELFREG_E_TYPELIB);
if (!COleObjectFactoryEx::UpdateRegistryAll(FALSE))
return ResultFromScode(SELFREG_E_CLASS);
// CICCardApp::ExitInstance - DLL termination
int CICCardApp::ExitInstance()
{
return COleControlModule::ExitInstance();
}
//////////////////////////////////////////////////////////////////////
ActiveX文档
IE的ActiveX控件的开发(一)(2006-09-06 19:00:50)分类:工作需要,突然要开发一个IE的ActiveX控件。
由于以前没有接触过这方面的东西,因此走了一些弯路。
网上搜了一大堆资料,又多又杂,东一块西一块的,关于第一次接触者和快速开发很不利,在此特意整理出来,以备忘,作参考。
ActiveX简介ActiveX是一个可能念,也微软进军网络应用的一个王牌武器之一。
我自己开发的ActiveX插件其实只是一个OCX控件,嵌入html代码中去应用。
因此这篇文章更多的涉及了OCX的东西。
OCX文件:OCX文件的全称是Object Linking and Embedding (OLE) Control Extension,中文名字叫做“嵌入式对象控件”,它的作用其实和适才谈到的DLL文件专门相像,其实所谓的OLE咱们平常已经超级熟悉了,简单地说就像在Word中能够利用Excel数据,写字板中能够嵌入图片文件等等这些功能。
打个例如的话,剪贴板就像是个简单的数据共享,而OLE那么是一种“对象共享”。
一、OCX组件的来历是如何的?一样的开发工具都会提供一些标准控件,但不管标准控件何等壮大、何等完善,都不能完全知足用户的需要。
因此易语言就提供一个接口,许诺用户编写自己的控件插入到易语言中利用。
用户编写自己的控件在利用方式上同标准控件是相同。
依照易语言的接口标准编写的控件确实是OCX。
由于利用OCX能够节省开发软件的时刻,因此此刻几乎所有开发工具都许诺用户利用OCX来增强其功能。
后来随着Internet的流行,微软又让网页中能够嵌入OCX,并称其为 ActiveX 控件。
目前能够编写OCX的工具包括VB、VC、Delphi。
易语言也即将支持OCX。
二、OLE和OCX的关系是什么?OLE和OCX通称对象链接与嵌入。
易语言已通过超级链接框等实现很多对象的链接功能,对象的嵌入易语言也即将支持。
OLE 与OCX 的应用主若是源于将多个应用信息源组合到一路的目标,OCX即将在易语言中取得普遍的应用,因为它能更好的与易语言的应用程序相结合,从而实现易语言不行实现或是很难实现的功能。
第十讲 ActiveX控件
2.生成并测试控件 现在我们就可以先来生成一下这个项目,当然到目前我们只是用 系统自动生成的一个控件项目,什么功能都没有,只是一个空框架 。控件也被自动注册到系统中去。那怎么才能测试一下这个控件呢 ?当然你可以再建个新项目,比如一个对话框程序,在对话框资源 编辑窗口中右边的工具箱里鼠标右键菜单里点选择项。
COM(Component Objiect Module,对象组件模型) 微软提出的组件式软件平台。COM提供跟编程语言无关的方法 (可以用C++、Java和VB等任意一种语言编写)实现一个软件对 象,因此可以在并被实现于多个平台运行。组件是C++面向对象思 想在软件业的应用,它是一种创建二进制软件组件的体系,是一种 与平台无关、语言无关、分布式的面向对象的体系。它不是一种面 向对象的语言,而是一种标准,COM描述了如何创建对象的一个模 型以及在COM对象间进行通讯所需要的内容。因此,从功能上讲 COM更像一个协议,一个二进制级别上组件重用的协议。
OLE技术是支持Windows应用程序之间相互通讯的一种技术,它通过 图象、图表、数据库、声音、文本等构成复合对象(也称复合文档),实现各 种应用软件系统之间的复杂的数据交换。 使用OLE,一个应用程序可以和 其他应用程序协同,产生易于被用户操作的不同复合文档,以及通过拖放交 换数据和通过OLE自动化控制其他程序的动作。采用OLE技术开发的应用程 序可以集成其他软件的功能,而不用重复开发相同功能。 例如,你可以通 过Word、Excel、Mail、Microsoft Graph等建立起一个包含文字处理、 电子报表、电子邮件和统计图形功能的综合性办公自动化系统软件。
(2)找到这个压缩文件后,将其减压到当前文件夹中。 (3)按照如下路径C:\Program Files\Microsoft Visual Studio 10.0\Samples\2052\VC2010Samples\C++\MFC\ole找到 TstCon这个文件夹。打开这个文件夹,可发现有两个资源解决方案 TCProps和TstCon。 (4)在VS2010中打开这两个解决方案(file-openproject/solution,选择TstCon.vcxproj打开)。 (5)将TstCon设为启动项,对它进行编译F7。 (6)编译完后,就可在TstCon文件夹下的Debug文件夹中看到 TstCon32.exe文件。
调用ocxActiveX控件详解(做一个简单的ocx控件)
调⽤ocxActiveX控件详解(做⼀个简单的ocx控件)最近做的项⽬都和插件有关,就是在页⾯中调⽤插件的⽅法,然后进⾏操作。
插件就是ocx ActiveX控件,具体的说明可以⾃⼰去了解⼀下,在这⾥就不做赘述。
具体调⽤⽅式很简单:1、在页⾯中写⼀个object标签,标签中定义⼀个classid属性,这个属性是获取到插件的关键<object id="ocx" classid="clsid:c998ae90-5ffc-4a58-97d2-490a414bd6e5"></object>2、直接在js中获取到这个dom,然后就可以调⽤插件中的⽅法let ocx = document.getElementById("ocx");let sum = ocx.Add(1,2);在使⽤过程中遇到了很多问题,于是⾃⼰去摸索了⼀下如何制作⼀个ocx插件,也能够帮助⾃⼰加深⼀些使⽤⽅⾯的了解。
这⾥使⽤Visual Studio Community 2019,先下载必须的组件和依赖包。
使⽤C++的桌⾯开发和Visual Studio扩展开发这两项必须要勾选。
然后桌⾯开发中还需要勾选与MFC相关的库,如果不勾选的话⽆法新建MFC项⽬勾选完成后就开始下载相关的包,这个过程需要等待⼀会。
下载完成后就可以开始新建⼀个项⽬,在这⾥选择MFC ActiveX控件,命名为MyMFCActiveXControl然后就会⽣成⼀系列控件名,头⽂件等等的⽂件名,这⾥基本上不⽤做什么操作,直接完成就好。
唯⼀需要注意的是⼀个控件类型ID,这个ID我们后⾯会⽤到。
点击完成后,就会⽣成⼀系列与插件相关的⽂件,这些⽂件⾥⾯包含了插件的类,头⽂件,描述等信息。
因为不是专门学习C++的,不对⾥⾯的原理和结构进⾏探究,就取我需要的内容就⾏。
来找⼀找那个神奇的classid。
用VB做ActiveX控件
用VB做ActiveX控件用VB做ActiveX控件我们都知道在使用Visual Basic的时候可以使用很多现有的控件,像VB中的基本控件。
然而,只有这些基本的控件在很多的时候都不能满足我们的实际需要,因此还需要更多的能够实现其他特有功能的控件。
我们可以看到,在VB的部件中包含了大量的控件。
这些控件包含在VB中自带的ActiveX控件库中。
这些控件大大补充了VB的功能,其实可以这么说,在VB中谁掌握了对控件的使用,谁将更成功的运用VB写出功能强大的程序。
在VB中不但可以使用现有的ActiveX控件,更叫人兴奋的是可以利用VB创建自己的ActiveX控件。
下面我们一起讨论一下关于VB中创建ActiveX控件的基本知识。
ActiveX是Microsoft的术语,他是一组包括控件、DLL和ActiveX文档的组件,他通常是以动态连接库形势存在,因此必须在一个叫容器的可独立执行的软件中运行,比如VisualBasic,VisualC++,Internet Explorer等。
因此ActiveX控件和容器必须都支持一些特定的接口协议。
ActiveX应包括属性,事件和方法这些特殊机制,他也是创建ActiveX控件的核心。
在这个制作步骤中我们看到要利用一个VB中的UserControl对象,他是创建ActiveX控件的基础。
我先简单介绍一下UserControl 对象的基本知识吧。
VB创建的ActiveX控件包括UserControl控件和构成ActiveX控件的基本控件,称为构成控件。
这些基本控件实际上就是像CommandButton和Label控件等。
UserControl对象的设计界面和标准工程的Form设计界面没有什么差别。
我们可以直接在UserControl对象上面设计控件的外观,将代码添加在Code页面中,一切都是那么的熟悉。
UserControl以普通的文本文件格式存储,该文件包含UserControl以及他的构成控件源代码和属性值。
C#制作ActiveX控件在网页上使用
C#制作ActiveX控件并在Web中使用C#制作ActiveX控件,一般来说并不推荐这样做。
因为还要为客户安装对应的.Net Framework 版本。
现在一个示例实现将手写板的签字图片复制到剪贴板,从剪贴板的图片中对图片进行按比例缩放,并保存为C:\oaSignDpi.jpg。
★★★1.在Visual Studio 2010中,新建项目Windows窗体控件库。
命名为SaveClipImage★★★2. 在SaveClipImage项目中新建一个接口IObjectSafety. 这个接口内容最好不要变更。
接口IObjectSafety具体代码如下:using System;using System.Collections.Generic;using System.Runtime.InteropServices;using System.Text;namespace SaveClipImage{[ComImport, GuidAttribute("CB5BDC81-93C1-11CF-8F20-00805F2CD064")][InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]public interface IObjectSafety{[PreserveSig]int GetInterfaceSafetyOptions(ref Guid riid,[MarshalAs(UnmanagedType.U4)] ref int pdwSupportedOptions,[MarshalAs(UnmanagedType.U4)] ref int pdwEnabledOptions);[PreserveSig()]int SetInterfaceSafetyOptions(ref Guid riid,[MarshalAs(UnmanagedType.U4)] int dwOptionSetMask,[MarshalAs(UnmanagedType.U4)] int dwEnabledOptions);}}★★★3.在默认的UserControl1控件上增加一个PictureBox,设置可见性级别为Public.详细代码如下:using System;using System.Collections.Generic;using ponentModel;using System.Drawing;using System.Data;using System.Runtime.InteropServices;using System.Text;using System.Windows.Forms;using System.Management;namespace SaveClipImage{[Guid("6F151B97-B972-4112-BEB1-754173BAA80C"), //(这个Guid必须要和制作安装文件时的Guid号码一样)ProgId("_erControl1"), ComVisible(true)] //(控件必须添加的内容)public partial class UserControl1 : UserControl, IObjectSafety{public string fileName = "";[System.Runtime.InteropServices.DllImport("user32")]private static extern IntPtr SetClipboardViewer(IntPtr hwnd);[System.Runtime.InteropServices.DllImport("user32")]private static extern IntPtr ChangeClipboardChain(IntPtr hwnd, IntPtr hWndNext);[System.Runtime.InteropServices.DllImport("user32")]private static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);const int WM_DRAWCLIPBOARD = 0x308;const int WM_CHANGECBCHAIN = 0x30D;public IntPtr NextClipHwnd;//下一个句柄public UserControl1(){InitializeComponent();pictureBox1.SizeMode = PictureBoxSizeMode.AutoSize;Clipboard.Clear();//获得观察链中下一个窗口句柄NextClipHwnd = SetClipboardViewer(this.Handle);}public bool ThumbnailCallback(){return false;}///<summary>///按比例缩放图片///</summary>///<param name="ResourceImage">原图片</param>///<param name="newImagePath">保存缩放后的图片路径</param>///<param name="StandardHeight">标准高度如果大于标准高度,则按比例缩放</param>public bool ReducedImage(Image ResourceImage, string newImagePath, int StandardHeight){Image ReducedImage = null;try{Image.GetThumbnailImageAbort callb = newImage.GetThumbnailImageAbort(ThumbnailCallback);int ImageWidth;int ImageHeight;if (ResourceImage.Height > StandardHeight) //如果图片高度大于标准高度,按比例缩放{ImageWidth = (int)((double)StandardHeight * ResourceImage.Width / ResourceImage.Height);ImageHeight = StandardHeight;}else//如果没有大于标准高度则保持不变{ImageWidth = ResourceImage.Width;ImageHeight =ResourceImage.Height;//ResourceImage.HorizontalResolution}ReducedImage = ResourceImage.GetThumbnailImage(ImageWidth, ImageHeight, callb, IntPtr.Zero);if (System.IO.File.Exists(newImagePath)){try{System.IO.File.Delete(newImagePath);}catch { }}ReducedImage.Save(newImagePath,System.Drawing.Imaging.ImageFormat.Jpeg);ReducedImage.Dispose();ResourceImage.Dispose();return true;}catch (Exception ex){MessageBox.Show(ex.Message, "错误");if (ResourceImage != null){ResourceImage.Dispose();}if (ReducedImage != null){ReducedImage.Dispose();}return false;}}private void button1_Click()//(object sender, EventArgs e){Image img = Clipboard.GetImage();//获得剪贴板的图片if (img == null){//MessageBox.Show("没有找到签名图片,请用手写板签名...", "错误");fileName = "";//pictureBox1.Image.Dispose();//pictureBox1.Image = null;return;}string saveFileName = "C:\\oaSign.jpg";//if (System.IO.File.Exists(saveFileName))//{// try// {// System.IO.File.Delete(saveFileName);// }// catch { }//}if (pictureBox1.Image != null){pictureBox1.Image.Dispose();pictureBox1.Image = null;}if (ReducedImage(img, saveFileName, 40)){//Clipboard.Clear();try{Image srcImg = Image.FromFile(saveFileName);Bitmap bmp = new Bitmap(srcImg);int xDpi = 96;int yDpi = 96;GetSystemDpi(ref xDpi, ref yDpi);bmp.SetResolution(xDpi, yDpi);//设置水平和垂直DPI都是96 大多数显示器默认//srcImg.Dispose();string fileDpi96 = "C:\\oaSignDpi.jpg";if (pictureBox1.Image != null)pictureBox1.Image.Dispose();if (System.IO.File.Exists(fileDpi96)){try{System.IO.File.Delete(fileDpi96);}catch { }}bmp.Save(fileDpi96, System.Drawing.Imaging.ImageFormat.Jpeg);//Image displayImg = Image.FromFile(fileDpi96);pictureBox1.Image = Image.FromFile(fileDpi96);bmp.Dispose();//Application.DoEvents();//displayImg.Dispose();fileName = fileDpi96;srcImg.Dispose();img.Dispose();//if (pictureBox1.Image != null)//{// pictureBox1.Image.Dispose();//}}catch (Exception ex){if (img != null){img.Dispose();}MessageBox.Show(ex.Message);fileName = "";}}else{//Clipboard.Clear();fileName = "";//pictureBox1.Image.Dispose();//pictureBox1.Image = null;}}///<summary>///使用WMI对象获取系统的DPI///</summary>///<param name="xDpi"></param>///<param name="yDpi"></param>public void GetSystemDpi(ref int xDpi, ref int yDpi){using (ManagementClass mc = newManagementClass("Win32_DesktopMonitor")){using (ManagementObjectCollection moc = mc.GetInstances()){int PixelsPerXLogicalInch = 0; // dpi for xint PixelsPerYLogicalInch = 0; // dpi for yforeach (ManagementObject each in moc){PixelsPerXLogicalInch =int.Parse((each.Properties["PixelsPerXLogicalInch"].Value.ToString()));PixelsPerYLogicalInch =int.Parse((each.Properties["PixelsPerYLogicalInch"].Value.ToString()));}xDpi = PixelsPerXLogicalInch;yDpi = PixelsPerYLogicalInch;}}//MessageBox.Show(xDpi.ToString() + "," + yDpi);}protected override void WndProc(ref Message m){switch (m.Msg){case WM_DRAWCLIPBOARD://将WM_DRAWCLIPBOARD消息传递到下一个观察链中的窗口SendMessage(NextClipHwnd, m.Msg, m.WParam, m.LParam);IDataObject iData = Clipboard.GetDataObject();//检测图像if (iData.GetDataPresent(DataFormats.Bitmap)){//pictureBox1.Image = Clipboard.GetImage();button1_Click();//CopyToClipboard();}break;default:base.WndProc(ref m);break;}}private const string _IID_IDispatch = "{00020400-0000-0000-C000-000000000046}";private const string _IID_IDispatchEx = "{a6ef9860-c720-11d0-9337-00a0c90dcaa9}";private const string _IID_IPersistStorage ="{0000010A-0000-0000-C000-000000000046}";private const string _IID_IPersistStream ="{00000109-0000-0000-C000-000000000046}";private const string _IID_IPersistPropertyBag ="{37D84F60-42CB-11CE-8135-00AA004BB851}";private const int INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001;private const int INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002;private const int S_OK = 0;private const int E_FAIL = unchecked((int)0x80004005);private const int E_NOINTERFACE = unchecked((int)0x80004002);private bool _fSafeForScripting = true;private bool _fSafeForInitializing = true;#region IObjectSafety 成员public int GetInterfaceSafetyOptions(ref Guid riid, ref int pdwSupportedOptions, ref int pdwEnabledOptions){int Rslt = E_FAIL;string strGUID = riid.ToString("B");pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;switch (strGUID){case _IID_IDispatch:case _IID_IDispatchEx:Rslt = S_OK;pdwEnabledOptions = 0;if (_fSafeForScripting == true)pdwEnabledOptions =INTERFACESAFE_FOR_UNTRUSTED_CALLER;break;case _IID_IPersistStorage:case _IID_IPersistStream:case _IID_IPersistPropertyBag:Rslt = S_OK;pdwEnabledOptions = 0;if (_fSafeForInitializing == true)pdwEnabledOptions =INTERFACESAFE_FOR_UNTRUSTED_DATA;break;default:Rslt = E_NOINTERFACE;break;}return Rslt;}public int SetInterfaceSafetyOptions(ref Guid riid, int dwOptionSetMask, int dwEnabledOptions){int Rslt = E_FAIL;string strGUID = riid.ToString("B");switch (strGUID){case _IID_IDispatch:case _IID_IDispatchEx:if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_CALLER) &&(_fSafeForScripting == true))Rslt = S_OK;break;case _IID_IPersistStorage:case _IID_IPersistStream:case _IID_IPersistPropertyBag:if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_DATA) &&(_fSafeForInitializing == true))Rslt = S_OK;break;default:Rslt = E_NOINTERFACE;break;}return Rslt;}#endregion}}★★★4. 在解决方案下,新建项目—安装于部署命名为ClipImage在ClipImage中添加项目输出。
Delphi编写ActiveX控件(OCX控件)的知识和样例(有详细步骤)
Delphi编写ActiveX控件(OCX控件)的知识和样例(有详细步骤)⼀、ActiveX应⽤情况简介:ActiveX控件也就是⼀般所说的OCX控件,它是 ActiveX技术的⼀部分。
ActiveX是微软公司推出的基于组件对象模型COM的技术,包括对Windows 32位应⽤编程接⼝(Win32 API)和组件对象模型的⼀系列扩充和增强,⽬标是把计算机桌⾯环境与因特⽹环境集成起来,同时保护在Windows技术中现有的开发投资。
微软的 ActiveX技术根本上就是修改过的OCX技术,使它能够跨越Internet,主要是使⽤WWW来传递控件。
ActiveX控件可以被集成到很多⽀持ActiveX的应⽤当中去,或者直接⽤来扩展应⽤的功能,这些⽀持ActiveX的应⽤包括C++ Builder、Delphi、Visual dBASE、 Visual Basic、Visual C++、Internet Explorer、Netscape Navigator等。
ActiveX控件还可以使⽤在因特⽹上,在⽹页上使⽤它来发布信息、处理与⽤户的交互,但是需要使⽤⽀持ActiveX的浏览器才能阅读这些⽹页。
⽬前已经开发出来的ActiveX控件越来越多,由于ActiveX控件具有很好的特性,我们可以在编程的时候选择使⽤合适的控件来加快⾃⼰的应⽤开发。
可以不夸张地说,ActiveX控件是Windows平台编程必不可少的法宝。
使⽤ActiveX控件是相对⽐较简单的。
但是,开发ActiveX控件并不是⼀件简单的事情,必须要熟悉⽽不只是了解ActiveX技术才能开发出好的ActiveX控件。
⽽COM、OLE等ActiveX技术对于⼀般的程序员来说,是⽐较复杂难懂的。
所以,ActiveX控件的开发者⼀般都是“⽼鸟”级别的程序员。
但是如果您有了Inprise公司的Borland Delphi,那⼜另当别论了。
Delphi作为Windows平台上最优秀的程序开发⼯具之⼀,为ActiveX控件的开发提供了强有⼒的⽀持,让您轻松地开发ActiveX控件。
delphi开发activex控件
我是用html调试的,所以可用在 delphi 种配置run的参数 “run”->“parametes”,弹出一对话框,在“host application”中输入C:\Program Files\Internet Explorer\IEXPLORE.EXE, 在“parametes”中http://192.168.6.9/my.htm,这样就可以调试 Delphi 代码了
打开 delphi 7,选择菜单“new”->“other”->“activex”->“active form”->输入项目名称,系统自动给你创建了3个文件,一个是项目文件,一个是 form 的单元文件,还有一个后缀带 TLB 的文件。这三个文件中的你只需要更改 form 的单元文件,项目文件一般不需要写什么,TLB 文件有系统自动维护。
“automation object”也可以换成“com object”,但两者是有区别的,具体可以网上查询。
2、 增加接口函数
所谓接口函数就是调用 OCX 的程序可以直接调用的函数,如果你要写的函数不提供外部函数可以按常规声明就可以。但要声明接口函数则必须按步骤声明,有两种途径,其一:选择 form 单元文件,然后点击“edit”->“add to interface”,弹出一个对话框,输入要声明的函数,如:function fun:integer;其二:选择 form 单位文件,然后点击“view”->“Type Library”,弹出一个对话框,然后点击工具栏中“add a interface”可以增加函数或过程。说明:在这里注意几个地方,第一,一定要选 form 文件才可以,否则相应的菜单都是不可用的;第二、声明函数或过程的参数类型要注意 string->BSTR(第二种途径)或 WideString(第一种途径)。增加属性也函数类同。
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还是以另外的过程来执行的。
从浏览器端看,无任何区别。
这样一个通用的处理技巧非常有用。
3.ActiveX控件工程的创建使用VS2013有两种方式可以创建ActiveX工程:第一种:创建“MFC ActiveX Control”工程;第二种:创建“ATL 项目”。
MFC开发ActiveX控件全过程
使用MFC开发ActiveX控件全过程Visual C++是开发ActiveX控件的强大工具,它的特点是开发周期短、便于使用,因此它已经成为开发ActiveX控件的主要工具之一。
Visual C++集成开发环境,使用了微软自己的类库MFC,MFC对开发Ac tiveX控件提供了全面的支持,本文讲述的过程均在Visual C++ 6.0(以下简称VC)中实现。
1、创建工程:对于使用过VC的人,可以很容易地创建一个开发ActiveX控件的工程,没有使用过VC的人,按照下面的操作步骤,也可以很快创建一个同样的工程出来。
第一步:“File”—>“New”—>“(Projects)MFC ActiveX ControlWizard”,在“Project Name”中输入合适的工程名(以test为例),在“Location”中选择工程文件存放路径,然后,“OK”进入下一步;第二步:选择你想在这个工程中生成的ActiveX控件的个数(至少一个),其余选项决定是否生成一些辅助文件,通常按照默认设置即可,“Next”进入下一步;第三步:编辑你的工程中各个类和文件的名称,配置一些辅助选项,可以全部选择默认设置,“Fini sh”进入下一步;第四步:展示向导为你的工程生成的各种配置信息,“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()函数中的内容,就可以绘制自己想要的控件了。
Python开发Activex组件方法-电脑资料
Python开发Activex组件方法-电脑资料复制代码代码如下:# SimpleCOMServer.pyclass PythonUtilities:_public_methods_ = ['SplitString']_reg_progid_ = "Python.Utilities"_reg_clsid_ = "{A6688635-62F5-41cb-AF54-CBA84C2F0F86}"def SplitString(self, val):return "Hello world ", valif __name__ == '__main__':print "Registering COM server..."import win32com.server.registereCommandLine(PythonUtilities) 在console下运行:python SimpleCOMServer.py在HTML页面中调用该Activex组件:复制代码代码如下:window.onload = function(){var bj = new ActiveXObject("Python.Utilities");alert(obj.SplitString("Hel"));}QQ空间搜狐微博人人网开心网百度搜藏更多Tags:Python Activex组件复制链接收藏本文打印本文关闭本文返回首页上一篇:Python 匹配任意字符(包括换行符)的正则表达式写法下一篇:windows下wxPython开发环境安装与配置方法相关文章2014-05-05Python getopt模块处理命令行选项实例2014-04-04python 动态获取当前运行的类名和函数名的方法2014-02-02python处理中文编码和判断编码示例2014-05-05从零学python系列之数据处理编程实例(二)2014-05-05一则python3的简单爬虫代码2014-06-06用Python输出一个杨辉三角的例子2014-02-02python为tornado添加recaptcha验证码功能2012-08-08Python运行的17个时新手常见错误小结2007-03-03python的几种开发工具介绍2014-01-01python使用 api上传图片到微博示例文章评论最近更新Python实现的金山快盘的签到程序python使用ctypes模块调用windowsapi获取Python 第一步 hello worldpython dict remove数组删除(del,pop)Python模块学习 datetime介绍Python实现的简单万年历例子分享Python操作sqlite3快速、安全插入数据(防使用python实现递归版汉诺塔示例(汉诺塔递python模拟登陆阿里妈妈生成商品推广链接Python time模块详解(常用函数实例讲解,热点排行Python入门教程超详细1小时学会python 中文乱码问题深入分析比较详细Python正则表达式操作指Python字符串的encode与decode研Python open读写文件实现脚本Python enumerate遍历数组示例应Python 深入理解yieldPython+Django在windows下的开发python 文件和路径操作函数小结python 字符串split的用法分享。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
步步学ACTIVEX网页控件开发转载自IT168 [ / ]第1页:创建ActiveX控件本文将首先介绍如何使用Visual Studio开发一个简单的ActiveX控件,然后介绍ActiveX控件开发相关的基础知识,比如方法,属性和事件等,最后介绍如何利用这些知识,实现ActiveX控件和网页页面之间的通信。
MyActiveX控件的效果图简介ActiveX是由Microsoft在90年代中期提出的一项技术。
利用ActiveX技术,开发者可以创建像Java小程序applet一样的小型应用程序。
这些应用程序可以被下载然后在Microsoft的浏览器中运行。
这篇文章是为那些想学习如何开发他们的第一个ActiveX控件的Visual C++开发者准备的。
当我自己尝试学习这些技术的时候,我发现很多针对ActiveX技术的资料都已经不再适用了,都已经过时了,或者丢失了很多关键性的信息,这些都使得我在为我的项目创建一个ActiveX控件的时候,变得困难重重。
这篇文章将帮助你实现ActiveX网页控件开发的快速入门。
本文将首先介绍如何使用 Visual Studio开发一个简单的ActiveX控件,然后介绍ActiveX控件开发相关的基础知识,比如方法,属性和事件等,最后介绍如何利用这些知识,实现ActiveX控件和网页页面之间的通信。
另外,你也将学习到如何在默认的Internet Explorer安全设置下取消掉控件加载过程中的警告或者错误提示,使你的控件成为一个“安全”的ActiveX控件。
在本文中,我们将创建一个实际的ActiveX控件。
在控件加载的过程中,它将显示一个动态的进度条,告诉用户控件正在加载并处理信息。
同时,这个控件也将展示如何在ActiveX控件和Web页面之间传递信息。
本文将引导你一步步地利用Microsoft Visual Studio 2005完成ActiveX控件的开发工作。
创建ActiveX控件要创建一个ActiveX控件,首先启动Visual Studio 2005,执行下面这些步骤:1.选择“文件”菜单,然后选择“新建”->“项目”。
2.在“新建项目”对话框中,如下图1所示,选择“Visual C++”分类下的“MFC”。
然后选择“MFC ActiveX控件”作为项目模板。
第2页:添加对动态GIF动画的支持3.将新项目命名为“MyActiveX”,然后选择项目的保存目录,最后点击“确定”按钮,关闭“新项目”对话框,进入“MFC ActiveX控件”向导。
图1 新项目对话框4.在“MFC ActiveX控件”向导中,如下图2所示,选择左侧的“控件设置”,进入控件参数设置页面。
5.在“Create control based on”下拉列表中选择“STATIC”。
这表示我们使用的是一个静态控件,因为我们仅仅是显示输出而不接收输入。
6.在下面的“Additional features”的所有选项中,我们确认选中“Activates when visible”和“Flicker-free activation”这两个选项,同时确认“Has an About box dialog”选项没有被选中。
图2 MFC ActiveX 控件向导对话框7.点击“Finish”按钮关闭整个“MFC ActiveX控件向导”对话框,然后向导就会为我们创建整个项目的源代码。
默认情况下,向导创建的项目是使用共享MFC DLL的,这里我们需要改变这一设置。
因为如果目标机器上没有安装MFC DLL,那么ActiveX控件就不会运行。
我们常常看到一些网页上的ActiveX控件被显示为红色的叉叉,很多都是这个原因造成的。
为了解决这个问题,我们使用静态的MFC DLL。
从Visual Studio的菜单中选择“项目”->“属性”,然后切换到“配置属性”->“普通”,在配置页面中的“Use of MFC ”下拉列表中,将“use MFC in a shared DLL”切换成“Use MFC in a Static Library”就可以了。
8.向导创建了如下三个类:CMyActiveXApp –这是从COleControlModule派生的ActiveX控件应用程序类。
通过这个类,我们可以得到一个OLE控件对象,这个对象包含了对控件进行初始化(InitInstance)和对控件进行清理(ExitInstance)的成员函数。
CMyActiveXCtrl –这个类是从COleControl派生的。
我们将在这个类中实现控件的主要功能。
CMyActiveXPropPage –这个类从COlePropertyPage派生的。
它被用来管理控件的属性对话框。
MFC ActiveX控件向导已经为我们创建了一个默认的属性对话框,我们只需要在其基础上进行修改就可以了。
添加对动态GIF动画的支持为了实现使用ActiveX控件显示动态的进度条GIF动画,我们将使用Oleg Bykov在CodeProject的一篇文章中创建的类CPictureEx。
具体的文章地址,请查阅本文最后的参考资料。
首先,我们需要将源代码文件pictureex.cpp和pictureex.h添加到我们的项目中。
选择Visual Studio 2005 IDE中的“解决方案浏览器”,在源代码窗口中点击“Header Files or Source Files”,然后点击右键,在弹出的上下文菜单中选择“Add”->“Existing Item”,在文件选择对话框中,选中我们需要的源代码文件添加到项目中。
默认情况下,Visual Studio 2005本身是不支持GIF资源的。
如果你尝试着添加一个GIF资源,它将弹出一个错误窗口报告说这个文件不是一个合法的GIF 文件。
为了添加一个动态的 GIF动画资源,我们需要做一些额外的工作。
请按照下面的步骤添加GIF资源:1.复制GIF文件ProcessingProgressBar.gif到你的项目目录,然后将其扩展名修改为“gaf”。
在资源视图中,右键单击 MyActiveX.rc,然后选择“Add Resource”。
在弹出的添加资源对话框中,点击“Import”按钮,然后选择ProcessingProgressBar.gaf。
在“自定义资源类型”对话框中,填入“GIF”作为资源类型。
这样我们就可以将GIF图像文件导入到项目中作为资源了。
你可以在资源视图的“GIF”目录下中找到我们刚刚导入的GIF图像文件。
选中这个GIF图像资源,然后将它的ID由默认的IDR_GIF1修改为IDR_PROGRESSBAR。
2.在上一步中,我们使用“gaf”作为文件扩展名绕过了Visual Studio对GIF 资源文件的检查。
现在,我们需要做一些事情将这个“错误”修正过来,使得GIF 图像文件能够正常工作。
首先,在Visual Studio 2005中保存MyActiveX.rc。
然后打开项目目录,用记事本直接打开资源文件MyActiveX.rc,然后找到 IDR_PROGRESSBAR的定义行。
这里我们需要将文件名修改为“ProcessingProgressBar.gif”。
同样的,将项目目录下的 GIF资源文件的文件名修改为“ProcessingProgressBar.gif”。
第3页:添加代码实现进度条的显示接着,保存记事本中的MyActiveX.rc。
这时,Visual Studio将报告说MyActiveX.rc被外部程序修改,点击“Yes”重载这个资源文件。
最后,选中“解决方案浏览器”中的“ProcessingProgressBar.gaf”,在它的属性对话框中,将“Relative Path”修改为“ProcessingProgressBar.gif”添加对话框显示进度条现在,我们将添加一个对话框用以显示进度条:1.在资源视图中,右键点击对话框节点,在上下文菜单中选择“Insert Dialog”创建一个新的默认对话框。
2.删除对话框模板上我们不需要的“OK”和“Cancel”按钮,然后将对话框的尺寸调整为230 x 40。
3.然后,我们对对话框的属性做一些必要的修改,使它更适合于用来显示进度条:Border – None, Style – Child, System Menu – False, Visible – True。
4.将对话框的ID修改为IDD_MAINDIALOG。
5.在对话框上添加一个图像控件(Picture Control)。
将图像控件的尺寸调整为200 x 20,然后将其ID修改为IDC_PROGRESSBAR。
同时,将其颜色属性修改为白色(White)。
6.最后,我们需要为对话框资源创建一个新的类。
在对话框资源上右键单击,在弹出的菜单中选择“Add Class”,在接着出现的“MFC类向导”对话框中,我们将新的类命名为CMainDialog,基类设置为CDialog,点击“Finish”完成类的创建。
图3 创建新的对话框类CMainDialog现在,我们来为这个新创建的对话框类添加成员变量。
成员变量m_MainDialog 对应于类CMainDialog,而m_ProgressBar对应于我们刚刚添加的进度条显示控件。
1.为类CMyActiveXCtrl添加成员变量m_MainDialog。
选择类视图,在类CMyActiveXCtrl的节点上点击右键,在上下文菜单中选择“Add”->“ Add Variable”,然后输入CMainDialog作为变量类型,输入m_MainDialog作为变量名。
2.跟上面的步骤一样,我们为类CMainDialog添加成员变量m_ProgressBar。
输入CPictureEx作为变量类型,m_ProgressBar作为变量名。
同时,选中“Control variable”复选框,使其成为一个控件变量。
在“Control ID”下拉列表中,确认控件的ID为“IDC_PROGRESSBAR”。
具体设置如下图4所示:图4 添加成员变量m_ProgressBar添加代码实现进度条的显示现在,我们将添加代码实现主对话框和进度条控件的显示。
1.在类视图中,选中类CMyActiveXCtrl。
然后在其属性页中选中消息(Messages)图标,在消息列表中,选择“WM_CREATE”消息,然后选择“<Add> OnCreate”为WM_CREATE消息创建一个消息响应函数OnCreate。
这样,向导就会为我们在类CMyActiveXCtrl中创建一个消息响应函数OnCreate。
2.编辑MyActiveXCtrl.cpp文件,将下列代码添加到我们刚刚创建的OnCreate函数中。