没有合适的资源?快使用搜索试试~ 我知道了~
首页关于MFC对话框与静态HTML交互
关于MFC对话框与静态HTML交互
4星 · 超过85%的资源 需积分: 47 93 下载量 169 浏览量
更新于2023-06-08
评论 3
收藏 78KB DOC 举报
MFC对话框与静态HTML交互,关于MFC如何与WebBrowser加载的HTML进行交互的问题。。
资源详情
资源评论
资源推荐
关于 MFC 如何与 WebBrowser 加载的 HTML 进行交互的问题
前言
1、有一张图片没有 GPS 信息,要根据照片人的记忆,点击地图上的某一个地理位置,然
后在对话框界面上显示出当前点击的经纬度;
2、在 MFC 对话框中选择了一个照片,MFC 程序读取这个照片的经纬度信息,然后立刻要
在加载的 MAP 页面进行标注;
第 1 个需求,要涉及 WebBrowser 加载的页面传递参数给对话框;
第 2 个需求,要涉及到对话框传递经纬度信息给 WebBrowser 加载的页面。
关于 HT ML 如何调用 C++代码的实现
基本思路简介
那么在涉及的页面与对话框进行数据交互,那么加载一个纯粹的地图网址,无法达到数据
进行交互的功能。因此考虑 WebBrowser 加载一个本地的 HTML 页面,然后在页面中利用
JavaScript 中的 window.external.xxxxx()来调用浏览器额外提供的 xxxxx()。
而 在 MFC 对 话 框 中 , 我 们 可 以 创 建 一 个 继 承 于 COleControlSite 的 派 生 类
CCustomControlSite。COleControlSite 是用来控制站点对象,可以一对一直接站点承载 ActiveX
控件的对象。在派生类 CCustomControlSite 中实现 COleControlSite::XDocHostUIHandler::GetExternal
这 个 虚 函 数 , 来 获 取 JS 中 调 用 window.external 的 消 息 , 也 就 是 说 只 要 HTML 调 用
window.external 时,CCustomControlSite 可以获取到这个消息。
继承于 COccManager 的派生类 CCustomOccManager。COccManager 是一个 MFC 进程中的
所有控件容器的主控制器,并负责处理 out COleControlSite 和 COleControlContainer 对象的
指针。COccManager 还具有实现消息处理功能所需的 ActiveX 控件容器的 IsDialogMessage
方法。 你可以理解为,它通过重写 CreateSite 这个虚函数,用来创建 CCustomControlSite,然后将
实例出来的对象地址告诉了系统,那么系统就会自动接收 HTML 调用 window.external 时的消息,然
后进行处理。
另外,还要实现一个 IDispatch 接口,这个接口用来获取 window.external 的具体的函数内容,
并且根据函数名或者内容来进行具体的判断并作相应的处理。这样来实现 HTML 调用 C++
中的代码。
实现步骤
那么下面是讲第 1 个需求如何进行具体实现:
第 1 步,要在工程中添加一个继承于 COleControlSite 的实现类 CCustomControlSite,然后将其中相
应的虚函数进行实现。添加的话,添加一个 C++类,然后将基类名填写为 COleControlSite。
第 2 步,添加一个继承于 COccManager 的派生类 CCustomOccManager,然后重写 CreateSite 函数,创建一
个 CCustomControlSite 实例化对象,并返回这个实例化对象。
COleControlSite* CreateSite(COleControlContainer* pCtrlCont)
{
CCustomControlSite* pSite = NULL;
pSite = new CCustomControlSite(pCtrlCont);
return pSite;
}
第 3 步,添加一个实现 IDispatch 接口的派生类 CImpIDispatch,将接口相应的函数进行实现,参考示
例。
第 4 步,在对话框程序的 APP 类中,定义一个成员变量
public:
CImpIDispatch* m_pCustDisp;
然后在初始化函数里面,添加一个COM初始化代码,以及对刚刚添加的成员变量进行一个实例化。
BOOL CMFCHtmlApp::InitInstance()
{
AfxEnableControlContainer();
CoInitialize(NULL);
m_pCustDisp = new CImpIDispatch;
...........
}
另外对 App 类添加一个销毁处理函数 ExitInstance,并添加刚刚实例化成员变量的销毁代码,如下
int CMFCHtmlApp::ExitInstance()
{
// TODO: Add your specialized code here and/or call the base class
if(m_pCustDisp)
{
delete m_pCustDisp;
m_pCustDisp = NULL;
}
CoUninitialize();
return CWinApp::ExitInstance();
}
第5步,界面添加一个WebBrowser控件,并为这个控件绑定一个类型为CWebBrowser2的变量,具体的参考
步骤参考http://blog.csdn.net/schoolers/article/details/6791379
第 6 步,在 CWebBrowser 添加 CCustomOccManager 的引用
class CCustomOccManager;
并定义一个 CCustomOccManager 成员变量指针
private:
CCustomOccManager* m_pCustOccMgr;
并在构造与析构函数中添加如下代码,创建并销毁一个CCustomOccManager对象。
CWebBrowser2::CWebBrowser2()
{
m_pCustOccMgr= NULL;
m_pCustOccMgr = new CCustomOccManager;
AfxEnableControlContainer(m_pCustOccMgr);
}
CWebBrowser2::~CWebBrowser2()
{
AfxEnableControlContainer();
delete m_pCustOccMgr;
m_pCustOccMgr = NULL;
}
结合 CCustomOccManager 中 CreateSite 重写函数,在构造函数中实例化 CCustomOccManager 对象,等同
于进行了一个注册,告诉系统告诉它 CCustomControlSite 类是与 WebBrowser 加载页面是一一对应的,那
么 WebBrowser 加 载 的 页 面 调 用 window.external.xxxxx() , 将 会 被
CCustomControlSite::XDocHostUIHandler::GetExternal 来进行获取。
第 7 步,在 CCustomControlSite.h 中添加对于 CImpIDispatch 的引用 。
#include "ImpIDispatch.h"
并重写 CCustomControlSite::XDocHostUIHandler::GetExternal
STDMETHODIMP CCustomControlSite::XDocHostUIHandler::GetExternal(
/* [out] */ IDispatch __RPC_FAR*__RPC_FAR* ppDispatch)
{
// return the IDispatch we have for extending the object Model
IDispatch* pDisp = (IDispatch*)theApp.m_pCustDisp;
pDisp->AddRef();
*ppDispatch = pDisp;
return S_OK;
}
剩余10页未读,继续阅读
一寸蔚蓝
- 粉丝: 2
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论5