您的位置:首页 > Web前端 > HTML

如何在CHtmlView中用OnNewWindow2事件生成自己的浏览器窗口,实现类似于多标签页浏览

2012-11-22 07:59 393 查看
方式一

void CCustomHtmlView::OnNewWindow2(LPDISPATCH* ppDisp, BOOL* Cancel)

{

CWebNavigate *pDlg = new CWebNavigate;

pDlg->Create(CWebNavigate::IDD,this);

pDlg->OnNewWindow2(pDisp);

*Cancel = FALSE; //如果此处值为TRUE,则无法在新窗口中浏览网页 此处值必须为FLASH

//CHtmlView::OnNewWindow2(ppDisp, Cancel);

}

.............

void CWebNavigate::OnNewWindow2(LPDISPATCH *ppDisp)

{

m_wndWeb.SetRegisterAsBrowser(TRUE); //m_wndWeb 为CHtmlView对象

*pDisp = m_wndWeb.GetApplication();

}

方式2:

实现DWebBrowserEvents2

class CIEEvent : public SHDocVw::DWebBrowserEvents2

{

public:

CIEEvent();

virtual ~CIEEvent();

VOID SetIEhWnd(HWND hWnd){m_hIEWnd = hWnd;}

BOOL Advise(IUnknown *pUnKnown);

VOID UnAdvise();

virtual void BeforeNavigate2(DISPPARAMS __RPC_FAR *pDispParams, VARIANT __RPC_FAR *pVarResult);

virtual ULONG STDMETHODCALLTYPE AddRef() { return 1L; }

virtual ULONG STDMETHODCALLTYPE Release() { return 1L; }

virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT __RPC_FAR *pctinfo){return E_NOTIMPL;}

virtual HRESULT STDMETHODCALLTYPE QueryInterface(/* [in] */ REFIID riid,/* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject)

{

if (riid == IID_IUnknown || riid == IID_IDispatch || riid ==DIID_DWebBrowserEvents2)

{

*ppvObject = (void*)this;

return S_OK;

}

return E_NOINTERFACE;

}

virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(/* [in] */ UINT iTInfo,/* [in] */ LCID lcid,/* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo){return E_NOTIMPL;}

virtual HRESULT STDMETHODCALLTYPE Invoke(/* [in] */ DISPID dispIdMember,/* [in] */ REFIID riid,/* [in] */ LCID lcid,/* [in] */ WORD wFlags,/* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams,/* [out] */ VARIANT __RPC_FAR *pVarResult,/*
[out] */ EXCEPINFO __RPC_FAR *pExcepInfo,/* [out] */ UINT __RPC_FAR *puArgErr);

virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(/* [in] */ REFIID riid,/* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames,/* [in] */ UINT cNames,/* [in] */ LCID lcid,/* [size_is][out] */ DISPID __RPC_FAR *rgDispId){return
E_NOTIMPL;}

protected:

CComQIPtr<SHDocVw::IWebBrowser2, &IID_IWebBrowser2>m_spWebBrowser2;

CComQIPtr<IConnectionPoint>m_spCp;

DWORD m_dwCookIe;

HWND m_hIEWnd;

private:

VOID OnTitleChange(LPCTSTR lpszTitle);

};

//////////////////////////////////////////////////////////////////////

// Construction/Destruction

//////////////////////////////////////////////////////////////////////

CIEEvent::CIEEvent()

{

}

CIEEvent::~CIEEvent()

{

}

BOOL CIEEvent::Advise(IUnknown *pUnKnown)

{

m_spWebBrowser2=(SHDocVw::IWebBrowser2 *)pUnKnown;

CComQIPtr<IConnectionPointContainer> spContainer( m_spWebBrowser2 );

HRESULT hr=spContainer->FindConnectionPoint(DIID_DWebBrowserEvents2,&m_spCp);

if (m_spCp)

{

hr=m_spCp->Advise(this,&m_dwCookIe);

return TRUE;

}

else

return FALSE;

}

void CIEEvent::BeforeNavigate2(DISPPARAMS __RPC_FAR *pDispParams, VARIANT __RPC_FAR *pVarResult)

{

USES_CONVERSION;

char *pstrURL=NULL;

if (pDispParams->cArgs >= 5 && pDispParams->rgvarg[5].vt == (VT_BYREF|VT_VARIANT))

{

CComVariant varURL(*pDispParams->rgvarg[5].pvarVal);

varURL.ChangeType(VT_BSTR);

pstrURL = OLE2A(varURL.bstrVal);

}

if (pstrURL==NULL) return;

}

HRESULT STDMETHODCALLTYPE CIEEvent::Invoke(/* [in] */ DISPID dispIdMember,/* [in] */ REFIID riid,/* [in] */ LCID lcid,/* [in] */ WORD wFlags,/* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams,/* [out] */ VARIANT __RPC_FAR *pVarResult,/* [out] */ EXCEPINFO __RPC_FAR
*pExcepInfo,/* [out] */ UINT __RPC_FAR *puArgErr)

{

USES_CONVERSION;

if (!pDispParams)

return E_INVALIDARG;

switch(dispIdMember)

{

break;

case 273:
//DISPID_NEWWINDOW3 = 273

{

//0 : bstrUrl, 1 : bstrContext, 2 : dwFlags, 3 : *bCancel, 4 : **pDisp

//CComBSTR url = pDispParams->rgvarg[0].bstrVal;

/*

CComVariant varURL(pDispParams->rgvarg[0].bstrVal);

varURL.ChangeType(VT_BSTR);

CHAR *pstrURL = OLE2A(varURL.bstrVal); //新窗口URL地址

AfxGetMainWnd()->SendMessage(WM_IE_NEWWINDOW,(WPARAM)0,(LPARAM)pDispParams->rgvarg[4].ppdispVal);

*(pDispParams->rgvarg[3].pboolVal) = VARIANT_FALSE; //此处值也必须为VARIANT_FALSE 开始我在测试时,此处值为VARIANT_TRUE,然后通过pstrURL参数打开自定义的URL,在测试中发现可以正常打开一般URL但如果有POST等参数传递时就会出错,显示不正常

}

break;

}

return S_OK;

}

VOID CIEEvent::UnAdvise()

{

if (m_spCp && m_dwCookIe!=-1)

{

m_spCp->Unadvise(m_dwCookIe);

m_dwCookIe
=-1;

}

}

VOID CIEEvent::OnTitleChange(LPCTSTR lpszTitle)

{

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐