ActiveX组件开发和使用
来源:互联网 发布:淘宝网10至20包邮 编辑:程序博客网 时间:2024/05/22 13:14
ActiveX控件的概念 (COM组件的应用)
1 什么是ActiveX控件
基于COM组件技术的,使用与一般控件一样方便。与一般控件的区别是,它可以被任何支持COM标准的计算机程序使用。
2 什么是COM组件
组件实现了某种功能的一些小的二进制文件,通过接口对外提供服务。
一个项目生成一个exe文件
一个项目由 一个或者多个exe文件 + 一个或者多个组件。组件与组件直接通过接口交互。有更好的复用性和可维护性。
3 什么是接口?
C 语言 - 接口就是函数
C++语言 - 接口就是公有的成员函数
COM组件 - 接口就是一组纯虚函数的集合(纯虚类)。因为纯虚函数只有声明没有实现,所以,接口是稳定的。
void sort (参数) = 0;
ActiveX控件的开发、注册、测试和使用
1 了解微软提供的ActiveX控件的测试工具
ActiveX Control Test Container
ActiveX控件的开发测试包括控件的 : 事件、属性、方法
2 使用MFC向导开发ActiveX控件
2.1 向导生成的接口和类的介绍
第一个接口 - 添加属性和方法
第二个接口 - 添加事件。
App - 应用程序类
Ctrl - 控件类,包含了各种属性、方法的实现。另外,控件的外观在OnDraw()函数中完成。
PropPage - 属性页类,添加控件的属性设置
这里将开发一个求两个数的最大公约数的组件
运行如下:
新建一个工程,选择"MFC ActiveX ControlWizard",工程建立完毕后
选中工程的第一个接口通过右键选择"Addd Method"添加一个方法(函数)
函数原型:void SetNumber (int m_num1, int m_num2), 主要用来接受用户传入(通过调用我们提供的该函数接口)的两个计算数据
具体操作:
添加完毕后会发现在第一个接口中以及在我们的Ctrl类中都出现了该函数, 接口中的函数数对外提供服务,Ctrl中的函数需要我们去实现。
接着为Ctrl类添加两个成员变量用以接受用户传入的计算数:
int m_a;int m_b;
然后在第一个接口上右键选择Add Property , 这里添加一个名为Direction 的BOOL类型的变量,用来控制结果小球的显示位置(上方/下方)
添加完Direction属性后会发现Ctrl类中多了一个OnDirectionChange, 当外部通过Direction(PropPut)设置Direction变量的值时将触发该函数的调用
void CActiveXMcdCtrl::OnDirectionChanged() {// TODO: Add notification handler code // 重绘控件,重新计算Invalidate ();SetModifiedFlag();}
然后在Ctrl类的构造函数中对它们及控件的大小进行初始化:
CActiveXMyMcdCtrl::CActiveXMyMcdCtrl(){InitializeIIDs(&IID_DActiveXMyMcd, &IID_DActiveXMyMcdEvents);// TODO: Initialize your control's instance data here.// 设置控件的初始大小SetInitialSize (230, 230);m_a = 16;m_b = 12; m_direction = FALSE;// 控制结果球的显示位置}接下来回到Ctrl类中实现SetNumber方法。
void CActiveXMyMcdCtrl::SetNumber(long m_num1, long m_num2) {// TODO: Add your dispatch handler code herem_a = m_num1;m_b = m_num2; // 引发控件重绘调用我们的MCd函数结算结果并显示 Invalidate (TRUE);}来到Ctrl的OnDraw函数开始绘制我们的控件:
首先去掉默认的绘制代码,然后添加我们的绘制代码:
void CActiveXMcdCtrl::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);// 设置控件的背景颜色CBrush brush (RGB (255, 255, 0));pdc->FillRect (&rcBounds, &brush);// 绘制3个圆// 设置圆的背景色CBrush brush2 (RGB (0,0,0));// 设置圆心位置POINT p1 = {40, 120};POINT p2 = {190, p1.y};POINT p3 = {(p1.x + p2.x) / 2 , m_direction ? p1.y - 50 : p1.y + 50};// 设置圆的半径int radious = 15;// 画圆CBrush *pOldBrush = pdc->SelectObject (&brush2);pdc->Ellipse (p1.x - radious, p1.y - radious, p1.x + radious, p1.y + radious);pdc->Ellipse (p2.x - radious, p2.y - radious, p2.x + radious, p2.y + radious);pdc->Ellipse (p3.x - radious, p3.y - radious, p3.x + radious, p3.y + radious);// 连接线pdc->MoveTo (p1);pdc->LineTo (p3);pdc->LineTo (p2);// 设置字体的颜色、对齐方式、背景透明pdc->SetTextColor (RGB (255,255,255));pdc->SetTextAlign (TA_CENTER);pdc->SetBkMode (TRANSPARENT);// 在圆中写入数值CString strMsg;strMsg.Format ("%d", m_a);pdc->TextOut (p1.x, p1.y - 9, strMsg);strMsg.Format ("%d", m_b);pdc->TextOut (p2.x, p2.y - 9, strMsg);strMsg.Format ("%d", Mcd (m_a, m_b));pdc->TextOut (p3.x, p3.y - 9, strMsg); pdc->SelectObject (pOldBrush);brush.DeleteObject ();brush2.DeleteObject ();}在Ctrl类中添加求最小公约数的函数及实现:
int CActiveXMyMcdCtrl::Mcd(int a, int b){if (b == 0) return a;return Mcd(b, a%b);}
最后在第二个接口上右键选择:Add Event就可以为控件添加消息了(事件),控件的消息分为:Stock(库存的) 和 Custom(自定义的)
添加库存的消息选择Stock后,在External name:组合框中选择自己感兴趣的事件点击OK即可, 注意,这里的消息是我们的控件发消息给控件的使用者,也就是说由控件的使用者处理我们的控件消息
这里我添加一个自定义的消息MyMsg,添加完毕后发现在第二个控件中出现事件的接口,在Ctrl类中出现函数,但是这个消息需要由我们自己发送:
那么这里为Ctrl类添加一个消息处理:WM_LBUTTONDOWN, 就是当左键按下触发我们自定义的消息:
void CActiveXMyMcdCtrl::OnLButtonDown(UINT nFlags, CPoint point) {// TODO: Add your message handler code here and/or call defaultFireMyMsg ();COleControl::OnLButtonDown(nFlags, point);}
注册和卸载ActiveX控件:
Win+R :
regsvr32 "组件所在的文件路径" 注册组件
regsvr32 /u "组件所在的文件路径" 卸载组件
注: Winsta及以上系统环境下需要以管理员省份运行该命令
ActiveX控件的测试: 事件、属性、方法
编译连接之后: Tools-->Register Contrl
注册成功之后: Tools-->ActiveX Contrl Test Container
这样就打开了微软提供给我们专门用来测试ActiveX控件的容器, 在客户区右键: 选择Insert New Contrl ,选择我们自己编写的ActiveX控件
测试方法: Control-->Invoke Methods... --->这里在弹出的对话框中选择:SetNumber (Method),设置完两个参数的值后点击Invoke就可以看到结果了
测试属性: Control-->Invoke Methods... --->这里在弹出的对话框中选择:Direction(PropPut),输入一个数值后Set Value,然后Invoke就可以看到效果了
ActiveX控件的使用:
新建一个基于对话框的程序,在对话框资源上右键选择:Insert ActiveX Control, 选择我们的控件
Ctrl+W使用类向导为控件绑定成员变量。在绑定时,提示添加控件的包装类,添加即可,然后就可以像使用一般控件一样使用ActiveX控件了。
void CUseMcdDlg::OnBtnCompute() {// TODO: Add your control notification handler code hereUpdateData ();m_wndMcd.SetNumber (m_num1, m_num2);}void CUseMcdDlg::OnBtnSetdir() {// TODO: Add your control notification handler code herem_wndMcd.SetDirection (! m_wndMcd.GetDirection ());}void CUseMcdDlg::OnBtnAbout() {// TODO: Add your control notification handler code herem_wndMcd.AboutBox ();}
在html中使用控件:
<html><head><title>Mcd测试页面</title></head><body><form><p><object id="McdCtrl" classid="clsid:66C3EA36-7FFE-4674-9C0E-E8ECE3749F19" width="250" height="200"></object></p><p><input type="text" id="a" size="4" value="16"><input type="text" id="b" size="4" value="12"><input type="button" value="重新计算" name="Computer" onclick="C_onclick();"><input type="button" value="关于" name="About" onclick="A_onclick();"></p><input type="radio" id="c"name="Direction" >向上<input type="radio" id="d"name="Direction" >向下<input type="button" value="设置方向" name="Direct" onclick="D_onclick();"><script> function C_onclick() { document.all.McdCtrl.SetNumbers(document.all.a.value,document.all.b.value); } function A_onclick() { document.all.McdCtrl.AboutBox(); } function D_onclick() { document.all.McdCtrl.Direction=(document.all.c.checked?1:0); }</script></form></body></html>
其中的classid唯一标识我们在系统中注册的控件,双击第一个接口可以找到我们的控件ID,
- ActiveX组件开发和使用
- 如何使用C#开发“类ActiveX组件”
- Visual C#创建和使用ActiveX组件
- Visual C#创建和使用ActiveX组件
- C#创建和使用ActiveX组件
- Visual C#创建和使用ActiveX组件
- Visual C#创建和使用ActiveX组件
- Visual C#创建和使用ActiveX组件
- Visual C#创建和使用ActiveX组件
- Visual C#创建和使用ActiveX组件
- Visual C#创建和使用ActiveX组件
- Python开发Activex组件
- 使用ACTIVEX和DELPHI开发串口通讯
- 使用ACTIVEX和DELPHI开发串口通讯
- COM组件开发实践(八)---多线程ActiveX控件和自动调整ActiveX控件大小(下)
- COM组件开发实践(七)---多线程ActiveX控件和自动调整ActiveX控件大小(上)
- COM组件开发实践(七)---多线程ActiveX控件和自动调整ActiveX控件大小(上)
- COM组件开发实践(八)---多线程ActiveX控件和自动调整ActiveX控件大小(下)
- 最大权闭合子图的解法
- hdu 1171 Big Event
- Linux源码学习笔记:syscalls
- 一种快速的无监督的向量化方法做地标识别
- association 的使用
- ActiveX组件开发和使用
- HDU4920 Matrix multiplication (CPU cache对程序的影响)
- Python中的条件选择和循环语句
- rman configure命令
- mysql由浅入深视频-有高可用架构、调优、排错等
- const使用及问题总结
- 匹配一个2个相邻并且相同的字符
- LA 4329 Ping pong乒乓比赛【树状数组】
- 找朋友