原创  CDHtmlDialog 与 网页交互技巧 收藏
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相关文档;
javascript 函数
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();">

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。