VC中的ChtmlDialog 和Javascript ,web进行交互

 对于整个的交互过程不是很了解,在网上收罗了一大批资料,搞的云里雾里的。

最终还是把它做出来啦。献给和我一样奋斗在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" οnclick="external.Func1();" />





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值