VC++编写ActiveX控件详解goodWord格式.docx
《VC++编写ActiveX控件详解goodWord格式.docx》由会员分享,可在线阅读,更多相关《VC++编写ActiveX控件详解goodWord格式.docx(10页珍藏版)》请在冰豆网上搜索。
![VC++编写ActiveX控件详解goodWord格式.docx](https://file1.bdocx.com/fileroot1/2023-1/27/e66685b6-0588-4e66-864c-fd7a184b4fbc/e66685b6-0588-4e66-864c-fd7a184b4fbc1.gif)
”
里面最后一句话比较重要,就是用VC开发的OCX控件,你可以在其它语言里面都能调用,这样很好的实现了功能化组件的良好循环使用,而且还可以实现跨语言地调用(例如,你完全可以用C#调用C++开发的OCX控件)。
下面开始介绍,如何用VC++一步步生成你想要的“*.ocx”文件。
1.建立最简单的ocx文件并进行调试
1.1建立最简单的ocx文件
VC->
新建项目->
MFCActiveXWinZard
一路点击“确定”,直到点击“完成”。
最后VC++会自动生成一些文件,这些文件就构成了ActiveX的基本模板,文件的主要结构如下:
直接编译一下,然后在Debug目录下面就会生成一个名为“ocxDemo.ocx”的控件注册文件,然后利用“regsvr32”命令就可以实现本机对此控件的注册,然后就可以使用本语言或者跨语言编写程序时引用此控件来实现相应的功能(后面将会讲到)。
1.2ocx调试方法:
VC++自带有一个调试控件的工具“ActiveX控件测试容器”,通过三种方式可以打开:
1.点击“调试”按钮,会出现如下对话框:
然后浏览"
C:
\ProgramFiles\MicrosoftVisualStudio\Common\Tools\TSTCON32.EXE“
2.系统的“开始“-》“程序”-》“MicrosoftVisualC++6.0”-》“MicrosoftVisualC++6.0Tools”-》“ActiveControlTestContainer”
3.VC++开发环境中的“工具”-》“ActiveXControlTestContainer”
通过上面的任意一种方法,都可以调出下面的程序:
Failedtocreatecontrol未指定错误控件本文指的是vc++项目的activex
出现这个问题,我总结了总共有以下几点,可能还有其他原因:
1.中文问题:
如果你的项目类型是多字节的,而不是unicode编码的,你可能要注意这个问题了,我就发生了这个问题,为了解决这个问题没办法项目重新生成然后一个一个去排除,结果发现在"
copyright公司名称(C)"
的地方多了一个公司名称,是我自己手动加上去的,结果就是这个说明给搞的不能运行
2.acticex运行时需要其他的dll库没有在同一个目录下,或者没有在system32下都会导致这个问题
3.运行时许可导致,lic文件丢失.在新建项目的时候如果选中了"
运行时许可"
这个选项那么在你的项目中会产生一个lic文件,这个文件如果没有一起打包也会导致出现这个问题!
右击空白区域,插入控件,然后会弹出下面的对话框:
(自己建立的My1.Control和Oxce.Control和Ocxdemo.Control看看可以怎么删掉)
选中指定控件,然后点击确定,控件就被加载到此工具中了,然后可以通过这个工具来看此控件的相关事件响应等等。
2.在VC++生成的模板基础上自定义功能
所有的自定义功能基本上都来自于“MFCClassWizard”类向导对话框。
(“快捷键Ctrl+W”或者“查看”->
“建立类向导…”)
在“Automation”选项卡中为控件添加方法和属性。
在“ActiveXEvents”选项卡中为控件添加事件。
2.1添加控件属性
切换到“Automation”选项卡中,点击右边的“AddProperty…”会弹出对话框:
Externalname:
外部名称。
指此控件被使用时,外部程序看到的属性名称,仅在外部引用时被使用。
Type:
属性类型。
除了基本的整形等数据类型外,还有很多复杂的高级数据类型。
Variablename:
变量名称。
此属性在控件源文件中的变量名称,在编写控件源码时使用。
Notificationfunction:
提醒函数。
当此属性被改变时,会触发此提醒函数。
Implementation:
实现方式。
指属性的三种类型:
固有型,成员变量型,Get/Set方法型。
固有型是指系统赋予的固有属性,如背景色,标题;
成员变量型是用户自定义的属性;
Get/Set方法型,可能是指只能通过Get/Set方法才能获取和改变的变量吧(这个没研究)。
2.2添加控件方法
在“Automation”选项卡中,点击右边的“AddMethod…”会弹出对话框:
方法外部名称。
Internalname:
方法内部名称。
Returntype:
返回值类型。
两种:
固有方法,自定义方法。
Parameterlist:
参数列表。
参数名称和参数类型:
参数类型包含很多高级数据类型。
2.3添加控件事件
切换到“ActiveXEvents”选项卡中,点击右边的“AddEvent…”会弹出对话框:
事件外部名称。
事件内部名称。
比外部名称多了个前缀“Fire”。
固有事件,自定义事件。
固有事件一般是鼠标移动,双击等等事件,这些事件都由系统消息触发;
自定义事件则是完全由用户定义的一个函数,但这个函数需要用户在源文件中调用(在内部调用,对于控件的使用方来说,就相当于在调用的地方此事件被触发,而内部传入的参数,则是此事件产生的消息附带信息)。
总述:
通过“类向导”工具,为控件添加属性、方法和事件后,VC++会自动在相应的文件里面生成代码,比如内部方法属性和外部方法属性之间的映射,消息的建立,消息的声明,等等。
如果用户要对引进行深入研究,还需要对程序的结构比较熟悉,知道各部分代码的作用,知道哪些地方的代码是系统自动生成的,哪些代码需要用户手动加入的。
VisualC++开发环境虽然有很多优点,但有个缺点也很明显,就是代码结构比较乱,感觉没有VS2005和后面的VisualStudio系列要好。
但是由于VC6.0作为一个比较经典的开发环境,而且网上的有关C++的程序设计基本上都是基于VC6.0的,所以,有必要对其进行学习,便于自己读懂网上的代码并进行消化吸收。
2.4生成ocx文件并调试
直接编译用户加入了自定义代码的项目,然后在项目的Debug目录下面会生成一个ocx文件,这个就是此控件的注册文件了。
控件的调试工具仍然是“ActiveXControlTestContainer”。
假设我们在控件中加入了一个事件:
固有事件——“MouseMove”鼠标移动事件;
用户自定义事件——ocxClick事件(此事件是通过“WM_MOUSEMOVE”消息来触发的,返回的是鼠标当前位置的x坐标)。
运行“ActiveXControlTestContainer”并插入当前控件,当鼠标在上面移动的时候,可以看到MouseMove产生了事件了。
同时可以通过“Control”-》“InvokeMethod”来对控件的方法进行测试,测试的方法就是你输入参数,它返回计算结果(下面以自定义的方法funHello为例)。
3.控件的使用方法
3.1注册控件
ocx控件的安装方式有很多种,这里介绍最简单的一种。
步骤:
1.将需要安装的OCX控件文件复制到某个目录,例如C盘根目录下。
2.进入开始,点击运行。
3.在出现的框中键入regsvr32C:
/xxxx.ocx。
(XXXX为控件名,C:
/为目录)
4.点击确认后等待出现提醒注册成功即可。
基于VRML和ActiveX控件的传感器网络虚拟实验研究(文献关键词)
3.2ActiveX控件的调用
ActiveX作为一种通用的COM组件,可以被不同语言调用的。
3.2.1通过VC++调用
利用VC6.0建立一个MFC的基本对话框应用程序
在完成程序向导后。
执行下面的步骤:
1.执行“工程”-》“添加到工程”--》“ComponentsandControls…”。
2.在弹出的文件浏览对话框中,找到RegisteredActiveXControls文件目录下的你刚才注册的控件,比如“OcxDemoControl”,然后点击“Insert”按钮即可将此控件添加到控件工具条集合中。
(或在空白处右击,选择插入ActiveX控件,找到需要插入的控件进行插入即可)
3.将控件工具条上新增加的OCX控件拖入到应用程序主窗口中。
完成上面的步骤后,就可以像使用普通控件一样在VC中使用此控件了(右击此控件,可以查看此控件的“事件”和“属性”,就是你在编写控件源码时的那些“外部名称Externalname”)。
3.2.2通过C#调用
其实这个才是重点,因为跨语言调用ActiveX技术最被笔者看好的地方。
用VisualStudio2005新建一个C#.NET的Windows窗口程序,然后在工具箱面板上,右击“选择项”,选择COM组件,找到你注册的ActiveX控件:
确定后,那个OcxDemoControl控件就加载到工具箱里面了。
可以直接拖动这个控件到C#.NET应用程序的主窗口上去了,然后就像使用普通控件那样使用此控件了。
比如,本文中的ActiveX控件的自定义事件中,是通过鼠标移动来触发,那么在应用程序中,只要鼠标移动到控件上,那么就会触发此自定义事件,并获取当前鼠标位置的橫坐标。
4.最后一些Tip
1)在自定义控件时,可在控件源码的OnDraw()函数中设置控件的外观(也就是控件被拖入到应用程序中时呈现的样子,一般默认是一个白色的方框内切椭圆的样式)。
2)用C#来使用ActiveX的事件时,事件所产生的数据都包含在Event变量中,只需要用个点运算符就可以取出来了。
5.展望
控件函数的返回值类型那么多,那么复杂,如果要用得好,还需要对那些OLE数据类型进行好好学习,这个等今后需要时再慢慢学习吧。