您的位置:首页 > Web前端 > JavaScript

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();" />
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息