CDHtmlDialog 与 网页交互技巧
From: http://blog.csdn.net/catxl313/article/details/2204541
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函數定義的參數的順序的逆序,所以應特別注意該返回值所指示的具體位置。
{
????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();">
總結
以上是生活随笔為你收集整理的CDHtmlDialog 与 网页交互技巧的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图形推理1000题pdf_这7道幼儿园数
- 下一篇: nginx安装及负载均衡配置