天天看點

在CDHTMLDialog中擴充浏覽器腳本以及在HTML中增加MFC消息響應

擴充浏覽器腳本

假設我們建立了一個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;

繼續閱讀