VC中的ChtmlDialog 和Javascript ,web进行交互
2011-07-11 15:31
337 查看
对于整个的交互过程不是很了解,在网上收罗了一大批资料,搞的云里雾里的。
最终还是把它做出来啦。献给和我一样奋斗在code前的人们。
javascript 中调用VC 中的类或方法大概有两种(我只做了第二种):
第一种是基于事件的模型,使用DHTML_EVENT_MAP()来实现,例如一个html界面的button被点击,可以使用 DHTML_EVENT_ONCLICK(BUTTONID,FuncHandle)的方式进行捕获。在FuncHandle的参数里面,可以获相应的控件句柄,便可以获取并操作控件的各种属性
第二种是基于com接口。使用BEGIN_DISPATCH_MAP将相应的函数接口暴露的javascript,javascript调用的时候就可以使用window.external.函数名进行调用。
这里我讲一下第二种方式的实现:
第一步:让CDHtmlDialog 对象支持自动化(这个具体什么叫自动化很复杂,这里就不说了,我也说不清)
在自己的CDHtmlDialog的派生类的构造函数中加入如下代码,以支持自动化。
EnableAutomation();//让框架自身支持自动化 CHtmlTestDlg::CHtmlTestDlg(CWnd* pParent /*=NULL*/)
: CDHtmlDialog(CHtmlTestDlg::IDD, CHtmlTestDlg::IDH, pParent)/*IDH 定义了开始时候的html资源号,并且让网页被加载,如果参数设为0,将不加载网页*/
{
EnableAutomation();//让框架自身支持自动化
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
第二步 :将自身暴露给Script 引擎: 将如下代码放入CHtmlTestDlg(CDhtmlDialog派生类)的OnInitDialog中
// TODO: 在此添加额外的初始化代码
SetExternalDispatch(GetIDispatch(TRUE)); 第三步:在CHtmlTestDialog头文件(HtmlTestDlg.h)中申明映射 DECLARE_DISPATCH_MAP() //声明Dispatch map
第四步: 在HtmlTestDlg.cpp中定义DISPATCH 映射 //添加DISPATCH_MAP 映射关系
BEGIN_DISPATCH_MAP(CHtmlTestDlg,CDHtmlDialog)
DISP_FUNCTION(CHtmlTestDlg,"Func1",Func1,VT_EMPTY,VTS_NONE)
END_DISPATCH_MAP()这里如果想把某一个方法暴露给外部文件(这里是.htm),就把它添加到上面的消息映射中去。函数的四个DISP_FUNCTION的参数可以查到。第一个参数就是当前类名,第二,三个是方法名,后面是参数,和返回值
其中func1方法在类中定义如下(注意要在头文件中声明):
void CHtmlTestDlg::Func1(){
AfxMessageBox((CString)"very good");
}
第五步:可以在js中调用此方法啦: 我这里是如下代码,双击响应这个函数
GEvent.addListener(marker,"dblclick",function(){window.external.Func1()});或者网页调用:
<input id="Btn1" type="button" value="Btn1" name="Btn1" onclick="external.Func1();" />
最终还是把它做出来啦。献给和我一样奋斗在code前的人们。
javascript 中调用VC 中的类或方法大概有两种(我只做了第二种):
第一种是基于事件的模型,使用DHTML_EVENT_MAP()来实现,例如一个html界面的button被点击,可以使用 DHTML_EVENT_ONCLICK(BUTTONID,FuncHandle)的方式进行捕获。在FuncHandle的参数里面,可以获相应的控件句柄,便可以获取并操作控件的各种属性
第二种是基于com接口。使用BEGIN_DISPATCH_MAP将相应的函数接口暴露的javascript,javascript调用的时候就可以使用window.external.函数名进行调用。
这里我讲一下第二种方式的实现:
第一步:让CDHtmlDialog 对象支持自动化(这个具体什么叫自动化很复杂,这里就不说了,我也说不清)
在自己的CDHtmlDialog的派生类的构造函数中加入如下代码,以支持自动化。
EnableAutomation();//让框架自身支持自动化 CHtmlTestDlg::CHtmlTestDlg(CWnd* pParent /*=NULL*/)
: CDHtmlDialog(CHtmlTestDlg::IDD, CHtmlTestDlg::IDH, pParent)/*IDH 定义了开始时候的html资源号,并且让网页被加载,如果参数设为0,将不加载网页*/
{
EnableAutomation();//让框架自身支持自动化
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
第二步 :将自身暴露给Script 引擎: 将如下代码放入CHtmlTestDlg(CDhtmlDialog派生类)的OnInitDialog中
// TODO: 在此添加额外的初始化代码
SetExternalDispatch(GetIDispatch(TRUE)); 第三步:在CHtmlTestDialog头文件(HtmlTestDlg.h)中申明映射 DECLARE_DISPATCH_MAP() //声明Dispatch map
第四步: 在HtmlTestDlg.cpp中定义DISPATCH 映射 //添加DISPATCH_MAP 映射关系
BEGIN_DISPATCH_MAP(CHtmlTestDlg,CDHtmlDialog)
DISP_FUNCTION(CHtmlTestDlg,"Func1",Func1,VT_EMPTY,VTS_NONE)
END_DISPATCH_MAP()这里如果想把某一个方法暴露给外部文件(这里是.htm),就把它添加到上面的消息映射中去。函数的四个DISP_FUNCTION的参数可以查到。第一个参数就是当前类名,第二,三个是方法名,后面是参数,和返回值
其中func1方法在类中定义如下(注意要在头文件中声明):
void CHtmlTestDlg::Func1(){
AfxMessageBox((CString)"very good");
}
第五步:可以在js中调用此方法啦: 我这里是如下代码,双击响应这个函数
GEvent.addListener(marker,"dblclick",function(){window.external.Func1()});或者网页调用:
<input id="Btn1" type="button" value="Btn1" name="Btn1" onclick="external.Func1();" />
相关文章推荐
- android web view的学习 2 通过WebChomeClient 实现进度条和title,通过WebViewClient 来进行url的拦截,和javascript的交互
- 使用WebViewJavascriptBridge进行iOS与H5交互
- Android WebView使用以及与JavaScript进行交互实例
- android webview和 javascript 进行交互
- android webview和 javascript 进行交互
- 利用WebViewJavascriptBridge与UIWebView进行交互
- VC与JavaScript交互(三) --- CWebPage类调用javascript函数(给js函数传参,并取得返回值)
- VC与JavaScript交互(三) ———— CWebPage类调用javascript函数(给js函数传参,并取得返回值)
- webview与JavaScript之间的交互
- CDHtmlDialog探索----Javascript与窗体交互
- VC++开发的ActiveX如何通过JavaScript脚本和EOS应用交互
- Android WebView —— Java 与 JavaScript 交互总结
- WebView自适应以及与JavaScript交互
- IOS平台:PhoneGap添加新类(javaScript与webView交互)----功能扩展
- WebView中JavaScript与Objective-C的交互
- Android中WebViewJavascriptBridge实现JS与java安全交互
- Android混合开发之WebView与Javascript交互
- android webview用法小结2 java与javascript的交互
- android中webview控件和javascript交互实例
- Android - webview原生和JavaScript(js)交互传值的几种方式