当前位置: 代码迷 >> 综合 >> VS2015 MFCActiveX使用对话框调用另外一个ActiveX控件
  详细解决方案

VS2015 MFCActiveX使用对话框调用另外一个ActiveX控件

热度:21   发布时间:2023-11-24 19:45:48.0

MFCActiveX控件的用途广泛,生成的文件就是在网页编程里使用比较多的OCX控件,在网页的object标签里可以调用OCX控件。那么比如我想制作一个OCX控件,在控件里加载一个网页这种该如何实现了。熟悉MFC的应该知道,MFC里可以直接使用webbrowser这个ActiveX控件,使用webbrowser可以很方便的加载网页。下面讲解该如何实现这一功能。
首先使用vs2015,新建一个MFCActiveX工程。
在这里插入图片描述
改变工程的模式为Release模式,修改项目的属性,mfc的使用为在静态库中使用MFC。首先我们需要新建一个对话框,因为webbrowser控件必须要用容器装起来,因此需要新建一个对话框来装这个webbrowser控件。在资源视图里添加一个对话框。
在这里插入图片描述
修改对话框的属性Visible为True,Style为Child,Border为None,一定要注意将对话框的可见性为真,要不然加载的时候只会看到控件为一个圆形线,并删除对话框上的确定和取消按钮,在对话框上右键添加ActiveX控件,选择webbrowser控件。最终如下图所示:
在这里插入图片描述
我们先为对话框添加一个类,类名为CDialog1,然后右键对话框中的webbrowser控件,添加变量m_web,在类向导中添加对话框的初始化虚函数OnInitDialog(),
在这里插入图片描述
在初始化函数中添加webbrowser控件加载的网页:

BOOL CDialog1::OnInitDialog()
{CDialogEx::OnInitDialog();// TODO:  在此添加额外的初始化m_web.Navigate(L"https://www.baidu.com/", NULL, NULL, NULL, NULL);return TRUE;  // return TRUE unless you set the focus to a control// 异常: OCX 属性页应返回 FALSE
}

对话框类全部实现好了,接下来需要将这个对话框加载到自己制作的MFCActiveX控件里。在CMFCActiveXTestCtrl的.h文件里首先引入对话框的头文件
然后在public里新建对话框的变量:
CDialog1 m_dialog1;

#pragma once
//引入对话框头文件
#include"Dialog1.h"
`//并在类中定义对话框的变量:
public://定义对话框的变量CDialog1 m_dialog1;

然后在类向导中为CMFCActiveXTestCtrl添加两个消息函数OnCreate和OnSize这两个消息函数里添加相应加载对话框的代码:

int CMFCActiveXTestCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{if (COleControl::OnCreate(lpCreateStruct) == -1)return -1;// TODO:  在此添加您专用的创建代码m_dialog1.Create(IDD_DIALOG1, this);return 0;
}void CMFCActiveXTestCtrl::OnSize(UINT nType, int cx, int cy)
{COleControl::OnSize(nType, cx, cy);// TODO: 在此处添加消息处理程序代码RECT activeRect;GetClientRect(&activeRect);m_dialog1.MoveWindow(&activeRect);}

完成上面的步骤我们就将一个包含有ActiveX控件(webbrowser控件)的对话框嵌入到我们自己的ActiveX控件里了。如果这个时候你以为就大功告成了,那就错了。因为你会发现在调用这个自己创建的ActiveX控件时,无法显示内部嵌入的webbrowser控件。这是因为MFC ActiveX默认情况下不支持嵌入另外一个ActiveX控件,我们需要加这样一行代码。在CMFCActiveXTestApp 类的InitInstance()函数里添加控件包容器代码:

BOOL CMFCActiveXTestApp::InitInstance()
{BOOL bInit = COleControlModule::InitInstance();if (bInit){// TODO:  在此添加您自己的模块初始化代码。//添加控件包含器,不然在对话框中不能显示控件//添加控件包容器AfxEnableControlContainer();}return bInit;
}

我们注意到MFCActiveXTestLib有个类信息,这个ID就是OCX的调用ID,一会在网页中调用时需要用到这个数字。
在这里插入图片描述
我们编译这个工程,会自动生成一个ocx控件并自动注册,如果没有成功注册,可以自己手动注册,具体怎么注册去网上查。下来讲讲如何调用这个ActiveX也就是注册的OCX。我们新建一个html文件,文件里内容如下:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta charset="utf-8">
<title>OCX测试</title>
<script src="https://cdn.staticfile.org/jquery/2.0.0/jquery.min.js">
</script>
<script>
$(document).ready(function(){$("button").click(function(){myocx.lxStr='hello world';});
});
</script></head>
<body>
<button>点我</button>
<div  align="center">
<object id=myocx border=0 classid=CLSID:FC6E3C4A-EE76-441C-9B6E-25D0F0425800 width="500" height="300";>
</object>
</div>
</body>
</html>

网页中object中classid后面的数字就是自己创建的ocx控件的类信息后面的数字。
然后将这个html网页用IE打开,效果如下图所示:
在这里插入图片描述

在vs2010中有ActiveX控件测试容器也可以测试ocx。

资源下载地址:

https://download.csdn.net/download/qq_37781464/10862087

  相关解决方案