【VS开发】 自己编写一个简单的ActiveX控件——详尽教程
最近开始学ActiveX控件编程,上手不太容易,上网想找相关教程也没合适的,最后还是在师哥的指导下完成了第一个简单控件的开发,现在把开发过程贴出来与大家分享一下~
(环境说明——平台:vs2005;语言:VC++;基于对话框)
①新建工程:
首先以管理员身份运行vs2005,文件->新建->项目,选择Visual C++下MFC,模板选MFC ActiveX控件,自定义工程名(我的为MyActiveX),确定后基本采用默认设置,直接”下一步”,不过”控件设置”中”创建的控件基于”改选为STATIC。
②介绍一下默认添加的三个基本类:
CMyActiveXApp:
提供了控件类的初始化(InitInstance)和销毁代码(ExitInstance)。
CMyActiveXCtrl:
用来实现控件建好后有什么功能。
CMyActiveXPropPage:
用来建立属性页,当控件建好后,可让用户通过“可视化”的属性页用鼠标来选择控件的属性。
③新建Dialog视图:
1)选中资源视图,右键单击Dialog,选择”插入Dialog”。(有些vs2005的资源视图在整个工程界面的右边侧)
2)默认生成一个包含两个按钮的对话框,对话框ID(默认为IDD_DIALOG1)可自行更改(不与其它的重复即可,我的改为IDD_MYDIALOG)
3)重新设计对话框,并增加一个”edit control”(文本框)控件。所有标准控件都在右侧的”工具箱”中(有的vs2005的工具箱在左侧),选中后再在对话框中相应位置单击一下即可,可直接拖动和缩放控件。这些控件的ID都可自行修改。
4)注意:关于对话框,一定要将其Visible属性改为True(也就是ID为IDD_MYDIALOG的这个最外层对话框对应的Visible属性,其默认为False),否则,即使其它一切都对,最后对话框的内容还是不显示!!
5)另外,对话框的Style属性改为Child(默认为Popup),这样运行的控件就会嵌在网页窗口内,而不是单独弹出一个对话框。当然,这里要根据你的实际需求选择。
6)将文本框控件(IDC_EDIT1)的Multiline属性设为True(默认为False),使的文本框内的内容可以分行显示。
④为Dialog创建对应的类:
1)右键单击对话框视图(不要点到某个具体控件),选择”添加类”
2)自定义类名,我的叫CMyDialog,注意其对话框ID与IDD_MYDIALOG对应,单击”完成”
3)vs2005会自动为你添加基本的代码
⑤为类添加成员变量
(一)为对话框类创建实例变量
1)在基本类CMyActiveXCtrl中为刚刚新建的对话框类创建实例变量:在类视图中右键单击CMyActiveXCtrl,选择添加->添加变量
2)变量类型改为CMyDialog(需手动输入,就是刚刚新建的对话框类的类名),变量名自定义,我的为m_MyDialog,注释就自己随意添加啦~
3)完成后就可发现MyActiveXCtrl.h中最后面成功添加上了对话框对象。
P.S.工程记得随时保存!
(二)为对话框中的控件创建实例变量
1)以”确定”按钮为例,在该按钮处单击右键,选择”添加变量”
2)自定义变量名,我的叫m_OKButton。
注意一下”控件变量”是否勾选,”控件ID”是否选为IDOK,若前面是在”确定”按钮控件上右键添加变量的话,这两项应该都默认是对的。
确认后点”完成”即可为该按钮在对话框CMyDialog类中添加相应的成员变量。
3)仿照上述几步,为”取消”按钮和文本编辑框也添加相应的成员变量,分别取名为m_CancelButton和m_Edit,对应控件ID为IDCANCEL和IDC_EDIT1。完成后MyDialog.h的最后面就会添加上这几个变量。
⑥在相应事件中添加代码以创建并绘制对话框和控件
1)为CMyActiveXCtrl类处理WM_CREATE事件,以初始化对话框对象:
左侧选中CMyActiveXCtrl,右侧属性栏选择”消息”那个小图标,找到WM_CREATE,点击下拉按钮,选择”<添加>OnCreate”。
2)在MyActiveXCtrl.cpp中现在会多出OnCreate函数(这不是我们自定义的函数,实际是重写的父类的函数),在其中添加一段代码:
m_MyDialog.Create(IDD_MYDIALOG,this); //初始化对话框
3)在MyActiveXCtrl.cpp中的OnDraw函数中添加绘制对话框的代码:
m_MyDialog.MoveWindow(rcBounds,true);
并注释掉后面的”DoSuperclassPaint(pdc, rcBounds);”
⑦为确定按钮添加点击响应事件
1)选中”确定”按钮,在右侧的属性栏点击控件事件小图标(小闪电),点击BN_CLICKED,再点击右侧对应的下拉按钮选择添加OnBnClickedOk函数(在CMyDialog类中)。
2)在CMyDialog.cpp中为OnBnClickedOk函数添加相应代码:
int nLength=m_Edit.SendMessage(WM_GETTEXTLENGTH);
m_Edit.SetSel(nLength, nLength);
m_Edit.ReplaceSel(_T("Hello World!——企鹅Sheldon/r/n"));
使得每点击一次确定按钮,文本编辑框添加一行文本:“Hello World!——企鹅Sheldon”。
注释掉”OnOK();”,这样点击确定按钮就不会直接关闭对话框了。
⑧编译调试程序,生成.ocx文件
若以上步骤都成功完成,那么恭喜你,一个简单的ActiveX控件就已经初步编写完成啦!下面进行编译调试。
1)调试前,设置编译模式为Release,也就是将工具栏中执行小图标旁的Debug改选为Release。
2)在最上一行的工具栏中选择 调试->启动调试
3)成功后会在工程根目录的release文件夹下生成相应文件,其中的MyActiveX.ocx即为我们所需的控件文件,不过它不能直接独立运行,需要借助浏览器,并且需要先在系统注册。
注:调试过程中可能提示”无法找到”tstcon32.exe”的调试信息…要继续调试吗?”,选择是即可。
⑨注册控件MyActiveX.ocx
1)用管理员身份运行”Windows命令处理程序”(命令提示符),转到MyActiveX.ocx文件所在目录下,为求简便,我将其移到了C盘的MyActiveX文件夹下。
相关命令:
1.cd /MyActiveX :转到C盘下的MyActiveX文件夹下。
2.dir :查看当前目录下文件信息
3.regsvr32 xxx.ocx :装载控件
4.regsvr32 -u xxx.ocx :卸载控件
5.regedit :注册表编辑器(在第一个文件夹下的CLSID目录下,有注册号信息)
注:ocx控件使用前一定要先卸载旧的。
这里是第一次注册该控件,转到相应目录下后直接输入regsvr32 MyActiveX.ocx即可。成功后会有提示框,直接点确定。
⑩注册成功后插入相应网页中
编写测试网页,我推荐使用微软的ActiveX Control Pad,不用自己写代码。
1)运行Microsoft ActiveX Control Pad软件,在代码<BODY>下方空白处单击右键,选择”Insert ActiveX Control”
2)选中我们新注册的MyActiveX Control控件,单击OK
3)这时会弹出两个框,一个是我们的控件视图,一个是属性。为控件视图调整适当的窗体大小,然后关闭。
4)软件会自动帮你在<BODY>和</BODY>之间添加上相应代码,点击工具栏上的保存按钮,将网页保存到所需位置。我就直接保存到桌面上。
5)到此,测试网页也编辑完成,用IE打开测试网页,允许阻止的内容,看看,控件是不是成功显示啦~
好了,一个简单的ActiveX控件就已全部完成,这是一个最基本的例子,希望对初学ActiveX控件的同学有所帮助!
P.S.随便说说Debug和Release的区别吧:
两者都是用于编译,不过两者所依赖的库不同,用处也有区别,具体说来:
Debug我们一般叫调试,编译的结果会包含调试信息,它会有相应的宏,而且不做任何优化,所以编译出来的.ocx或.exe文件会大一点。一般开发者在开发过程中会使用Debug调试。
Release则通常称为发布版本,它不保存调试信息,而且会进行优化,所以编译出来的.ocx或.exe文件会小一点,以期达到代码最小和速度最优。一般是最终完成后发布的版本,为用户使用,一般客户不允许在发布版本上进行调试。
【VS开发】 自己编写一个简单的ActiveX控件——详尽教程的更多相关文章
- COM组件开发实践(八)---多线程ActiveX控件和自动调整ActiveX控件大小(下)
源代码下载:MyActiveX20081229.rar 声明:本文代码基于CodeProject的文章<A Complete ActiveX Web Control Tutorial>修改 ...
- 调用ocx ActiveX控件详解(做一个简单的ocx控件)
背景 最近做的项目都和插件有关,就是在页面中调用插件的方法,然后进行操作. 插件就是ocx ActiveX控件,具体的说明可以自己去了解一下,在这里就不做赘述. 具体调用方式很简单: 1.在页面中写一 ...
- COM组件开发实践(七)---多线程ActiveX控件和自动调整ActiveX控件大小(上)
声明:本文代码基于CodeProject的文章<A Complete ActiveX Web Control Tutorial>修改而来,因此同样遵循Code Project Open L ...
- 用ATL写简单的ActiveX控件 .
我正在做的项目需要用读卡器来读数据,由于系统是B/S架构的所以只能把读卡器的驱动封装成一个无界面的ActiveX控件,这样web页面中的js代码才能访问读卡器其实做起来也挺简单的,我用的环境是VS20 ...
- 【Android】10.0 UI开发——如何编写程序界面、常见控件的使用
************************ 转载请注明出处:https://www.cnblogs.com/xiaofu007/p/10331880.html ***************** ...
- 在iOS上实现一个简单的日历控件
http://blog.csdn.net/jasonblog/article/details/21977481 近期需要写一个交互有点DT的日历控件,具体交互细节这里略过不表. 不过再怎么复杂的控件, ...
- 一个简单的Loading控件
实现效果如下: 使用方法: 在layout文件中添加以下代码: <com.example.jack.ui.widget.RingLoading android:layout_width=&quo ...
- Delphi 编写ActiveX控件(OCX控件)的知识和样例(有详细步骤)
一.ActiveX应用情况简介: ActiveX控件也就是一般所说的OCX控件,它是 ActiveX技术的一部分.ActiveX是微软公司推出的基于组件对象模型COM的技术,包括对Windows 32 ...
- [转]C#开发ActiveX控件,.NET开发OCX控件案例
引自:百度 http://hi.baidu.com/yanzuoguang/blog/item/fe11974edf52873aaec3ab42.html 讲下什么是ActiveX控件,到底有什么 ...
随机推荐
- DevExpress ASP.NET Core v19.1版本亮点:数据网格和树列表
行业领先的.NET界面控件DevExpress 发布了v19.1版本,本文将以系列文章的方式为大家介绍DevExpress ASP.NET Core Controls v19.1中新增的一些控件及增强 ...
- Bash快捷操作
编辑命令 Ctrl + a :移到命令行首 Ctrl + e :移到命令行尾 Ctrl + f :按字符前移(右向) Ctrl + b :按字符后移(左向) Alt + f :按单词前移(右向) Al ...
- 阅读之Java多线程
Java多线程 用多线程只有一个目的,就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现. 多线程:指的是这个程序(一个进程)运行时产生了不止一个线程 并行与并发: 并行:多个cpu ...
- [转]C++引用
引用的概念 引用:就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样. 引用的声明方法:类型标识符 &引用名=目标变量名: 如下:定义引用ra,它是变量a的引用,即别名. i ...
- 21. ClustrixDB 识别平台限制
本节描述集群性能上潜在的限制平台因素,如何度量集群是否接近或超过这些限制,以及纠正这些条件的可用选项.“平台因素”指的是硬件资源,如CPU.内存.磁盘和网络I/O子系统.有关潜在的软件相关因素,请参见 ...
- TTTTTTTTTTTTTT poj 1127 Jack Straws 线段相交+并查集
题意: 有n个木棍,给出木棍的两个端点的x,y坐标,判断其中某两个线段是否连通(可通过其他线段连通) #include <iostream> #include <cstdio> ...
- BeanCopier对象复制学习
BeanCopier是Cglib包中的一个类,用于对象的复制. 注意:目标对象必须先实例化 而且对象必须要有setter方法 初始化例子: BeanCopier copier = BeanCop ...
- 生成json文件写入本地
public class Json { public static void main(String[] args) { String fullPath = null; //例如:fullPath=& ...
- Linux常用命令及操作(第二弹)
Ctrl l清屏 Ctrl d关闭终端 Ctrl Alt T打开终端 pwd 查看当前的目录 Shift Ctrl C复制 Shift Ctrl V粘贴 Shift Ctrl N打开新的终端 F11 ...
- 牛客 19-5-3 QAQ
#include<iostream> #include<cstring> using namespace std; typedef long long LL; int main ...