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

来源:互联网 发布:淘宝店铺包邮图片 编辑:程序博客网 时间:2024/05/16 17:20

方式一

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)
{


}




原创粉丝点击