MFC的WebBrowser控件 C++与JavaScript之间数据交互传递

来源:互联网 发布:java静态代理内存分析 编辑:程序博客网 时间:2024/05/19 14:53

-----------------------------------------------------------------------------------------------------------------------------------------------

     最近开发MFC程序,用WebBrowser控件调用百度地图JavaScript API来展示轨迹,后台通过C++编写相关逻辑代码。

     VC++和JavaScript之间的数据传递交互是一个重要的问题!

     因此,本文主要来通过案例介绍上诉两者数据传递。

     源码地址:《源代码——MFC的WebBrowser控件C++与JavaScript之间的数据交互传递》

-----------------------------------------------------------------------------------------------------------------------------------------------


一、预备知识

Step1:在了解VC++与JavaScript数据交互之前,首先你要学会使用WebBrowser控件来调用百度地图API!

MFC使用WebBrowser控件调用百度地图JavaScript API简单案例! 下载地址如下:(里面有使用说明)

http://download.csdn.net/detail/to_baidu/9825890

Step2:MFC中使用WebBrowser.Navigate()方法调用本地的.htm文件!

调用方法参看链接:http://blog.csdn.net/to_baidu/article/details/70787825


二、VC++传递数据给前端网页

其实在“预备知识的Step1”的简单案例中已经包含了VC++传递两个变量到JavaScript的方法:即调用CWebPage类的CallJScript()函数。

此处,在上面的基础上添加功能——将返回值传递给VC++!

实现方案如下:

1、在对话框或者视图的实现文件中,加入#include "WebPage.h",在按钮的响应函数中就可以调用JavaScript函数了,具体代码如下:

void CGeoDemoDlg::OnShow(){// TODO: 在此添加控件通知处理程序代码UpdateData(TRUE);//将屏幕上控件中的数据交换到变量中CWebPage cwp;cwp.SetDocument(m_myweb.get_Document());const CString funcName("justmarkfun");//justmarkfun为前端JS函数名CComVariant varResult;//存放调用JavaScript函数返回的返回值,但此处无用//这里m_JD和m_WD是与编辑框控件的两个CString类型变量,传入经度纬度值//这里参数的个数要与javascript函数justmakefun函数的个数相同,而且顺序要保持一致cwp.CallJScript(funcName,m_JD,m_WD,&varResult);//调用JS中的函数justmarkfun(),并传递两个参数m_JD和m_WD}

2、在前端htm文件中的script标签中定义对应的函数,具体代码如下:

<script type="text/javascript">    //显示该点    function justmarkfun(JD, WD) {        map.clearOverlays();//清理之前的标注        var point=new BMap.Point(JD, WD);//创建该点        var marker1 = new BMap.Marker(point);//创建标注        window.map.addOverlay(marker1);//将标注添加到地图中        map.centerAndZoom(point, 12);//以该点为中心展示地图    }</script>



三、前端网页将值传递给VC++后端

1、在对话框或者视图的实现文件中,加入#include "WebPage.h",在按钮的响应函数中调用JavaScript函数,通过varResult类来获取返回值,并做相应类型转换的处理。具体代码如下:

void CGeoDemoDlg::OnClickedGetdataFromHTML(){// TODO: 在此添加控件通知处理程序代码CWebPage WebPage;CComVariant varResult;//存放调用JavaScript函数返回的返回值CString szTaskGPS;//字符串变量,用于记录编辑框中的GPSWebPage.SetDocument(m_myweb.get_Document());WebPage.CallJScript("GetGPS", &varResult);//GetGPS:js函数名,用于从前端获取经纬度的值szTaskGPS = (BSTR)varResult.pbstrVal;//存放经纬度返回值,从前端htm中js函数获得;要进行类型转换MessageBox(_T("从前台获取到当前的经纬度信息为:") + szTaskGPS,_T("提示!"),MB_ICONINFORMATION);AfxExtractSubString(m_JD2,szTaskGPS,0,',');//VC中AfxExtractSubString函数用于分割字符串,详情可网上百度AfxExtractSubString(m_WD2,szTaskGPS,1,',');UpdateData(FALSE);//将变量中的数据交换到屏幕上控件中}

2、在前端htm文件中的script标签中定义对应的函数,具体代码如下:

<script type="text/javascript">    //单击获取点击的经纬度    map.addEventListener("click", function (e) {        map.clearOverlays(); //清理之前的标注        document.getElementById("gps").value = e.point.lng + ',' + e.point.lat;        var marker = new BMap.Marker(e.point);        map.addOverlay(marker); //将标注添加到地图中    });    //返回页面内容中的文本编辑框gps中的值    function GetGPS() {        return document.getElementById("gps").value;    }</script>


注意:

1、上面JavaScript中的clearOverlays()、addOverlay()等函数是百度地图API中的函数,可详情见百度地图API官网。

2、上诉实现不用管CWebPage类起什么作用,直接用就行,因为CallJScript()函数是CWebPage类的成员函数。

2、如果想了解VC++与JavaScript前端数据交互的详细内容,请搜索有关“COM组件自动化”、“IDispatch接口”的文章。




1 0
原创粉丝点击