用VS2019开发一个简单的ActiveX(MFC)控件

一、创建控件

  1. 管理员身份运行VS2019
    用VS2019开发一个简单的ActiveX(MFC)控件_第1张图片
  2. 创建一个新的项目:模板为 MFC ActiveX 控件

用VS2019开发一个简单的ActiveX(MFC)控件_第2张图片

  1. 创建新项目:testActiveX
    用VS2019开发一个简单的ActiveX(MFC)控件_第3张图片
  2. 直接下一步
    用VS2019开发一个简单的ActiveX(MFC)控件_第4张图片
  3. 勾选:在“插入对象”对话框中可用
    用VS2019开发一个简单的ActiveX(MFC)控件_第5张图片
  4. 打开项目属性
    用VS2019开发一个简单的ActiveX(MFC)控件_第6张图片
  5. 修改项目属性:MFC的使用修改为【在静态库中使用MFC】
    用VS2019开发一个简单的ActiveX(MFC)控件_第7张图片

二、添加界面显示

  1. 在 资源视图 中插入对话框
    用VS2019开发一个简单的ActiveX(MFC)控件_第8张图片
  2. delete 掉 【确定】【取消】,然后修改對話框屬性:
    Border改為None,
    Control改為Ture,
    ID改為IDD_MAIN_DIALOG
    Style改為Child
    System改為False
    Visible改為True
    用VS2019开发一个简单的ActiveX(MFC)控件_第9张图片
    用VS2019开发一个简单的ActiveX(MFC)控件_第10张图片
  3. 拖拽一个 Edit Control 过来,调整好自己喜欢的大小
    用VS2019开发一个简单的ActiveX(MFC)控件_第11张图片
  4. 双击对话框:Dialog,为该对话框添加一个类
    用VS2019开发一个简单的ActiveX(MFC)控件_第12张图片
  5. 在testActiveXCtrl.h中添加:CMainDlg m_ctrldlg
    用VS2019开发一个简单的ActiveX(MFC)控件_第13张图片
  6. 修改 onDraw 如下图
    用VS2019开发一个简单的ActiveX(MFC)控件_第14张图片
  7. 类视图下面,点击类向导(Z)
    用VS2019开发一个简单的ActiveX(MFC)控件_第15张图片
  8. 在”消息“栏下选择 WM_CREATE,然后点击右边”添加处理程序“。注意图中的其它设置。
    用VS2019开发一个简单的ActiveX(MFC)控件_第16张图片
  9. vs2019自动添加的代码还需要手动添加一条:m_ctrldlg.Create(IDD_MAIN_DIALOG, this);
    用VS2019开发一个简单的ActiveX(MFC)控件_第17张图片
  10. 至此为止,基本框架改动处一共有:
    testActiveX.h 一处 #include “resource.h”
    testActiveXCtrl.h 三处
    ①#include “CMainDlg.h”
    ②CMainDlg m_ctrldlg;
    ③afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
    testActiveXCtrl.cpp 三处
    ①ON_WM_CREATE()
    ②// TODO: 用您自己的绘图代码替换下面的代码。
    //pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
    //pdc->Ellipse(rcBounds);
    m_ctrldlg.MoveWindow(rcBounds, TRUE);
    ③m_ctrldlg.Create(IDD_MAIN_DIALOG, this);

可以点击重新生成解决方案了,如果未报错,说明ActiveX控件已在本机中

  1. 最后,找到一个ID,在testActiveX.idl文件的最后面,uuid()
    用VS2019开发一个简单的ActiveX(MFC)控件_第18张图片
    将该ID,替换下面htm文件中的classid
<HEAD>
	<TITLE>Test ActiveXTITLE>
HEAD> <OBJECT ID="testActiveXCtrl" WIDTH=528 HEIGHT=77 classid="CLSID:f3a0202e-17ce-4558-9b06-3144d9021849">
	<PARAM NAME="_Version" VALUE="65536">
	<PARAM NAME="_ExtentX" VALUE="12806">
	<PARAM NAME="_ExtentY" VALUE="1747">
	<PARAM NAME="_StockProps" VALUE="0">
OBJECT>

HTML>
  1. 然后用IE浏览器打开该htm文件,就可以看到ActiveX控件的提示了,如果成功了,将会是这样
    用VS2019开发一个简单的ActiveX(MFC)控件_第19张图片

三、添加接口及web调用

  1. 在类视图添加方法
    用VS2019开发一个简单的ActiveX(MFC)控件_第20张图片
  2. 参数设置如下
    用VS2019开发一个简单的ActiveX(MFC)控件_第21张图片
  3. 手动添加的代码
    CMainDlg.h 添加:
LONG SetParam(LPCTSTR lpParam);

testActiveXCtrl.h 添加:

protected:
	//LONG SetCrtlParam(BSTR param);
	LONG SetCrtlParam(LPCTSTR param);

CMainDlg.cpp 添加

LONG CMainDlg::SetParam(LPCTSTR lpParam) {
	CString strParam(lpParam);
	SetDlgItemText(IDC_EDIT_OUTPUT, _T("ActiveX处理后为:") + strParam);
	return 1;
}

testActiveXCtrl.cpp中添加

//LONG CtestActiveXCtrl::SetCrtlParam(BSTR param)
//{
//	AFX_MANAGE_STATE(AfxGetStaticModuleState());
//
//	// TODO: 在此处添加分派处理程序代码
//	m_ctrldlg.SetParam(param);
//
//	return 0;
//}

LONG CtestActiveXCtrl::SetCrtlParam(LPCTSTR param)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	// TODO: 在此处添加分派处理程序代码
	m_ctrldlg.SetParam(param);

	return 0;
}
  1. 至此,重写生成解决方案即可!测试html如下。
<HEAD>
	<TITLE>Test ActiveXTITLE>
HEAD>

<BODY>
	<input type="button" value="接口测试" id="btnOK" onclick="SetParam();">input>
BODY><OBJECT ID="testActiveXCtrl" WIDTH=528 HEIGHT=66 classid="CLSID:f3a0202e-17ce-4558-9b06-3144d9021849">
	<PARAM NAME="_Version" VALUE="65536">
	<PARAM NAME="_ExtentX" VALUE="12806">
	<PARAM NAME="_ExtentY" VALUE="1747">
	<PARAM NAME="_StockProps" VALUE="0">
OBJECT>
<script language="javascript">
	function SetParam() {
		var sum = testActiveXCtrl.SetCrtlParam("Hello, ActiveX!");
		alert(sum);
	}
script>

HTML>

啊呀,测试了半天为啥不对,原来 ctrl 错写成了 ctrl,又掉了几根头发。。。。

  1. 测试成功这个样子
    用VS2019开发一个简单的ActiveX(MFC)控件_第22张图片

你可能感兴趣的:(学习,ActiveX控件,dll,ocx,activex,Dispatch)