擴充浏覽器腳本
假設我們建立了一個CMyDHTMLDialog對話框類,包含兩個檔案MyDHTMLDialog.h和MyDHTMLDialog.cpp
1、讓類自身支援自動化
EnableAutomation(); //隻要是從CCmdTarget派生下來的類都可以支援
//可以放在CMyDHTMLDialog::CMyDHTMLDialog()中調用
2、将自身暴露給Script引擎
SetExternalDispatch(GetIDispatch(TRUE)); //将浏覽器控件的擴充接口設定為對話框自身的IDispatch
//放在CMyDHTMLDialog::OnInitDialog中調用
3、聲明DISPATCH_MAP
DECLARE_DISPATCH_MAP() //MyDHTMLDialog.h的類聲明中
4、定義DISPATCH映射
BEGIN_DISPATCH_MAP(CMyDHtmlDialog, CDHtmlDialog) //在MyDHTMLDialog.cpp檔案中
END_DISPATCH_MAP()
5.定義一個方法 //MyDHTMLDialog.h的類聲明中
afx_msg void Func1();
6、編寫具體的方法
BEGIN_DISPATCH_MAP(CMyDHtmlDialog, CDHtmlDialog)
DISP_FUNCTION(CMyDHTMLDialog, "Func1", Func1, VT_EMPTY, VTS_NONE) //每個方法都需要在這裡添加映射
void CMyDHTMLDialog::Func1()
{
MessageBox(_T("Hello!"));
}
7.重載CanAccessExternal
virtual BOOL CanAccessExternal();////在MyDHTMLDialog.h檔案中
BOOL CWebUIAppDlg::CanAccessExternal() //在MyDHTMLDialog.cpp檔案中
return TRUE;
8、測試
修改資源中的MyDHTMLDialog.htm檔案
添加一個按鈕,
<INPUT id="Button1" type="button" value="Button1" name="Button1" onclick="external.Func1();">
注意:所有暴露出去的方法都是在external.中提供,而這個external就是對話框自己,就是SetExternalDispatch中所傳遞的參數。
總結:上面所做的所有工作,無非就是将一個IDispatch接口指針傳遞給浏覽器,浏覽器中的腳本引擎就可以通過external這個對象句柄來通路我們自定義的方法。
備注:重載CanAccessExternal,傳回true,即可消除“在此頁上的Activex控件和本頁上的其它部分的互動可能不安全,您想允許互動嗎?”警告
HTML中增加MFC消息響應
1.Web中增加一标簽
<a ID="LinkSubmit">送出</a>
2.申明消息處理函數
HRESULT OnLinkSubmit(IHTMLElement *pElement);
3.消息映射
BEGIN_DHTML_EVENT_MAP(CWebUIAppDlg)
DHTML_EVENT_ONCLICK(_T("LinkSubmit"), OnLinkSubmit)
END_DHTML_EVENT_MAP()
4.函數實作
HRESULT CWebUIAppDlg::OnLinkSubmit(IHTMLElement* pElement)
AfxMessageBox(L"OnLinkSubmit");
return S_OK;