如何在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)
{
}
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)
{
}
相关文章推荐
- 如何运用onunload事件判断浏览器是刷新还是关闭窗口
- 如何实现在浏览器中打开IM聊天窗口?
- 发现Windows程序 最主要的还是要理解消息和窗口的相互调用,相互影响是如何实现的,才能更准确的去理解Windows程序,去编好自己想要的程序功能
- 在windows中,如何实现一个自己的浏览器
- 如何运用onunload事件判断浏览器是刷新还是关闭窗口
- 如何实现在浏览器中打开IM聊天窗口?
- 已知道 一个窗口的句柄, 如何扑捉该窗口的onresize 事件,并在onresize 事件中写入自己的代码?
- C++ Builder 实现动态生成窗口、控件,以及处理控件事件
- JavaScript事件流 HTML和CSS代码支持页面的外观,JavaScript代码支持页面的行为,而JavaScript与HTML之间的交互是通过事件实现的。事件,是文档或者浏览器窗口中发生
- js实现浏览器窗口大小被改变时触发事件的方法
- 如何运用onunload事件判断浏览器是刷新还是关闭窗口
- 进击的KFC:iOS WebView 如何通过js获取网页中所有图片并加入点击事件,实现浏览图片的功能
- 如何在.NET自定义控件中实现自己的事件(转)
- C++ Builder 实现动态生成窗口、控件,以及处理控件事件
- 在CListView中用SetScrollPos改变滚动条的位置后,窗口中显示的内容如何也跟着移动实现。
- 章鱼哥—VB.NET 如何实现代码自动生成控件 添加绑定事件
- Android 如何监听自己是否被卸载及卸载后打开的浏览器进行反馈功能的实现 --- 仿360卫士
- C++ Builder 实现动态生成窗口、控件,以及处理控件事件(转载)
- Js实现浏览器下标签页间切换触发的事件
- js实现浏览器窗口大小被改变时触发事件的方法