CHtmlView与javascript交互

来源:互联网 发布:js表单正则表达式 编辑:程序博客网 时间:2024/05/22 11:52
/***********************js调用工程中的方法****************************/
// 工程文件
class CTestAppProj : public CWinAppEx
{
...
private:
    CChildView *m_pChildView;

public:
    HRESULT GetExternal(IDispatch **ppDispatch);
...
};

HRESULT CTestAppProj::GetExternal(IDispatch **ppDispatch)
{
    *ppDispatch = NULL;
    return m_pChildView->OnGetExternal(ppDispatch);
    //return S_FALSE;
}

// HtmlView文件
class CChildView : public CHtmlView
{
public:
    CChildView();           
    virtual ~CChildView();
...
public:
    virtual HRESULT OnGetExternal(LPDISPATCH *lppDispatch);
    // Onload完成
    void OnloadComplete();
    void Function01(double dCenterLong, double dCenterLat, double dZoomLevel);
...
};

CChildView::CChildView()
{
    // 允许自动化
    EnableAutomation();
}

HRESULT CChildView::OnGetExternal(LPDISPATCH *lppDispatch)
{
    // 返回自身的IDispatch接口
    *lppDispatch = GetIDispatch(TRUE);
    return S_OK;
}

// 把成员函数映射到Dispatch映射表中,暴露方法给脚本
BEGIN_DISPATCH_MAP(CChildView, CHtmlView)
    DISP_FUNCTION(CChildView, "init", OnloadComplete, VT_EMPTY, VTS_NONE)
    DISP_FUNCTION(CChildView, "function01", Function01, VT_EMPTY, VTS_R8 VTS_R8 VTS_R8)
END_DISPATCH_MAP()


// Onload完成
void CChildView::OnloadComplete()
{

}

void CChildView::Function01(double dCenterLong, double dCenterLat, double dZoomLevel)
{

}

// javascript调用
if (typeof(window.external) != "undefined"){
    if(typeof(window.external.init) != "undefined"){
        try{
            window.external.init();
        }catch(e){
            // alert(e);
        }
    }
}

/*****************************工程中调用js****************************/
// 执行javascript
BOOL CChildView::ExecJavascript(CStringW& strFunction)
{
    IHTMLDocument2 *pHDoc2 = (IHTMLDocument2 *)GetHtmlDocument();
    if (pHDoc2 !=NULL)
    {
        IHTMLElementCollection * all = NULL;
        pHDoc2->get_all(&all);
        IHTMLWindow2 *p=NULL;
        HRESULT hr = pHDoc2->get_parentWindow(&p);
        if (SUCCEEDED(hr) && p != NULL)
        {
            VARIANT varRtn;
            BSTR code = ::SysAllocString(strFunction);
            BSTR language = ::SysAllocString(L"javascript");
            p->execScript(code, language, &varRtn);//执行网页函数
            VariantClear(&varRtn);
            return TRUE;
        }
    }

    return FALSE;
}