CDHtmlDialog 与 网页交互技巧

本文介绍CDHtmlDialog的应用技巧,包括如何使用JavaScript进行数据验证、从CDHtmlDialog调用JavaScript函数及如何让JavaScript调用C++方法等。这些技巧有助于更好地分离人机界面与控制逻辑。

CDHtmlDialog可以方便的将网页嵌入对话框,使得在程序设计中人机界面(DHTML网页)与控制逻辑(CDialog)可以很好的分离,下面是一些实用技术与技巧。

1.将数据验证任务完全交给JavaScript,Dialog只做有意义的事。

<input type="button" id="button1" onclick="if(validate()); window.event.cancelBubble=true;" /> 

这样,事件由IE处理之后,就不会将该事件传给其他事件句柄处理了,因为IE先于CDHtmlDialog处理该事件。

2.从CDHtmlDialog调用网页中JavaScript函数的方法。

其中pDoc指针参数可通过CDHtmlDialog::GetDHtmlDocument(&pDoc)函数获得;
strFunctionName指示函数名;
dispParams为传给函数的参数列表,其使用方法请查阅MSDN相关文档;
varResult为函数返回值;
exceptInfo为JavaScript函数执行时抛出的异常;
nArgErr返回第一个出错的参数的下标,由于参数列表中参数的逻辑顺序为JavaScript函数定义的参数的顺序的逆序,所以应特别注意该返回值所指示的具体位置。

HRESULT CallJSFunction(IHTMLDocument2* pDoc2,
                                 CString strFunctionName,
                                 DISPPARAMS dispParams,
                                 VARIANT* varResult,
                                 EXCEPINFO* exceptInfo,
                                 UINT* nArgErr )
{
    IDispatch 
*pDispScript = NULL;   
    HRESULT hResult;
    hResult 
= pDoc2->get_Script(&pDispScript);
    
if(FAILED(hResult))
   
{
        
return S_FALSE;
    }

    DISPID   dispid;   
    CComBSTR objbstrValue 
= strFunctionName;
    BSTR bstrValue 
=  objbstrValue.Copy();
    OLECHAR   
*pszFunct   =  bstrValue ; 
    hResult   
=   pDispScript->GetIDsOfNames(IID_NULL, 
                                                             
&pszFunct, 
                                                             
1,
                                                             LOCALE_SYSTEM_DEFAULT, 
                                                             
&dispid);   
    
if   (S_OK   !=   hResult)   
   

        pDispScript
->Release();   
        
return   hResult;   
    }
  

    varResult
->vt = VT_VARIANT;
    hResult   
=   pDispScript->Invoke(dispid,
                                              IID_NULL, 
LOCALE_USER_DEFAULT,
                                              DISPATCH_METHOD,
                                             
&dispParams,
                                              varResult,
                                              exceptInfo,
                                              nArgErr);  
    pDispScript
->Release();
    
return hResult;
}


3.CDHtmlDialog中JavaScript通过external调用C++方法。

<1>让CDHtmlDialog对象自身支持自动化

EnableAutomation();  //只要是从CCmdTarget派生下来的类都可以支持
                             
//可以放在CMyDHTMLDialog::CMyDHTMLDialog()中调用

<2>将自身暴露给Script引擎:

SetExternalDispatch(GetIDispatch(TRUE));    //将浏览器控件的扩展接口设置为对话框自身的IDispatch
                                                            
//放在CMyDHTMLDialog::OnInitDialog中调用

<3>声明DISPATCH_MAP(MyDHTMLDialog.h)

DECLARE_DISPATCH_MAP()

<4>定义DISPATCH映射(MyDHTMLDialog.cpp)

BEGIN_DISPATCH_MAP(CMyDHtmlDialog, CDHtmlDialog)
    DISP_FUNCTION(CMyDHTMLDialog, 
"Func1", Func1, VT_EMPTY, VTS_NONE) 
    
// example:
    
// DISP_FUNCTION(CMyDHTMLDialog,"Func2",TestFunc,VT_BOOL,VTS_BSTR VTS_I4 VTS_I4)
    
//                                                                        ^return,        ^parameters type list
    
//每个方法都需要在这里添加映射
END_DISPATCH_MAP()

<5>函数实现

void CMyDHTMLDialog::Func1()
{
    AfxMessageBox(_T("Func1 called!"));
}

<6>调用示例

<INPUT id="Button1" type="button" value="Button1" name="Button1" onclick="external.Func1();">
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值