VC++编写ActiveX控件详解
C#.netactive控件
C#开发active插件!先说说ActiveX的基本概念。
根据微软权威的软件开发指南MSDN(Microsoft Developer Network)的定义,ActiveX 插件以前也叫做OLE控件或OCX控件,它是一些软件组件或对象,可以将其插入到WEB 网页或其它应用程序中。
ActiveX是Microsoft对于一系列策略性面向对象程序技术和工具的称呼,其中主要的技术是组件对象模型(COM)。
在有目录和其它支持的网络中,COM变成了分布式COM (DCOM)。
在创建包括ActiveX程序时,主要的工作就是组件,一个可以自足的在ActiveX 网络(现在的网络主要包括Windows和Mac)中任意运行的程序。
这个组件就是ActiveX 近控件。
ActiveX是Microsoft为抗衡Sun Microsystems的JAVA技术而提出的,此控件的功能和JAVA applet功能类似。
目前支持ActiveX的主要是IE浏览器。
以前ActiveX开发普遍使用VC++或VB,随着C#和.net的发布,用C#开发ActiveX控件变得更方便、更简单。
但需要注意的是用C#开发的ActiveX控件需要客户机装有.net framework,有点郁闷。
可是相对.net强大的功能良好的易用性,这点牺牲还是值得的,况且现在好多计算机已经安装有.net framework了。
其实.net下的winform控件也是可以直接嵌入到web网页里的,但是由于.net安全性的限制,无法在客户端实现复杂的操作,比如磁盘空间操作和注册表操作。
因为ActiveX控件是以本地用户的身份运行,可以突破.net安全性的限制,所以开发ActiveX控件还是很必要的。
C#写ActiveX控件的原理很简单,就是使用了.net平台和COM的互操作性。
修改项目属性的目的就是将.net控件注册为com。
这样,你就可以把这个控件完全当作ActiveX控件来对待了。
调用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。
C#生成ocx控件
用C#编写ActiveX控件(一)前些日子做一个Web项目,必须自己编写一个ActiveX控件。
如今的ActiveX控件大多是使用VB/C++来开发的,而我对他们并不熟悉,因此考虑使用熟悉的C#编写ActiveX 控件。
首先,建立一个WinForm控件项目HelloWorld,并拖入一个Label控件,文字设为HelloWorld,如图:UserControl1.cs内容如下:using System;using System.Collections;using ponentModel;using System.Drawing;using System.Data;using System.Windows.Forms;namespace HelloWorld{///<summary>/// UserControl1 的摘要说明。
///</summary>public class Demo : erControl{private bel label1;///<summary>///必需的设计器变量。
///</summary>private ponentModel.Container components = null;public Demo(){// 该调用是 Windows.Forms 窗体设计器所必需的。
InitializeComponent();// TODO: 在 InitComponent 调用后添加任何初始化}///<summary>///清理所有正在使用的资源。
///</summary>protected override void Dispose( bool disposing ){if( disposing ){if( components != null )components.Dispose();}base.Dispose( disposing );}组件设计器生成的代码}}此时编译项目,可以生成HelloWorld.dll。
ActiveX控件添加指导
ActiveX控件添加应用指南在有些应用软件中,比如VC、VB、CVI等,ActiveX控件中缺少具体的一些功能控件,如chart控件等,需要从网上下载一个MSCHRT20.OCX文件,在下图中红圈中选择“运行”,打开后出现如下窗口:在窗口里输入regsvr32 D:mschrt20.ocx,“D:mschrt20.ocx”为mschrt20.ocx文件所在位置点击确定,就完成了添加。
如果运行时又出现了“ActiveX control is not licensed for this operation ”或类似提示,则需要用“记事本”格式的文档将以下程序复制并保存,且必须将此程序保存为XXX.reg格式(注册表格式),然后直接双击此reg格式的文件,就完成了许可(授权)。
Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\Licenses]@="Licensing: Copying the keys may be a violation of established copyrights."[HKEY_CLASSES_ROOT\Licenses\096EFC40-6ABF-11cf-850C-08002B30345D]@="knsgigmnmngnmnigthmgpninrmumhgkgrlrk"[HKEY_CLASSES_ROOT\Licenses\12B142A4-BD51-11d1-8C08-0000F8754DA1]@="aadhgafabafajhchnbchehfambfbbachmfmb"[HKEY_CLASSES_ROOT\Licenses\190B7910-992A-11cf-8AFA-00AA00C00905]@="gclclcejjcmjdcccoikjlcecoioijjcjnhng"[HKEY_CLASSES_ROOT\Licenses\1F3D5522-3F42-11d1-B2FA-00A0C908FB55]@="gcfjdjecpchcncdjpdejijgcrdoijjfcieod"[HKEY_CLASSES_ROOT\Licenses\1FB639E1-771F-11d1-8FD4-00A0C91E29D5]@="ldaskjeinankjgbnkcejnkrgnkvntkhzkhbtnkste"[HKEY_CLASSES_ROOT\Licenses\2AC5863D-48B9-490c-ACD3-B7723A1FEB9E]@="wrtgfdsbvxgfsdyuihjknmvcxgasdwqersdfdfsdyu"[HKEY_CLASSES_ROOT\Licenses\2c49f800-c2dd-11cf-9ad6-0080c7e7b78d]@="mlrljgrlhltlngjlthrligklpkrhllglqlrk"[HKEY_CLASSES_ROOT\Licenses\38911DA0-E448-11D0-84A3-00DD01104159]@="mcpckchcdchjcjcclidcgcgchdqdcjhcojpd"[HKEY_CLASSES_ROOT\Licenses\4250E830-6AC2-11cf-8ADB-00AA00C00905]@="kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun"[HKEY_CLASSES_ROOT\Licenses\43478d75-78e0-11cf-8e78-00a0d100038e]@="imshohohphlmnhimuinmphmmuiminhlmsmsl"[HKEY_CLASSES_ROOT\Licenses\46D504D7-557F-4C19-A4DD-6605411EF496]"6A7693BA-3139-41fd-BF3D-299961C965D5"="01000000d08c9ddf0115d1118c7a00c04fc297e b01000000b0cfa8651eed814ea8aa77984d181953040000001800000056005300200050004900440 020*******e0066006f00000003660000a80000001000000056a66542c85db014774bffecdc56384e0000000004800000a000000010000000b10a1f771bc4b05515b611500ced2faf10000000263d1b0a 183042c62cd7792b75683b4e14000000f30b3972d0fa2871120efa9fba18a3c245e584c2"@="gknalnanccemnhitviluhawerycnonilwjawreacop""CCF5A555-D92E-457b-9235-2B326B64035A"="01000000d08c9ddf0115d1118c7a00c04fc297e b01000000b0cfa8651eed814ea8aa77984d181953040000001800000056005300200050004900440 020*******e0066006f00000003660000a8000000100000003311a4ed781bba0eb740244ec6be37e 10000000004800000a0000000100000000ef4da56cd76cee7c81f1227b555434f080000000beff2eed 562c9a114000000b389c01205cde0aa29234083954295bef840a8c3"[HKEY_CLASSES_ROOT\Licenses\4D553650-6ABE-11cf-8ADB-00AA00C00905]@="gfjmrfkfifkmkfffrlmmgmhmnlulkmfmqkqj"[HKEY_CLASSES_ROOT\Licenses\4F86BADF-9F77-11d1-B1B7-0000F8753F5D]@="iplpwpnippopupiivjrioppisjsjlpiiokuj"[HKEY_CLASSES_ROOT\Licenses\556C75F1-EFBC-11CF-B9F3-00A0247033C4]@="xybiedobrqsprbijaegcbislrsiucfjdhisl"[HKEY_CLASSES_ROOT\Licenses\57CBF9E0-6AA7-11cf-8ADB-00AA00C00905]@="aahakhchghkhfhaamghhbhbhkbpgfhahlfle"[HKEY_CLASSES_ROOT\Licenses\5BCBC240-27DF-49C1-8C1C-27B8463009A9]"6A7693BA-3139-41fd-BF3D-299961C965D5"="01000000d08c9ddf0115d1118c7a00c04fc297e b01000000b0cfa8651eed814ea8aa77984d18195304000000560000004d006900630072006f00730 06f00660074002000560069007300750061006c002000530074007500640069006f002000540072 00690061006c002000450064006900740069006f006e0020006400610074006100000003660000a 800000010000000c7e1d2e887c57b9814ce91d6c44249ae0000000004800000a0000000100000003 5f65ddd0c11d820b0b7a72d384e4f0810*******e568533309b0e78012ede394f29e6d81400000080 691310641b0c5f28070f7f29fe3acb3d3531a9"@="iqtdwslvccydcyhxabrcudupqdcalezvinyxwsdjgb""CCF5A555-D92E-457b-9235-2B326B64035A"="01000000d08c9ddf0115d1118c7a00c04fc297e b01000000b0cfa8651eed814ea8aa77984d18195304000000560000004d006900630072006f00730 06f00660074002000560069007300750061006c002000530074007500640069006f002000540072 00690061006c002000450064006900740069006f006e0020006400610074006100000003660000a 800000010000000157910d280b079e9030212f831ef8dd00000000004800000a0000000100000009 1b4ddfcf5198d358efe2a227e391200080000008943decdf61422b0140000006eafe0247bfe0b38ba3 4c5a3fc6106d9bae97edb"[HKEY_CLASSES_ROOT\Licenses\6000720D-F342-11D1-AF65-00A0C90DCA10]@="kefeflhlhlgenelerfleheietfmflelljeqf"[HKEY_CLASSES_ROOT\Licenses\6FB38640-6AC7-11cf-8ADB-00AA00C00905]@="gdjkokgdldikhdddpjkkekgknesjikdkoioh"[HKEY_CLASSES_ROOT\Licenses\72E67120-5959-11cf-91F6-C2863C385E30]@="ibcbbbebqbdbciebmcobmbhifcmciibblgmf"[HKEY_CLASSES_ROOT\Licenses\73A4C9C1-D68D-11d0-98BF-00A0C90DC8D9] [HKEY_CLASSES_ROOT\Licenses\73A4C9C1-D68D-11d0-98BF-00A0C90DC8D9\11.0][HKEY_CLASSES_ROOT\Licenses\73A4C9C1-D68D-11d0-98BF-00A0C90DC8D9\11.0\Retail ]@="sbbcdcprktpjtapmmfdacmupasbhscddncgp"[HKEY_CLASSES_ROOT\Licenses\743A8267-4958-460e-B757-7110EED3D53C]@="erwreffdrtetyuiopupoinjxsdfwdxvdgwertdxoui"[HKEY_CLASSES_ROOT\Licenses\74872840-703A-11d1-A3AF-00A0C90F26FA]@="mninuglgknogtgjnthmnggjgsmrmgniglish"[HKEY_CLASSES_ROOT\Licenses\74872841-703A-11d1-A3AF-00A0C90F26FA]@="klglsejeilmereglrfkleeheqkpkelgejgqf"[HKEY_CLASSES_ROOT\Licenses\78E1BDD1-9941-11cf-9756-00AA00C00908]@="yjrjvqkjlqqjnqkjvprqsjnjvkuknjpjtoun"[HKEY_CLASSES_ROOT\Licenses\7C35CA30-D112-11cf-8E72-00A0C90F26F8]@="whmhmhohmhiorhkouimhihihwiwinhlosmsl"[HKEY_CLASSES_ROOT\Licenses\80E80EF0-DBBE-11D0-BCE2-00A0C90DCA10]@="qijimitpmpnpxplpvjnikpkpqoxjmpkpoivj"[HKEY_CLASSES_ROOT\Licenses\899B3E80-6AC6-11cf-8ADB-00AA00C00905] @="wjsjjjlqmjpjrjjjvpqqkqmqukypoqjquoun"[HKEY_CLASSES_ROOT\Licenses\9DF1A470-BA8E-11D0-849C-00A0C90DC8A9] @="cchcqjejhcgcqcfjpdfcdjkckiqikchcojpd"[HKEY_CLASSES_ROOT\Licenses\9E799BF1-8817-11cf-958F-0020AFC28C3B]@="uqpqnqkjujkjjjjqwktjrjkjtkupsjnjtoun"[HKEY_CLASSES_ROOT\Licenses\A133F000-CCB0-11d0-A316-00AA00688B10] @="cibbcimbpihbbbbbnhdbeidiocmcbbdbgdoc"[HKEY_CLASSES_ROOT\Licenses\a8a9f020-b426-11cf-bf3b-00a0d10003fa]@="eesjgjnekjeeheijrfheiegepftigeljfepi"[HKEY_CLASSES_ROOT\Licenses\AC0871D0-6ACC-11cf-8ADB-00AA00C00905] @="knjnpgognginknggsmnnhnjnumvmlngnrlrk"[HKEY_CLASSES_ROOT\Licenses\AEA64E56-7C97-4a1c-8974-4E0BB4E48FCD] @="reuikcxsdrecfgfbvnhjkjlpouiyuqwsdrtrtbvgcv"[HKEY_CLASSES_ROOT\Licenses\B1692F60-23B0-11D0-8E95-00A0C90F26F8] @="mjjjccncgjijrcfjpdfjfcejpdkdkcgjojpd"[HKEY_CLASSES_ROOT\Licenses\B1EFCCF0-6AC1-11cf-8ADB-00AA00C00905] @="qqkjvqpqmqjjpqjjvpqqkqmqvkypoqjquoun"[HKEY_CLASSES_ROOT\Licenses\BC96F860-9928-11cf-8AFA-00AA00C00905] @="mmimfflflmqmlfffrlnmofhfkgrlmmfmqkqj"[HKEY_CLASSES_ROOT\Licenses\C4145310-469C-11d1-B182-00A0C922E820]@="konhqhioohihphkouimonhqhvnwiqhhhnjti"[HKEY_CLASSES_ROOT\Licenses\CDE57A55-8B86-11D0-b3C6-00A0C90AEA82] @="ekpkhddkjkekpdjkqemkfkldoeoefkfdjfqe"[HKEY_CLASSES_ROOT\Licenses\CEDD4F80-B43C-11cf-837C-00AA00573EDE] @=hex(2):67,00,78,00,77,00,61,00,65,00,7a,00,75,00,63,00,66,00,79,00,71,00,70,\ 00,77,00,6a,00,67,00,71,00,62,00,63,00,6d,00,74,00,73,00,6e,00,63,00,75,00,\68,00,77,00,73,00,6e,00,79,00,68,00,69,00,6f,00,68,00,77,00,78,00,7a,00,00,\00[HKEY_CLASSES_ROOT\Licenses\D015B071-D2ED-11d0-A31A-00AA00688B10] @="gjdcfjpcmjicjcdcoihcechjlioiccechepd"[HKEY_CLASSES_ROOT\Licenses\DC4D7920-6AC8-11cf-8ADB-00AA00C00905] @="iokouhloohrojhhhtnooiokomiwnmohosmsl"[HKEY_CLASSES_ROOT\Licenses\E32E2733-1BC5-11d0-B8C3-00A0C90DCA10] @="kmhfimlflmmfpffmsgfmhmimngtghmoflhsg"[HKEY_CLASSES_ROOT\Licenses\ED4B87C4-9F76-11d1-8BF7-0000F8754DA1] @="knlggnmntgggrninthpgmnngrhqhnnjnslsh"[HKEY_CLASSES_ROOT\Licenses\F2E1F428-5B9A-4a69-B1F4-28C3C644168A] @="werdfswerxcvfdsertfyuijhnmujhkuyhjkhjkyuiw"[HKEY_CLASSES_ROOT\Licenses\F4FC596D-DFFE-11CF-9551-00AA00A3DC45] @="mbmabptebkjcdlgtjmskjwtsdhjbmkmwtrak"。
用VC实现三维图形ActiveX控件
第15卷第4期南华大学学报(理工版)Vol.15No.4 2001年12月Journal of Nanhua Nuiveri sity(Science&Engineering Edi tion)Dec.2001文章编号:1006-737X(2001)04-0063-04用VC实现三维图形ActiveX控件陆玲1,熊正为2,王志畅1(1.华东地质学院信息工程系,江西临川344000;2.南华大学建筑工程与资源环境学院,湖南衡阳421001)摘要:以正方体线框图为例,论述了用VisualC++ 6.0如何实现三维图形的Ac-tiveX控件的制作,为今后用VC开发专用图形软件提供了有利帮助.关键词:Visual C++6.0;三维图形;ActiveX控件中图分类号:TP391.72文献标识码:B0前言Visual C++现已成为较流行的编程工具,它不仅全面地贯彻了面向对象技术,而且在编译优化技术方面较其它同类产品具有明显优势.在编写专用应用软件时,特别是图形应用软件,用户除了使用MFC类中的绘图类外,还要在图形类的基础上派生出适用的类或编写图形ActiveX控件.1问题的提出在Windows应用程序中,设备环境与图形对象共同工作,协同完成绘图工作.CDC类定义了设备环境对象的类,该类提供的成员函数可以完成的操作包括:设备环境操作、使用绘图工具、使用颜色和调色板等.C DC类的成员函数可以获得和设置绘图属性、坐标变换、区域操作、画线、画简单二维图形等工作,但没有三维图形的绘制.本文就是针对三维图形设计一个简单的实用的ActiveX 控件.2三维图形的绘制2.1投影变换把三维物体变为二维图形表示的过程称为投影变换.我们通过屏幕显示出的三维图形都是三维物体经过投影变换后的二维图形.投影变换有几种方式,本文采用的是斜平行投影.如图1所示:设定投影方向的矢量为(X p,Y p,Z p),物体上的一点为(x,y,z),投影面为XOY面,则投影线的参数方程为:X s=x+X p#tY s=y+Y p#tZ s=z+Z p#t因为(X s,Y s,Z s)在z=0的平面上,故Z s= 0;则有t=-z/Z p,把t代入上述参数方程可得:图1投影变换示意图Fig.1Sketch m ap of projection exchangeX收稿日期:2001-10-29作者简介:陆玲(1962-),女,湖南衡阳人,副教授.研究方向:计算机图形图象处理,数据库.X s =x -X p /Z p #z Y s =y -Y p /Z p #z改变投影方向,可改变物体z 方向的投影长度及方向.2.2 三维图形的表示三维物体在计算机中常用线框、表面和实体三种模型表示.我们采用简单的实体模型.如对于如图2的单位正方体,可按图3表示:图2 单位正方体示意图图3 实体模型示意图Fig.2 Sketch m ap of unit cubeFig.3 Sketch map o f object model2.3 消除隐藏面消除隐藏面是指将不可见的面不画,本文仅论述凸多面体的消除隐藏面的方法.凸多面体的特点是某一面要么可见,要么就不可见,不可能出现一个面一部份可见,一部分不可见的情况.凸多面体是由若干个平面围成的物体.假设这些平面方程为:a i x +b i y +c i z +d i =0(i =1,2,,n)调整系数的符号,使每个平面的法向量指向多面体内部(如图3中的线表,面的边框顺序按右手法则,其法向量指向体内),如果投影方向为(X p ,Y p ,Z p ),那么(a i ,b i ,c i )#(X p ,Y p ,Z p )<0时,此平面为不可见面,在作图时,此面不绘制.2.4 计算平面法向量已知平面上三个点的坐标为(x 1,y 1,z 1)、(x 2,y 2,z 2)、(x 3,y 3,z 3),其顺序符合右手法则,其大拇指所指方向为该平面的法向量(x ,y ,z ),则:x =(y 2-y 1)(z 3-z 1)-(y 3-y 1)(z 2-z 1)y =(z 2-z 1)(x 3-x 1)-(z 3-z 1)(x 2-x 1)z =(x 2-x 1)(y 3-y 1)-(x 3-x 1)(y 2-y 1)3 创建三维图形ActiveX 控件3.1 建立ActiveX 控件框架ApppWizard 提供了建立Ac tiveX 控件框架的方法.单击File 菜单下的New,选择Project,选中MFC ActiveX Control Wizard,输入控件名(如为zft),按OK 后,后两部使用缺省选项,最后按Fin -ish 完成控件的设置.3.2添加属性图4 添加属性对话框Fig.4 Adding property dialogue本文为了使程序简化,只设计投影方向的三个分量X,Y,Z 属性.使用Class Wizard 添加定制属性.选取Vie w,Class Wizard 之后,单击Automation.在zftCtl 类中,单击Add Property,按如图4填写对话框,完成X 属性的添加.同理,填加Y 和Z 属性.在zftCtl 中的DoProp Exchange(),对属性进行初始化,添加如下行:PX_String(pPX,0X 0,m_x,0100);PX_String(pPX,0Y 0,m_y,0100);PX_String(pPX,0Z 0,m_z,0100);64南华大学学报(理工版) 2001年12月3.3 设置属性页在Project W orkspace 窗口中单击Resource -Vie w ,将Dialog 中的IDD_PROPPAGE _DIEROLL 对话框改为如图5形式:图5 设置属性对话框Fig.5 Setting property dialogue将三个编辑框的I D 分别改为IDC_X,IDC _Y,IDC_Z,并将它们与相应成员变量和属性相连:引出Class Wizard,选择Me mber Variables,在CzftProp -Pa ge 类中,选中I DC _X,单击Add Variable,按如图6方式填写内容.同理完成对I DC_Y 和IDC _Z 的相连.3.3 编写绘图代码图形绘制的代码属于控件类的ZftCtl 的On -Dra w()的方法.每当Windows 要重画包括控件的屏幕部分时,就会自动调用此函数.在此函数后部分添加如下代码(注:删除其中绘制椭圆的代码).图6 添加成员变量对话框Fig.6 Adding member variables dialogueshort point[][3]={{0,0,0},{1,0,0},{1,1,0},{0,1,0},{0,0,1},{0,1,1},{1,1,1},{1,0,1}}; //顶点表short line[]={0,1,2,3,0,4,5,6,7,4,1,7,6,2,1,0,3,5,4,0,0,4,7,1,0,2,6,5,3,2}; //线表short face[][2]={{0,4},{5,9},{10,14},{15,19},{20,24},{25,29}}; //面表short d[3],i,j,k,x,y,z,x1,y1,z1,x2,y2,z2,m,dd,max,min,num;float xmin,xmax,ymin,ymax,xx,yy,xbl,ybl,bl;dd=8; //顶点数m=6; //面数d[0]=atoi(m _x);d[1]=atoi(m_y);d[2]=atoi (m_z); //获取属性页中投影方向xmin=ymin=32767;xmax=yma x -32767;for(i=0;i<dd;i++){xx=point[i][0]-(float)d[0]/d[2]*point [i][2];yy=point[i][1]-(float)d[1]/d[2]*point [i][2];if (xx>xma x)xmax=xx;if (xx<xmin)xmin=xx;if (yy>yma x)ymax=yy;if (yy<ymin)ymin=yy;} //计算物体顶点坐标的最大最小值xbl=(rcBounds.right-rcBounds.left)/(xmax-xmin);ybl=(rcBounds.bottom -rcBounds.top)/(ymax -ymin);if(xbl<ybl)bl=xbl;else bl=ybl;for(i=0;i<dd;i ++){point[i][0]=(point[i][0])*bl;point[i][1]=(point[i][1])*bl;point[i][2]=(point[i][2])*bl;} //根据用户改变控件的大小,反算物体顶点坐标实际值for(i=0;i<m;i ++){x1=point[line [face [i][0]+1]][0]-point [line[face[i][0]]][0];x2=point[line [face [i][0]+2]][0]-point [line[face[i][0]]][0];y1=point[line [face [i][0]+1]][1]-point[line[face[i][0]]][1];y2=point[line [face [i][0]+2]][1]-point [line[face[i][0]]][1];z1=point [line [face [i][0]+1]][2]-point [line[face[i][0]]][2];z2=point [line [face [i][0]+2]][2]-point [line[face[i][0]]][2];65第15卷第4期 陆 玲等:用VC 实现三维图形ActiveX 控件x=y1*z2-y2*z1;y=z1*x2-z2*x1;z=x1*y2-x2*y1;if((x*d[0]+y*d[1]+z*d[2])>0){x1=point[line[face[i][0]]][0]-(float)d[0]/ d[2]*point[line[face[i][0]]][2];y1=point[line[face[i][0]]][1]-(float)d[1]/ d[2]*point[line[face[i][0]]][2];pdc->MoveTo(x1-xmin*bl,y1-ymin* bl);for(j=1;j<=face[i][1]-face[i][0];j+ +){x2=point[b[i][j]][0]-(float)d[0]/d[2]* point[b[i][j]][2];y2=point[b[i][j]][1]-(float)d[1]/d[2]* point[b[i][j]][2];pdc->Line To(x2-xmin*bl,y2-ymin*bl);}}}}4结束语本文仅以简单正方体线框图为例,论述了制作三维物体ActiveX控件的方法,以此可扩充到任意凸多面体三维物体控件的制作,只要将面表、线表与项点表中的数据换成所需绘制的物体数据就可.如果要绘制实心物体图,只需在绘制物体投影表面(多边形)的同时,添加一条填充多边形语句(C DC类成员函数)即可,但要添加填充类型属性.参考文献:[1]孙家广,杨长贵.计算机图形学[M].北京:清华大学出版社,1995.[2]唐泽圣等.计算机图形学基础[M].北京:清华大学出版社,1995.[3]熊璋,陆民燕,等.掌握M icrosoft Visual C++编程[M].电子工业出版社,1995.[4]三味创作室.Visual C++6.0应用与提高[M].科学出版社,1999.[5](美)Chuck Sphar.Visual C++6学习指南[M].机械工业出出版社,1999.[6]朱友芹,等.新编Windows API参考大全[M].电子工业出版社,2000.Expansion ActiveX Control ofThree Dimensions Graph with Visual C++LU Ling1,XIONG Zheng-Wei2,WANG Zhi-Chang1(r mation Engineering Department of East C hina Geological Institute,Linchuan,JX,344000;2.School of Architectural Engineering,Resources and Environment,Nanhua University,Hengyang421001,Hunan,China)Abstract:Taking a cube an example,the author in this paper tries to make ActiveX control of three-dimensions graph with Visual C++6.It is of help for the exploitation of special graph software using Visual VC++6.Key words:Visual C++6;three-dimensions graph;ActiveX control66南华大学学报(理工版)2001年12月。
什么是ActiveX插件?
什么是ActiveX插件?自从Microsoft公司于1996年推出ActiveX技术以来, ActiveX技术已得到了许多软件公司的支持和响应, 并纷纷在其产品中融入ActiveX技术。
而作为ActiveX技术之一的ActiveX控件也得到了迅猛的发展, 不但各大软件公司推出了不少ActiveX 控件, ActiveX控件更是得到一般开发者的喜爱。
那么, 什么是ActiveX控件呢? ActiveX控件是一个动态链接库, 是作为基于COM服务器进行操作的, 并且可以嵌入在包容器宿主应用程序中, ActiveX控件的前身就是OLE控件。
由于ActiveX控件与开发平台无关, 因此, 在一种编程语言上开发的ActiveX控件可以无须任何修改, 即可在另一种编程语言中使用, 其效果如同使用Windows通用控件一样。
如: 在VC++中开发的ActiveX控件, 不作任何修改即可应用于VB中。
由此可见, 通过使用ActiveX控件即可实现快速小型的组件重用、实现代码共享, 从而提升编程效率。
从上面亦可看出为何ActiveX控件如此广泛地受到开发者的欢迎。
因为ActiveX控件的可重用性, 加上Internet的普及, ActiveX控件得到了极大的发展, 目前, 从Internet上可以得到相当多的ActiveX控件, 而且品种繁多, 所完成的任务几乎无所不包。
对一般开发者来说, 只要有耐心, 都能从Internet上找到符合自己要求的ActiveX控件。
从Internet下载的ActiveX控件,或从其他途径得到的ActiveX控件,用户应该怎样做才能正确使用ActiveX控件或将其应用于自己的程序中呢?一般来说,一个外来ActiveX控件要在Windows中被正确使用,首先必必需将控件文件〔*.OCX〕复制到硬盘中,然后将其在Windows中注册,未在Windows中注册过的ActiveX控件是不能使用的。
VC6创建ocx工程的步骤
1、新建工程。
选择MFC Activex ControlWizard。
默认点击完成。
2、按Ctrl+W,出现建立向导,点击automation选项卡,点击Add Method。
添加函数3、输入函数名,函数返回值,函数参数。
即完成函数添加。
4、在工程cpp类中,加入以下代码,确保页面调用能正常#include "comcat.h"//页面安全const CATID CATID_SafeForScripting ={0x7dd95801,0x9882,0x11cf,{0x9f,0xa9,0x00,0xaa,0x00,0x6c,0x42,0xc4}};const CATID CATID_SafeForInitializing ={0x7dd95802,0x9882,0x11cf,{0x9f,0xa9,0x00,0xaa,0x00,0x6c,0x42,0xc4}};////////////////////////////////////////////////////////////////////////////// CV oiceApp::InitInstance - DLL initialization// 创建组件种类HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription){ICatRegister* pcr = NULL;HRESULT hr = S_OK ;hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr, NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);if (FAILED(hr))return hr; // Make sure the HKCR\Component Categories\{..catid} // key is registered.CA TEGORYINFO catinfo;catinfo.catid = catid;catinfo.lcid = 0x0409 ; // english// Make sure the provided description is not too long.// Only copy the first 127 characters if it is.int len = wcslen(catDescription);if (len>127)len = 127;wcsncpy(catinfo.szDescription, catDescription, len);// Make sure the description is null terminated.catinfo.szDescription[len] = '\0';hr = pcr->RegisterCategories(1, &catinfo);pcr->Release();return hr;}// 注册组件种类HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CA TID catid){// Register your component categories information.ICatRegister* pcr = NULL ;HRESULT hr = S_OK ;hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr, NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);if (SUCCEEDED(hr)){// Register this category as being implemented by the class.CATID rgcatid[1] ;rgcatid[0] = catid;hr = pcr->RegisterClassImplCategories(clsid, 1, rgcatid);}if (pcr != NULL)pcr->Release();return hr;}// 卸载组件种类HRESULT UnRegisterCLSIDInCategory(REFCLSID clsid, CA TID catid){ICatRegister* pcr = NULL ;HRESULT hr = S_OK ;hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr, NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);if (SUCCEEDED(hr)){// Unregister this category as being implemented by the class.CATID rgcatid[1] ;rgcatid[0] = catid;hr = pcr->UnRegisterClassImplCategories(clsid, 1, rgcatid);}if (pcr != NULL)pcr->Release();return hr;}5.在cpp类中修改下面这两个函数:STDAPI DllRegisterServer(void){HRESULT hr = S_OK ;AFX_MANAGE_STATE(_afxModuleAddrThis);if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))return ResultFromScode(SELFREG_E_TYPELIB);if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))return ResultFromScode(SELFREG_E_CLASS);// 标记控件初始化安全.// 创建初始化安全组件种类hr = CreateComponentCategory(CATID_SafeForInitializing, L"Controls safely initializable from persistent data!");if (FAILED(hr))return hr;// 注册初始化安全hr = RegisterCLSIDInCategory(_tlid, CATID_SafeForInitializing);if (FAILED(hr))return hr;// 标记控件脚本安全// 创建脚本安全组件种类hr = CreateComponentCategory(CATID_SafeForScripting, L"Controls safely scriptable!");if (FAILED(hr))return hr;// 注册脚本安全组件种类hr = RegisterCLSIDInCategory(_tlid, CATID_SafeForScripting);if (FAILED(hr))return hr;return NOERROR;}/////////////////////////////////////////////////////////////////////////////// DllUnregisterServer - Removes entries from the system registrySTDAPI DllUnregisterServer(void){HRESULT hr = S_OK ;AFX_MANAGE_STATE(_afxModuleAddrThis);if (!AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor))return ResultFromScode(SELFREG_E_TYPELIB);if (!COleObjectFactoryEx::UpdateRegistryAll(FALSE))return ResultFromScode(SELFREG_E_CLASS);// 删除控件初始化安全入口.hr=UnRegisterCLSIDInCategory(_tlid, CATID_SafeForInitializing);if (FAILED(hr))return hr;// 删除控件脚本安全入口hr=UnRegisterCLSIDInCategory(_tlid, CATID_SafeForScripting);if (FAILED(hr))return hr;return NOERROR;}6. 在ctrl.cpp类中加入如下代码(IMPLEMENT_OLECTLTYPE(CNetV oiceCtrl, IDS_NETVOICE, _dwNetV oiceOleMisc) 后面加入)////////////------------------------------------------------BEGIN_INTERFACE_MAP( CNetV oiceCtrl, COleControl )INTERFACE_PART(CNetV oiceCtrl, IID_IObjectSafety, ObjSafe)END_INTERFACE_MAP()//.............................................................................// IObjectSafety member functions// Delegate AddRef, Release, QueryInterfaceULONG FAR EXPORT CNetV oiceCtrl::XObjSafe::AddRef(){METHOD_PROLOGUE(CNetV oiceCtrl, ObjSafe)return pThis->ExternalAddRef();}ULONG FAR EXPORT CNetV oiceCtrl::XObjSafe::Release(){METHOD_PROLOGUE(CNetV oiceCtrl, ObjSafe)return pThis->ExternalRelease();}HRESULT FAR EXPORT CNetV oiceCtrl::XObjSafe::QueryInterface( REFIID iid, void FAR* FAR* ppvObj){METHOD_PROLOGUE(CNetV oiceCtrl, ObjSafe)return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj); }const DWORD dwSupportedBits =INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;const DWORD dwNotSupportedBits = ~dwSupportedBits;//.............................................................................// CStopLiteCtrl::XObjSafe::GetInterfaceSafetyOptions// Allows container to query what interfaces are safe for what. We're// optimizing significantly by ignoring which interface the caller is// asking for.HRESULT STDMETHODCALLTYPECNetV oiceCtrl::XObjSafe::GetInterfaceSafetyOptions(/* [in] */ REFIID riid,/* [out] */ DWORD __RPC_FAR *pdwSupportedOptions,/* [out] */ DWORD __RPC_FAR *pdwEnabledOptions) {METHOD_PROLOGUE(CNetV oiceCtrl, 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!}// we support both kinds of safety and have always both set,// regardless of interface*pdwSupportedOptions = *pdwEnabledOptions = dwSupportedBits;return retval; // E_NOINTERFACE if QI failed}/////////////////////////////////////////////////////////////////////////////// CStopLiteCtrl::XObjSafe::SetInterfaceSafetyOptions// Since we're always safe, this is a no-brainer--but we do check to make // sure the interface requested exists and that the options we're asked to // set exist and are set on (we don't support unsafe mode).HRESULT STDMETHODCALLTYPECNetVoiceCtrl::XObjSafe::SetInterfaceSafetyOptions(/* [in] */ REFIID riid,/* [in] */ DWORD dwOptionSetMask,/* [in] */ DWORD dwEnabledOptions){METHOD_PROLOGUE(CNetV oiceCtrl, ObjSafe)// does interface exist?IUnknown FAR* punkInterface;pThis->ExternalQueryInterface(&riid, (void * *)&punkInterface);if (punkInterface) { // interface existspunkInterface->Release(); // release it--just checking!}else { // interface doesn't existreturn ResultFromScode(E_NOINTERFACE);}// can't set bits we don't supportif (dwOptionSetMask & dwNotSupportedBits) {return ResultFromScode(E_FAIL);}// can't set bits we do support to zerodwEnabledOptions &= dwSupportedBits;// (we already know there are no extra bits in mask )if ((dwOptionSetMask & dwEnabledOptions) !=dwOptionSetMask) {return ResultFromScode(E_FAIL);}// don't need to change anything since we're always safereturn ResultFromScode(S_OK);}7. 在ctrl.h中加入以下代码:#include <objsafe.h>DECLARE_INTERFACE_MAP()BEGIN_INTERFACE_PART(ObjSafe, IObjectSafety)STDMETHOD_(HRESULT, GetInterfaceSafetyOptions) (/* [in] */ REFIID riid,/* [out] */ DWORD __RPC_FAR *pdwSupportedOptions,/* [out] */ DWORD __RPC_FAR *pdwEnabledOptions);STDMETHOD_(HRESULT, SetInterfaceSafetyOptions) (/* [in] */ REFIID riid,/* [in] */ DWORD dwOptionSetMask,/* [in] */ DWORD dwEnabledOptions);END_INTERFACE_PART(ObjSafe);8.页面代码中,添加如下代码:<objectid="NetV oice"codebase="NetV oice.ocx"classid="clsid:439A1200-A72F-48A5-970D-64EFD9192613"></object>。
ActiveX控件PPT课件
8.2 安装Actiຫໍສະໝຸດ eX控件8.1.2 ActiveX控件和普通控件的不同点
• ActiveX与普通控件的不同点在于它具有属性和方法。开发 人员在使用控件的时候是调用与之关联的C++的类成员函数, 而这些成员函数或数据成员并不是普通控件所具备的,而 是使用ClassWizard生成的C++源代码生成或自行编写的。 ActiveX控件的方法和C++中的成员函数是一样的,具有符 号化的名字和一组参数或一个返回值,控件的编写者可以 根据需要定义各种方法。
• 在项目中安装ActiveX控件,集成开发环境会发生两个动作: • ClassWizard将生成相应的C++类。 • 工具箱将产生控件工具供开发者使用。
8.3 实例8.1-ActiveX控件:日历控件的创建
• 本节讲解ActiveX控件-日历控件的使用。在前文, 相信读者已经熟练掌握了普通的日历控件的使用 了,ActiveX日历控件跟普通日历控件有所不同, 功能方面更加强大,也更加灵活。
8.1 ActiveX控件的特殊性
• 本节将介绍ActiveX的基本情况,着重介绍 ActiveX与其他普通控件的相同点和不同点。
8.1.1 ActiveX控件和普通控件的相同点
• ActiveX并不专指ActiveX控件,ActiveX包含以下3个方面 的内容:
• ActiveX控件:以前称之为OLE控件或OCX控件(ActiveX的 后缀为“.ocx”),通过ActiveX控件,可以使用别人编写 的程序功能来完善自己编写的网页或其他程序。而且,在 很多不同的语言中都可以使用ActiveX控件。
第十讲 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文件。
C#创建ActiveX
环境是:win7、VS2010、IE8一. 建立ActiveX控件(暂时称为ActiveX控件,其实是winform下的用户控件)。
1.打开vs2010,新建空白方案。
方案名称自己取。
然后,新建项目->Visual C#->Windows->类库,名称为HelloWorld。
2. 删除自动创建的Class1.cs文件,然后在HelloWorld上右键->添加->新建项,在弹出的窗口中选择“用户控件”,名称为Demo,此时会出现一个类似于winform设计界面,我们在上面从工具箱中拖动一个Label在上面,并设定Label的Text为"HelloWorld"。
此时编译项目,可以生成HelloWorld.dll。
将此dll拷贝到IIS的虚拟根目录下,然后在虚拟目录的物理目录下建立一个helloworld.htm的文件,html代码如下:<body bgcolor='#223344'><object id="helloworld" classid="http://localhost/HelloWorld.dll#HelloWorld.Dem o" Width="184" Height="96" VIEWASTEXT> </object></body>复制代码注:我们可以在Object的classid中使用“http://localhost/类.dll#命名空间.类名”这样的方式使用未注册的控件(此时还不能称为ActiveX)。
3、测试:在IE地址栏中输入以下地址:http://localhost/helloworld.htm,出现下图界面,控件已经成功在页面上显示了。
OK,我们已经完成了第一步。
但是问题到这里还没有解决。
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控件。
win7下VS2010 C# ActiveX控件制作 打包 测试
一、环境:操作系统:Win7开发工具:Visual Studio 2010.NET版本:4.0开发语言:C#下载makeCAB压缩包,这里面包含了制作数字签名和制作cab的几个exe程序保存路径:D:\makeCAB需要编辑的系统环境变量设置:(下面的系统变量)这样做是为了方便后面在cmd里调用。
二、编写ActiveX控件1、创建一个新的Windows窗体控件库2、重命名UserControl1.cs 为HelloDanielActiveX.cs3、拖1个GroupBox和2个Label控件到界面上4、为控件添加一个方法,用来设置Label中显示当前时间#region Javascript调用ActiveX的方法// 设置当前时间public void SetTime(string timeStr){bel2.Text = timeStr;}#endregion5、新建一个接口下面是这个接口的代码:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Runtime.InteropServices;namespace HelloDaniel{[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);}}6、在控件中实现这个接口关于实现这个接口,篇幅较长,可以在这篇文章找到:/default.aspx/Interfaces/IObjectSafety.html7、为控件添加Guid、ProgId和ComVisible属性Guid的获得应该是这样的:点击复制,然后将你得到的Guid号Copy下,粘贴到下面代码里面。
Visual C++的ActiveX控件
※ 1 ※Visual C++的ActiveX 控件 内容提要:本文详细介绍了ActiveX 控件的基本概念和ActiveX 控件的创建方法,同时介绍了ActiveX 控件的属性、方法和事件的添加和使用方法。
通过本文的学习,读者应了解ActiveX 控件的原理;能够用Visual C++创建ActiveX 控件;会使用ActiveX 控件;会向ActiveX 控件添加属性、方法和事件。
关键字:ActiveX 控件、OLE 、ActiveX 自动化 引言:ActiveX 是Microsoft 公司的一项注册技术,它使用COM 实现Windows 程序之间的通信。
ActiveX 封装包括了OLE 、Internet 和多媒体在内的各种技术,是Internet/Intranet 的一个开放式平台。
ActiveX 控件是OLE 控件的升级版,大大简化了用户的操作,用户可以像使用Windows 标准控件那样使用它。
ActiveX 控件可以插入到Web 页或者ActiveX 包容器中。
正文:1 ActiveX 控件介绍ActiveX 控件是为Windows 编写的可重复使用的定制控件,它是作为进程中的服务器而实现的。
本节将介绍ActiveX 控件的相关知识。
1.1 ActiveX 控件的相关技术与ActiveX 控件相关的技术有OLE 、容器与服务器、ActiveX 自动化等,下面分别加以介绍。
1. OLE 介绍 OLE (Object Linking and Embedding ,对象的嵌入与链接)是以COM 为基础的。
COM (Component Object Model ,组件对象模型)是OLE 的基础。
COM 是一种能够使软部件作为对象进行相互作用的二进制标准。
COM 不是一种编程语言,但可以为支持COM 对象二进制形式的语言一起工作。
可以认为,COM 提供了二进制对象的规范。
OLE 使应用程序能够通过数据链接或嵌入的方式共享数据。
使用VS2008C#开发ActiveX控件
VS2008C#ActiveX控件开发总结——————EagleInSky——————2010-1-13一、前言ActiveX控件以前也叫做OLE控件或OCX控件,它是一些软件组件或对象,可以将其插入到WEB网页或其它应用程序中。
使用ActiveX插件,可以轻松方便的在Web页中插入多媒体效果、交互式对象以及复杂程序等等。
通常使用C++或VB开发ActiveX控件,本文探讨一下在Visual Studio2008环境中使用C#开发ActiveX控件的技术实现。
工作的需要,最近学习了一下C#ActiveX的开发,参照网上众多的资料,发现在VS2008下开发ActiveX的资料较少,本人现在现在做一个笔记,以备后用。
其实用VS做一个ActiveX的安装项目,在客户机上双击运行安装.msi文件也是可以的,但是如果你的客户是在千里之外,难道每次更新的时候都要过去帮客户去安装吗?(客户毕竟有很多都不懂。
)所以,手动安装实在是太不爽了。
那么我们就实现一下ActiveX的自动安装吧。
二、开发环境操作系统:Windows2003开发工具:Visual Studio2008.NET版本:3.5开发语言:C#三、实现过程3.1运行Microsoft Visual Studio2008,新建解决方案如图3-1:图3-1给解决方案命名为:ActiveXTest如图3-2:图3-23.2为解决方案添加一个Windows控件库项目,点击右键点击解决方案…如图3-3:图3-3并把控件库命名为ActiveX如图3-4:图3-4现在解决方案资源管理器的情况如图3-5:图3-53.3更改项目属性:右键点击“ActiveX”如图3-6:图3-6在VS的工作区域出现了如下图的界面如图3-7:图3-7单击“程序集信息(I)…”弹出“程序及信息”如图3-8:勾选“使程序集COM可见(M)”图3-8选择“生成”选项卡,并勾选“为COM互操作注册(P)”如图3-9:注意:此处是在debug状态下修改的,如果是调到release状态下,还需要再设置一下。
Visual Studio 2008(c#)开发ActiveX控件及制作CAB包总结
开发及测试环境:(1)开发环境:Visual Studio 2008 SP1cabsdk(下载地址:/kb/310618) (2)测试环境:Windows Server 2003 R2 SP2IE62、创建项目我这里创建了三个项目:(1)HelloBossma :项目模板:Windows窗体控件库(2)HelloBossmaSetup:项目模板:安装项目(3)Web:项目模板: 网站3、HelloBossma项目这个项目用于编写具体的控件,并生成安装文件所需要的dll。
(1)添加用户控件:(2)设计控件:添加Panel、GroupBox、Label 控件。
NowTime是一个Label控件,用于显示时间。
然后在控件对应的代码文件中编写程序:using System;using System.Collections.Generic;using ponentModel;using System.Drawing;using System.Data;using System.Text;using System.Windows.Forms;using System.Runtime.InteropServices;namespace HelloBossma{/// <summary>/// Guid将用作控件的classid/// IObjectSafety的是用来标记可安全执行脚本的ActiveX控件/// </summary>[Guid("636B8CE1-7512-464C-B63C-FC75BDCA21DB"),ProgId("HelloBossma.HelloBossmaActiveX"), ComVisible(true)] public partial class HelloBossmaActiveX : UserControl, IObjectSafety {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;public HelloBossmaActiveX(){InitializeComponent();}/// <summary>/// 设置当前时间/// </summary>/// <param name="timeStr"></param>public void SetTime(string timeStr){bel2.Text = timeStr;}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;}}}关于IObjectSafety的实现参考了:/default.aspx/Interfaces/IObjectSafety.html using System;using System.Collections.Generic;using System.Text;using System.Runtime.InteropServices;namespace HelloBossma{[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 intpdwEnabledOptions);[PreserveSig()]int SetInterfaceSafetyOptions(ref Guid riid,[MarshalAs(UnmanagedType.U4)]int dwOptionSetMask, [MarshalAs(UnmanagedType.U4)] int dwEnabledOptions);}}这里还包含了一个可以被外部调用的方法,传进来一个字符参数,并显示出来:/// <summary>/// 设置当前时间/// </summary>/// <param name="timeStr"></param>public void SetTime(string timeStr){bel2.Text = timeStr;}(3)设置生成属性,勾选:为Com互操作注册(4)生成项目,生成这两个文件:HelloBossma.dllHelloBossma.tlb是必须的,否则生成不成功。
VC开发基于Twain的扫描ActiveX控件
VC开发基于Twain的扫描ActiveX控件摘要:在Web程序开发过程中,需要客户端通过网页调用控制扫描仪。
为了解决不同设备的兼容性问题,本文介绍了Twain的基本原理和工作过程,并且以VC6.0为开发工具,开发了具有图像扫描和数据网页提交功能的ActiveX控件,满足Windows平台下IE的应用。
关键词:Twain,ActiveX控件,VC6.0Abstract:In the process of Web program developing,clients need to call to control the scanner via the web. In order to solve the compatibility problem of different devices,This paper introduces the basic principles and working process of Twain,and for the development of tools to VC6.0,developed a Web page with image scanning and data submitted enabled ActiveX controls,and fulfilled the applications with IE on the Windows platform.Keywords:Twain,ActiveX Controls,VC6.0一、引言在开发Web程序的过程中,需要在客户端进行扫描图片并完成图片数据上传的功能。
由于客户端是通过Windows系统的IE浏览器来访问,决定使用微软推出的ActiveX技术。
通过网页内嵌入JavaScript,调用已经在本地计算机注册的ActiveX控件的接口函数,利用控件函数来控制外设扫描仪并且完成向服务器的数据上传数据。
VC2005开发MFC ActiveX控件基础教程
VC2005开发MFC ActiveX控件基础教程一.创建MFC ActiveX项目1.打开VS2005新建MFC项目。
这里我们取名为“ActiveXDemo”。
2.输入项目名称为“ActiveXDemo”和项目位置。
点击“确定”按钮,打开向导对话框。
3.选择“控件设置”选项卡,具体设置可参考上图。
其它选项卡为默认设置。
最后点击“完成”按钮保存设置。
二.添加控件方法VC2005会为我们自动创建好MFC ActiveX程序框架,我们只要给该ActiveX控件添加方法即可。
现在我们给控件添加一个“AddFun”方法,这个方法是将两个数相加并返回结果。
1.点击“视图”,打开“类视图”窗口。
2.展开“ActiveXDemoLib”项,选中“_DActiveXDemo”项。
点击鼠标右键,选择“添加”下的“添加方法”。
3.打开添加方法向导窗口。
因为我们是添加一个加法方法,所以我们设置的返回类型为LONG型,方法名设为AddFun,添加两个LONG类型参数Add1,Add2。
4.其它为默认设置,点击“完成”按钮完成添加方法。
接下来我们打开“解决方案资源管理器”打开“ActiveXDemoCtrl.cpp”文件。
5.打开代码视图,我们会发现VC2005已经为我们添加了一个“AddFun”方法,我们在方法内添加“returnAdd1 + Add2;”语句。
6.最后生成项目。
三.测试ActiveX控件经过上面操作我们已经生成了OCX控件文件。
接下来的步骤就是要将这个OCX控件嵌入在Html 页面中,通过Javascript来调用控件方法来测试我们的OCX控件是否能正常运行。
1.我们用“EditPlus”新建一个Html文件,具体内容如下:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.or g/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>ActiveX测试</title><script language = 'javascript'>function AddFun(){var iResult = MYAvtiveX.AddFun(12, 11);//调用ActiveX控件的AddFun方法。
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()函数中的内容,就可以绘制自己想要的控件了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VC++编写ActiveX控件ActiveX这门技术是通过生成“*.ocx”文件来实现的。
先来了解下OCX文件,在百度百科上面对OCX是这样解释的:“.ocx是ocx控件的扩展名,OCX 是对象类别扩充组件。
如果你用过Visual Basic或者Delphi一类的可视化编程工具,那么对控件这个概念一定不会陌生,就是那些工具条上的小按钮,如EditBox,Grid,ImageBox,Timer等等。
每个控件都有自己的事件、方法和属性。
使用了控件的编程非常容易。
首先,在程序的设计阶段可以设置一些属性,如大小,位置,标题(caption)等等;在程序运行阶段,可以更改这些属性,还可以针对不同的事件,调用不同的方法来实现对该控件的控制。
控件就好像一块块的积木,程序要做的事只是将这些积木搭起来。
控件的最大好处是可以重复使用,甚至可以在不同的编程语言之间使用,例如你可以在VB中嵌入用VC开发的控件。
”里面最后一句话比较重要,就是用VC开发的OCX控件,你可以在其它语言里面都能调用,这样很好的实现了功能化组件的良好循环使用,而且还可以实现跨语言地调用(例如,你完全可以用C#调用C++开发的OCX控件)。
下面开始介绍,如何用VC++一步步生成你想要的“*.ocx”文件。
1. 建立最简单的ocx文件并进行调试1.1 建立最简单的ocx文件VC->新建项目->MFC ActiveX WinZard一路点击“确定”,直到点击“完成”。
最后VC++会自动生成一些文件,这些文件就构成了ActiveX的基本模板,文件的主要结构如下:直接编译一下,然后在Debug目录下面就会生成一个名为“ocxDemo.ocx”的控件注册文件,然后利用“regsvr32”命令就可以实现本机对此控件的注册,然后就可以使用本语言或者跨语言编写程序时引用此控件来实现相应的功能(后面将会讲到)。
1.2 ocx调试方法:VC++自带有一个调试控件的工具“ActiveX控件测试容器”,通过三种方式可以打开:1.点击“调试”按钮,会出现如下对话框:然后浏览"C:\Program Files\Microsoft Visual Studio\Common\Tools\TSTCO N32.EXE“2. 系统的“开始“-》“程序”-》“Microsoft Visual C++ 6.0”-》“Microsoft Visual C++ 6.0 Tools”-》“Active Control Test Container”3. VC++开发环境中的“工具”-》“ActiveX Control Test Container”通过上面的任意一种方法,都可以调出下面的程序:右击空白区域,插入控件,然后会弹出下面的对话框:选中指定控件,然后点击确定,控件就被加载到此工具中了,然后可以通过这个工具来看此控件的相关事件响应等等。
2.自VC++生成的模板基础上自定义功能所有的自定义功能基本上都来自于“MFC ClassWizard”类向导对话框。
(“快捷键Ctrl+W”或者“查看”->“建立类向导…”)在“Automation”选项卡中为控件添加方法和属性。
在“ActiveX Events”选项卡中为控件添加事件。
2.1 添加控件属性切换到“Automation”选项卡中,点击右边的“Add Property…”会弹出对话框:External name:外部名称。
指此控件被使用时,外部程序看到的属性名称,仅在外部引用时被使用。
Type:属性类型。
除了基本的整形等数据类型外,还有很多复杂的高级数据类型。
Variable name:变量名称。
此属性在控件源文件中的变量名称,在编写控件源码时使用。
Notification function:提醒函数。
当此属性被改变时,会触发此提醒函数。
Implementation:实现方式。
指属性的三种类型:固有型,成员变量型,Get/Set方法型。
固有型是指系统赋予的固有属性,如背景色,标题;成员变量型是用户自定义的属性;Get/Set方法型,可能是指只能通过Get/Set方法才能获取和改变的变量吧(这个没研究)。
2.2 添加控件方法在“Automation”选项卡中,点击右边的“Add Method…”会弹出对话框:External name:方法外部名称。
Internal name:方法内部名称。
Return type:返回值类型。
除了基本的整形等数据类型外,还有很多复杂的高级数据类型。
Implementation:实现方式。
两种:固有方法,自定义方法。
Parameter list:参数列表。
参数名称和参数类型:参数类型包含很多高级数据类型。
2.3 添加控件事件切换到“ActiveX Events”选项卡中,点击右边的“Add Event…”会弹出对话框:External name:事件外部名称。
Internal name:事件内部名称。
比外部名称多了个前缀“Fire”。
Implementation:实现方式。
两种:固有事件,自定义事件。
固有事件一般是鼠标移动,双击等等事件,这些事件都由系统消息触发;自定义事件则是完全由用户定义的一个函数,但这个函数需要用户在源文件中调用(在内部调用,对于控件的使用方来说,就相当于在调用的地方此事件被触发,而内部传入的参数,则是此事件产生的消息附带信息)。
Parameter list:参数列表。
参数名称和参数类型:参数类型包含很多高级数据类型。
总述:通过“类向导”工具,为控件添加属性、方法和事件后,VC++会自动在相应的文件里面生成代码,比如内部方法属性和外部方法属性之间的映射,消息的建立,消息的声明,等等。
如果用户要对引进行深入研究,还需要对程序的结构比较熟悉,知道各部分代码的作用,知道哪些地方的代码是系统自动生成的,哪些代码需要用户手动加入的。
Visual C++开发环境虽然有很多优点,但有个缺点也很明显,就是代码结构比较乱,感觉没有VS200 5和后面的Visual Studio系列要好。
但是由于VC6.0作为一个比较经典的开发环境,而且网上的有关C++的程序设计基本上都是基于VC6.0的,所以,有必要对其进行学习,便于自己读懂网上的代码并进行消化吸收。
2.4 生成ocx文件并调试直接编译用户加入了自定义代码的项目,然后在项目的Debug目录下面会生成一个o cx文件,这个就是此控件的注册文件了。
控件的调试工具仍然是“ActiveX Control Test Container”。
假设我们在控件中加入了一个事件:固有事件——“MouseMove”鼠标移动事件;用户自定义事件——ocxClick事件(此事件是通过“WM_MOUSEMOVE”消息来触发的,返回的是鼠标当前位置的x坐标)。
运行“ActiveX Control Test Container”并插入当前控件,当鼠标在上面移动的时候,可以看到MouseMove产生了事件了。
同时可以通过“Control”-》“Invoke Method”来对控件的方法进行测试,测试的方法就是你输入参数,它返回计算结果(下面以自定义的方法funHello为例)。
3.控件的使用方法3.1 注册控件ocx控件的安装方式有很多种,这里介绍最简单的一种。
步骤:1.将需要安装的OCX控件文件复制到某个目录,例如C盘根目录下。
2.进入开始,点击运行。
3.在出现的框中键入regsvr32 C:/xxxx.ocx 。
(XXXX为控件名,C:/为目录)4.点击确认后等待出现提醒注册成功即可。
3.2 ActiveX控件的调用ActiveX作为一种通用的COM组件,可以被不同语言调用的。
3.2.1 通过VC++调用利用VC6.0建立一个MFC的基本对话框应用程序在完成程序向导后。
执行下面的步骤:1. 执行“工程”-》“添加到工程”--》“Components and Controls…”。
2. 在弹出的文件浏览对话框中,找到Registered ActiveX Controls文件目录下的你刚才注册的控件,比如“OcxDemo Control”,然后点击“Insert”按钮即可将此控件添加到控件工具条集合中。
3. 将控件工具条上新增加的OCX控件拖入到应用程序主窗口中。
完成上面的步骤后,就可以像使用普通控件一样在VC中使用此控件了(右击此控件,可以查看此控件的“事件”和“属性”,就是你在编写控件源码时的那些“外部名称External nam e”)。
3.2.2 通过C#调用其实这个才是重点,因为跨语言调用ActiveX技术最被笔者看好的地方。
用Visual Studio 2005新建一个C#.NET的Windows窗口程序,然后在工具箱面板上,右击“选择项”,选择COM组件,找到你注册的ActiveX控件:确定后,那个OcxDemo Control控件就加载到工具箱里面了。
可以直接拖动这个控件到C#.NET应用程序的主窗口上去了,然后就像使用普通控件那样使用此控件了。
比如,本文中的ActiveX控件的自定义事件中,是通过鼠标移动来触发,那么在应用程序中,只要鼠标移动到控件上,那么就会触发此自定义事件,并获取当前鼠标位置的橫坐标。
4. 最后一些Tip1)在自定义控件时,可在控件源码的OnDraw()函数中设置控件的外观(也就是控件被拖入到应用程序中时呈现的样子,一般默认是一个白色的方框内切椭圆的样式)。
2)用C#来使用ActiveX的事件时,事件所产生的数据都包含在Event变量中,只需要用个点运算符就可以取出来了。
5.展望控件函数的返回值类型那么多,那么复杂,如果要用得好,还需要对那些OLE数据类型进行好好学习,这个等今后需要时再慢慢学习吧。