Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1088520
  • 博文数量: 132
  • 博客积分: 612
  • 博客等级: 中士
  • 技术积分: 1389
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-14 16:06
文章分类

全部博文(132)

文章存档

2015年(2)

2014年(55)

2013年(53)

2012年(2)

2011年(20)

分类: Windows平台

2013-11-26 17:20:48

这位兄弟写的很清楚,就喜欢这样有图有文字的,看着省事也清楚,直接转了,连接路径 http://3140618.blog.163.com/blog/static/745179720111016104548355/

Activexcom组件的一种,取代ole的一部分。据说是microsoftsun公司对抗出来的产物,但是无从查证。 

一、如何创建activex控件

1.创建工程
File / New / Projects / MFC ActiveX ControlWizard
,工程名称输入OnlineOcx(自定义)。

编写、使用activex控件 - adlong - adlong

 

点击OK进入下一画面,“Would you like help files to be generated?”选择“No help files”

编写、使用activex控件 - adlong - adlong

 
点击Next进入下一画面,点击Finish完成。

编写、使用activex控件 - adlong - adlong

 

ClassView中的结构如图:

编写、使用activex控件 - adlong - adlong

 

2 添加自定义的方法
ClassView中点选工程名称,CTRL+W启动ClassWizard,或者File/ClassWizard启动ClassWizard,选择Automation分页,如下图:

编写、使用activex控件 - adlong - adlong

 

在该页面中可以添加方法或属性。
下面添加一个方法,如图:
编写、使用activex控件 - adlong - adlong

 

External name中输入方法名,编译器自动添加到Internal name中,其他选项的填写方式参考图片,Parammeter list中的Type可以在下拉列表中选择。点击OK完成添加,新增的方法名称显示在External names中,如图:
编写、使用activex控件 - adlong - adlong

 

点击OK完成。

编译器自动添加的内容如下:
OnlineOcxCtl.h
文件中:
//{{AFX_DISPATCH(COnlineOcxCtrl)
afx_msg long testFunc(short FAR* cParam1, short FAR* cParam2, long FAR* total, long FAR* arr);
//}}AFX_DISPATCH

//{{AFX_DISP_ID(COnlineOcxCtrl)
dispidTestFunc = 1L,
//}}AFX_DISP_ID

 

OnlineOcxCtl.cpp文件中:
BEGIN_DISPATCH_MAP(COnlineOcxCtrl, COleControl)
//{{AFX_DISPATCH_MAP(COnlineOcxCtrl)
DISP_FUNCTION(COnlineOcxCtrl, "testFunc", testFunc, VT_I4, VTS_PI2 VTS_PI2 VTS_PI4 VTS_PI4)
//}}AFX_DISPATCH_MAP
DISP_FUNCTION_ID(COnlineOcxCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE)
END_DISPATCH_MAP()

 

// 下面即为函数体,可以填写要实现的内容
long COnlineOcxCtrl::testFunc(short FAR* cParam1, short FAR* cParam2, long FAR* total, long FAR* arr)
{
// TODO: Add your dispatch handler code here

return 0;
}

// 添加代码如下所示,在调用该函数时可用来验证
long COnlineOcxCtrl::testFunc(short FAR* cParam1, short FAR* cParam2, long FAR* total, long FAR* arr)
{
// TODO: Add your dispatch handler code here
//////////////////////////////////////////////////////////////////////////
CString szTmp = _T("");
szTmp.Format("cParam1=%s, cParam2=%s", cParam1, cParam2);
AfxMessageBox(szTmp);

*total = 123;
for (int i=0; i<10; i++)
{
   arr[i] = (i+1)*(i+1);
}
//////////////////////////////////////////////////////////////////////////
return 0;
}

添加一个属性的话,会生成一个On***函数,同时生成一个Set***控件接口。即,使用控件的程序使用Set***的话,控件会用On***函数去响应这个事件。


3
编译
编译工程,编译器自动注册ocx。生成的ocx控件可以通过VC自带的工具测试:「开始」菜单\程序\Microsoft Visual C++ 6.0\Microsoft Visual C++ 6.0 Tools\ActiveX Control Test Container

 

二、VC程序如何调用activex

1.首次使用ocx,用命令regsvr32 ocx文件路径,注册ocx

2.菜单Project / Add to Project / Components and Controls 打开如下窗口:

编写、使用activex控件 - adlong - adlong

 

选择目录“Registered ActiveX Controls”,刚刚编译生成的OnlineOcx已经在列表中了,如图:
编写、使用activex控件 - adlong - adlong
 

3.添加组件
新建一个基于窗体的Exe工程,在窗体上点击右键/Insert ActiveX Control,打开一个窗口,选择OnlineOcx控件:

编写、使用activex控件 - adlong - adlong
点击OK,将控件添加到工程中。如下图:
编写、使用activex控件 - adlong - adlong
 
在窗体上CTRL+W打开ClassWizard,选择“Member Variables”分页,添加空间对应的成员变量,弹出如下窗口:
编写、使用activex控件 - adlong - adlong
 
点击确定按钮后出现如下窗口:
编写、使用activex控件 - adlong - adlong
使用默认选项即可,点击OK后,添加变量的名称为m_myOcx。点击OK按钮返回窗体界面。打开FileView分页,新增了两个文件:onlineocx.cpponlineocx.h
 
“test”按钮添加单击事件,并添加如下代码:
void CTttDlg::OnButtonTest()
{
// TODO: Add your control notification handler code here
char cParam1[] = "this is param1. ";
char cParam2[50] = "this is param2. ";
int total = 0;
int iArr[10] = {0};

int iReturn = (int)m_myOcx.testFunc((short *)cParam1, (short *)cParam2, (long *)&total, (long*)iArr);
}

设置断点,调试运行,先弹出如下窗口:

编写、使用activex控件 - adlong - adlong
查看内存,total的值被修改为123iArr数组的值如下图:
编写、使用activex控件 - adlong - adlong
  

注意事项:
a.
在建立了测试工程后,若需要修改ocx的工程,编译时会提示文件被占用,把测试工程关掉,稍等几秒即可。
b. 删除ocx,删除导入的h、cpp文件,和工程文件*.dsw、*.clw。


阅读(1027) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~