在多iframe的页面中,需要结合DISPID_DOCUMENTCOMPLETE和DISPID_NAVIGATECOMPLETE2两个事件判断页面是否加载完毕,而duilib中没有提供对DISPID_DOCUMENTCOMPLETE的支持。
要支持DISPID_DOCUMENTCOMPLETE,需要修改UIWebBrowser.cpp、UIWebBrowser.h和WebBrowserEventHandler.h三个文件
1.WebBrowserEventHandler.h文件
添加virtual void DocumentComplete();
1 #pragma once 2 #include3 #include 4 #include 5 6 namespace DuiLib 7 { 8 class CWebBrowserEventHandler 9 { 10 public: 11 CWebBrowserEventHandler() {} 12 ~CWebBrowserEventHandler() {} 13 14 virtual void BeforeNavigate2( IDispatch *pDisp,VARIANT *&url,VARIANT *&Flags,VARIANT *&TargetFrameName,VARIANT *&PostData,VARIANT *&Headers,VARIANT_BOOL *&Cancel ) {} 15 virtual void NavigateError(IDispatch *pDisp,VARIANT * &url,VARIANT *&TargetFrameName,VARIANT *&StatusCode,VARIANT_BOOL *&Cancel) {} 16 virtual void NavigateComplete2(IDispatch *pDisp,VARIANT *&url){} 17 virtual void DocumentComplete(){} //2016.10.19 18 virtual void ProgressChange(LONG nProgress, LONG nProgressMax){} 19 virtual void NewWindow3(IDispatch **pDisp, VARIANT_BOOL *&Cancel, DWORD dwFlags, BSTR bstrUrlContext, BSTR bstrUrl){} 20 virtual void CommandStateChange(long Command,VARIANT_BOOL Enable){}; 21 22 // interface IDocHostUIHandler 23 virtual HRESULT STDMETHODCALLTYPE ShowContextMenu( 24 /* [in] */ DWORD dwID, 25 /* [in] */ POINT __RPC_FAR *ppt, 26 /* [in] */ IUnknown __RPC_FAR *pcmdtReserved, 27 /* [in] */ IDispatch __RPC_FAR *pdispReserved) 28 { 29 //return E_NOTIMPL; 30 //返回 E_NOTIMPL 正常弹出系统右键菜单 31 return S_OK; 32 //返回S_OK 则可屏蔽系统右键菜单 33 } 34 35 virtual HRESULT STDMETHODCALLTYPE GetHostInfo( 36 /* [out][in] */ DOCHOSTUIINFO __RPC_FAR *pInfo) 37 { 38 // if (pInfo != NULL) 39 // { 40 // pInfo->dwFlags |= DOCHOSTUIFLAG_NO3DBORDER; 41 // } 42 return S_OK; 43 } 44 45 virtual HRESULT STDMETHODCALLTYPE ShowUI( 46 /* [in] */ DWORD dwID, 47 /* [in] */ IOleInPlaceActiveObject __RPC_FAR *pActiveObject, 48 /* [in] */ IOleCommandTarget __RPC_FAR *pCommandTarget, 49 /* [in] */ IOleInPlaceFrame __RPC_FAR *pFrame, 50 /* [in] */ IOleInPlaceUIWindow __RPC_FAR *pDoc) 51 { 52 return S_FALSE; 53 } 54 55 virtual HRESULT STDMETHODCALLTYPE HideUI( void) 56 { 57 return S_OK; 58 } 59 60 virtual HRESULT STDMETHODCALLTYPE UpdateUI( void) 61 { 62 return S_OK; 63 } 64 65 virtual HRESULT STDMETHODCALLTYPE EnableModeless( 66 /* [in] */ BOOL fEnable) 67 { 68 return S_OK; 69 } 70 71 virtual HRESULT STDMETHODCALLTYPE OnDocWindowActivate( 72 /* [in] */ BOOL fActivate) 73 { 74 return S_OK; 75 } 76 77 virtual HRESULT STDMETHODCALLTYPE OnFrameWindowActivate( 78 /* [in] */ BOOL fActivate) 79 { 80 return S_OK; 81 } 82 83 virtual HRESULT STDMETHODCALLTYPE ResizeBorder( 84 /* [in] */ LPCRECT prcBorder, 85 /* [in] */ IOleInPlaceUIWindow __RPC_FAR *pUIWindow, 86 /* [in] */ BOOL fRameWindow) 87 { 88 return S_OK; 89 } 90 91 virtual HRESULT STDMETHODCALLTYPE TranslateAccelerator( 92 /* [in] */ LPMSG lpMsg, 93 /* [in] */ const GUID __RPC_FAR *pguidCmdGroup, 94 /* [in] */ DWORD nCmdID) 95 { 96 return S_FALSE; 97 } 98 99 virtual HRESULT STDMETHODCALLTYPE GetOptionKeyPath(100 /* [out] */ LPOLESTR __RPC_FAR *pchKey,101 /* [in] */ DWORD dw)102 {103 return S_OK;104 }105 106 virtual HRESULT STDMETHODCALLTYPE GetDropTarget(107 /* [in] */ IDropTarget __RPC_FAR *pDropTarget,108 /* [out] */ IDropTarget __RPC_FAR *__RPC_FAR *ppDropTarget)109 {110 return E_NOTIMPL;111 }112 113 virtual HRESULT STDMETHODCALLTYPE GetExternal(114 /* [out] */ IDispatch __RPC_FAR *__RPC_FAR *ppDispatch)115 {116 return E_NOTIMPL;117 }118 119 virtual HRESULT STDMETHODCALLTYPE TranslateUrl(120 /* [in] */ DWORD dwTranslate,121 /* [in] */ OLECHAR __RPC_FAR *pchURLIn,122 /* [out] */ OLECHAR __RPC_FAR *__RPC_FAR *ppchURLOut)123 {124 return S_OK;125 }126 127 virtual HRESULT STDMETHODCALLTYPE FilterDataObject(128 /* [in] */ IDataObject __RPC_FAR *pDO,129 /* [out] */ IDataObject __RPC_FAR *__RPC_FAR *ppDORet)130 {131 return S_OK;132 }133 134 // virtual HRESULT STDMETHODCALLTYPE GetOverrideKeyPath( 135 // /* [annotation][out] */ 136 // __deref_out LPOLESTR *pchKey,137 // /* [in] */ DWORD dw)138 // {139 // return E_NOTIMPL;140 // }141 142 // IDownloadManager143 virtual HRESULT STDMETHODCALLTYPE Download( 144 /* [in] */ IMoniker *pmk,145 /* [in] */ IBindCtx *pbc,146 /* [in] */ DWORD dwBindVerb,147 /* [in] */ LONG grfBINDF,148 /* [in] */ BINDINFO *pBindInfo,149 /* [in] */ LPCOLESTR pszHeaders,150 /* [in] */ LPCOLESTR pszRedir,151 /* [in] */ UINT uiCP)152 {153 return S_OK;154 }155 };156 }
2.在UIWebBrowser.h添加
void DocumentComplete();
1 #ifndef __UIWEBBROWSER_H__ 2 #define __UIWEBBROWSER_H__ 3 4 #pragma once 5 6 #include "../Utils/WebBrowserEventHandler.h" 7 #include8 9 namespace DuiLib 10 { 11 class UILIB_API CWebBrowserUI 12 : public CActiveXUI 13 , public IDocHostUIHandler 14 , public IServiceProvider 15 , public IOleCommandTarget 16 , public IDispatch 17 , public ITranslateAccelerator 18 { 19 public: 20 /// 构造函数 21 CWebBrowserUI(); 22 virtual ~CWebBrowserUI(); 23 24 void SetHomePage(LPCTSTR lpszUrl); 25 LPCTSTR GetHomePage(); 26 27 void SetAutoNavigation(bool bAuto = TRUE); 28 bool IsAutoNavigation(); 29 30 void SetWebBrowserEventHandler(CWebBrowserEventHandler* pEventHandler); 31 void Navigate2(LPCTSTR lpszUrl); 32 void Refresh(); 33 void Refresh2(int Level); 34 void GoBack(); 35 void GoForward(); 36 void NavigateHomePage(); 37 void NavigateUrl(LPCTSTR lpszUrl); 38 virtual bool DoCreateControl(); 39 IWebBrowser2* GetWebBrowser2(void); 40 IDispatch* GetHtmlWindow(); 41 static DISPID FindId(IDispatch *pObj, LPOLESTR pName); 42 static HRESULT InvokeMethod(IDispatch *pObj, LPOLESTR pMehtod, VARIANT *pVarResult, VARIANT *ps, int cArgs); 43 static HRESULT GetProperty(IDispatch *pObj, LPOLESTR pName, VARIANT *pValue); 44 static HRESULT SetProperty(IDispatch *pObj, LPOLESTR pName, VARIANT *pValue); 45 46 protected: 47 IWebBrowser2* m_pWebBrowser2; //浏览器指针 48 IHTMLWindow2* _pHtmlWnd2; 49 LONG m_dwRef; 50 DWORD m_dwCookie; 51 virtual void ReleaseControl(); 52 HRESULT RegisterEventHandler(BOOL inAdvise); 53 virtual void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue); 54 CDuiString m_sHomePage; // 默认页面 55 bool m_bAutoNavi; // 是否启动时打开默认页面 56 CWebBrowserEventHandler* m_pWebBrowserEventHandler; //浏览器事件处理 57 58 // DWebBrowserEvents2 59 void BeforeNavigate2( IDispatch *pDisp,VARIANT *&url,VARIANT *&Flags,VARIANT *&TargetFrameName,VARIANT *&PostData,VARIANT *&Headers,VARIANT_BOOL *&Cancel ); 60 void NavigateError(IDispatch *pDisp,VARIANT * &url,VARIANT *&TargetFrameName,VARIANT *&StatusCode,VARIANT_BOOL *&Cancel); 61 void NavigateComplete2(IDispatch *pDisp,VARIANT *&url); 62 void ProgressChange(LONG nProgress, LONG nProgressMax); 63 void NewWindow3(IDispatch **pDisp, VARIANT_BOOL *&Cancel, DWORD dwFlags, BSTR bstrUrlContext, BSTR bstrUrl); 64 void CommandStateChange(long Command,VARIANT_BOOL Enable); 65 void DocumentComplete();//201610.19 66 public: 67 virtual LPCTSTR GetClass() const; 68 virtual LPVOID GetInterface( LPCTSTR pstrName ); 69 70 // IUnknown 71 STDMETHOD_(ULONG,AddRef)(); 72 STDMETHOD_(ULONG,Release)(); 73 STDMETHOD(QueryInterface)(REFIID riid, LPVOID *ppvObject); 74 75 // IDispatch 76 virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount( __RPC__out UINT *pctinfo ); 77 virtual HRESULT STDMETHODCALLTYPE GetTypeInfo( UINT iTInfo, LCID lcid, __RPC__deref_out_opt ITypeInfo **ppTInfo ); 78 virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames( __RPC__in REFIID riid, __RPC__in_ecount_full(cNames ) LPOLESTR *rgszNames, UINT cNames, LCID lcid, __RPC__out_ecount_full(cNames) DISPID *rgDispId); 79 virtual HRESULT STDMETHODCALLTYPE Invoke( DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr ); 80 81 // IDocHostUIHandler 82 STDMETHOD(ShowContextMenu)(DWORD dwID, POINT* pptPosition, IUnknown* pCommandTarget, IDispatch* pDispatchObjectHit); 83 STDMETHOD(GetHostInfo)(DOCHOSTUIINFO* pInfo); 84 STDMETHOD(ShowUI)(DWORD dwID, IOleInPlaceActiveObject* pActiveObject, IOleCommandTarget* pCommandTarget, IOleInPlaceFrame* pFrame, IOleInPlaceUIWindow* pDoc); 85 STDMETHOD(HideUI)(); 86 STDMETHOD(UpdateUI)(); 87 STDMETHOD(EnableModeless)(BOOL fEnable); 88 STDMETHOD(OnDocWindowActivate)(BOOL fActivate); 89 STDMETHOD(OnFrameWindowActivate)(BOOL fActivate); 90 STDMETHOD(ResizeBorder)(LPCRECT prcBorder, IOleInPlaceUIWindow* pUIWindow, BOOL fFrameWindow); 91 STDMETHOD(TranslateAccelerator)(LPMSG lpMsg, const GUID* pguidCmdGroup, DWORD nCmdID); //浏览器消息过滤 92 STDMETHOD(GetOptionKeyPath)(LPOLESTR* pchKey, DWORD dwReserved); 93 STDMETHOD(GetDropTarget)(IDropTarget* pDropTarget, IDropTarget** ppDropTarget); 94 STDMETHOD(GetExternal)(IDispatch** ppDispatch); 95 STDMETHOD(TranslateUrl)(DWORD dwTranslate, OLECHAR* pchURLIn, OLECHAR** ppchURLOut); 96 STDMETHOD(FilterDataObject)(IDataObject* pDO, IDataObject** ppDORet); 97 98 // IServiceProvider 99 STDMETHOD(QueryService)(REFGUID guidService, REFIID riid, void** ppvObject);100 101 // IOleCommandTarget102 virtual HRESULT STDMETHODCALLTYPE QueryStatus( __RPC__in_opt const GUID *pguidCmdGroup, ULONG cCmds, __RPC__inout_ecount_full(cCmds ) OLECMD prgCmds[ ], __RPC__inout_opt OLECMDTEXT *pCmdText);103 virtual HRESULT STDMETHODCALLTYPE Exec( __RPC__in_opt const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, __RPC__in_opt VARIANT *pvaIn, __RPC__inout_opt VARIANT *pvaOut );104 105 // IDownloadManager106 STDMETHOD(Download)( 107 /* [in] */ IMoniker *pmk,108 /* [in] */ IBindCtx *pbc,109 /* [in] */ DWORD dwBindVerb,110 /* [in] */ LONG grfBINDF,111 /* [in] */ BINDINFO *pBindInfo,112 /* [in] */ LPCOLESTR pszHeaders,113 /* [in] */ LPCOLESTR pszRedir,114 /* [in] */ UINT uiCP);115 116 // ITranslateAccelerator117 // Duilib消息分发给WebBrowser118 virtual LRESULT TranslateAccelerator( MSG *pMsg );119 };120 } // namespace DuiLib121 #endif // __UIWEBBROWSER_H__
3.UIWebBrowser.cpp添加实现
1 #include "StdAfx.h" 2 #include "UIWebBrowser.h" 3 #include4 #include 5 #include "../Utils/downloadmgr.h" 6 #include 7 8 DuiLib::CWebBrowserUI::CWebBrowserUI() 9 : m_pWebBrowser2(NULL) 10 , _pHtmlWnd2(NULL) 11 , m_pWebBrowserEventHandler(NULL) 12 , m_bAutoNavi(false) 13 , m_dwRef(0) 14 , m_dwCookie(0) 15 { 16 m_clsid=CLSID_WebBrowser; 17 m_sHomePage.Empty(); 18 } 19 20 bool DuiLib::CWebBrowserUI::DoCreateControl() 21 { 22 if (!CActiveXUI::DoCreateControl()) 23 return false; 24 GetManager()->AddTranslateAccelerator(this); 25 GetControl(IID_IWebBrowser2,(LPVOID*)&m_pWebBrowser2); 26 if ( m_bAutoNavi && !m_sHomePage.IsEmpty()) 27 { 28 this->Navigate2(m_sHomePage); 29 } 30 RegisterEventHandler(TRUE); 31 return true; 32 } 33 34 void DuiLib::CWebBrowserUI::ReleaseControl() 35 { 36 m_bCreated=false; 37 GetManager()->RemoveTranslateAccelerator(this); 38 RegisterEventHandler(FALSE); 39 } 40 41 DuiLib::CWebBrowserUI::~CWebBrowserUI() 42 { 43 ReleaseControl(); 44 } 45 46 STDMETHODIMP DuiLib::CWebBrowserUI::GetTypeInfoCount( UINT *iTInfo ) 47 { 48 *iTInfo = 0; 49 return E_NOTIMPL; 50 } 51 52 STDMETHODIMP DuiLib::CWebBrowserUI::GetTypeInfo( UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo ) 53 { 54 return E_NOTIMPL; 55 } 56 57 STDMETHODIMP DuiLib::CWebBrowserUI::GetIDsOfNames( REFIID riid, OLECHAR **rgszNames, UINT cNames, LCID lcid,DISPID *rgDispId ) 58 { 59 return E_NOTIMPL; 60 } 61 62 STDMETHODIMP DuiLib::CWebBrowserUI::Invoke( DISPID dispIdMember, REFIID riid, LCID lcid,WORD wFlags, DISPPARAMS* pDispParams,VARIANT* pVarResult, EXCEPINFO* pExcepInfo,UINT* puArgErr ) 63 { 64 if ((riid != IID_NULL)) 65 return E_INVALIDARG; 66 67 switch(dispIdMember) 68 { 69 case DISPID_BEFORENAVIGATE2: 70 BeforeNavigate2( 71 pDispParams->rgvarg[6].pdispVal, 72 pDispParams->rgvarg[5].pvarVal, 73 pDispParams->rgvarg[4].pvarVal, 74 pDispParams->rgvarg[3].pvarVal, 75 pDispParams->rgvarg[2].pvarVal, 76 pDispParams->rgvarg[1].pvarVal, 77 pDispParams->rgvarg[0].pboolVal); 78 break; 79 case DISPID_COMMANDSTATECHANGE: 80 CommandStateChange( 81 pDispParams->rgvarg[1].lVal, 82 pDispParams->rgvarg[0].boolVal); 83 break; 84 case DISPID_NAVIGATECOMPLETE2: 85 NavigateComplete2( 86 pDispParams->rgvarg[1].pdispVal, 87 pDispParams->rgvarg[0].pvarVal); 88 break; 89 case DISPID_NAVIGATEERROR: 90 NavigateError( 91 pDispParams->rgvarg[4].pdispVal, 92 pDispParams->rgvarg[3].pvarVal, 93 pDispParams->rgvarg[2].pvarVal, 94 pDispParams->rgvarg[1].pvarVal, 95 pDispParams->rgvarg[0].pboolVal); 96 break; 97 case DISPID_STATUSTEXTCHANGE: 98 break; 99 // case DISPID_NEWWINDOW2:100 // break;101 case DISPID_NEWWINDOW3:102 NewWindow3(103 pDispParams->rgvarg[4].ppdispVal,104 pDispParams->rgvarg[3].pboolVal,105 pDispParams->rgvarg[2].uintVal,106 pDispParams->rgvarg[1].bstrVal,107 pDispParams->rgvarg[0].bstrVal);108 break;109 // case DISPID_PROPERTYCHANGE:110 // if (pDispParams->cArgs>0 && pDispParams->rgvarg[0].vt == VT_BSTR) {111 // TRACE(_T("PropertyChange(%s)\n"), pDispParams->rgvarg[0].bstrVal);112 // }113 // break;114 115 case DISPID_DOCUMENTCOMPLETE:116 DocumentComplete();//2016.10.19117 break;118 default:119 return DISP_E_MEMBERNOTFOUND;120 }121 return S_OK;122 }123 124 STDMETHODIMP DuiLib::CWebBrowserUI::QueryInterface( REFIID riid, LPVOID *ppvObject )125 {126 *ppvObject = NULL;127 128 if( riid == IID_IDocHostUIHandler)129 *ppvObject = static_cast (this);130 else if( riid == IID_IDispatch)131 *ppvObject = static_cast (this);132 else if( riid == IID_IServiceProvider)133 *ppvObject = static_cast (this);134 else if (riid == IID_IOleCommandTarget)135 *ppvObject = static_cast (this);136 137 if( *ppvObject != NULL )138 AddRef();139 return *ppvObject == NULL ? E_NOINTERFACE : S_OK;140 }141 142 STDMETHODIMP_(ULONG) DuiLib::CWebBrowserUI::AddRef()143 {144 InterlockedIncrement(&m_dwRef); 145 return m_dwRef;146 }147 148 STDMETHODIMP_(ULONG) DuiLib::CWebBrowserUI::Release()149 {150 ULONG ulRefCount = InterlockedDecrement(&m_dwRef);151 return ulRefCount; 152 }153 154 void DuiLib::CWebBrowserUI::Navigate2( LPCTSTR lpszUrl )155 {156 if (lpszUrl == NULL)157 return;158 159 if (m_pWebBrowser2)160 {161 CVariant url;162 url.vt=VT_BSTR;163 url.bstrVal=T2BSTR(lpszUrl);164 HRESULT hr = m_pWebBrowser2->Navigate2(&url, NULL, NULL, NULL, NULL);165 }166 }167 168 void DuiLib::CWebBrowserUI::Refresh()169 {170 if (m_pWebBrowser2)171 {172 m_pWebBrowser2->Refresh();173 }174 }175 void DuiLib::CWebBrowserUI::GoBack()176 {177 if (m_pWebBrowser2)178 {179 m_pWebBrowser2->GoBack();180 }181 }182 void DuiLib::CWebBrowserUI::GoForward()183 {184 if (m_pWebBrowser2)185 {186 m_pWebBrowser2->GoForward();187 }188 }189 /// DWebBrowserEvents2190 void DuiLib::CWebBrowserUI::BeforeNavigate2( IDispatch *pDisp,VARIANT *&url,VARIANT *&Flags,VARIANT *&TargetFrameName,VARIANT *&PostData,VARIANT *&Headers,VARIANT_BOOL *&Cancel )191 {192 if (m_pWebBrowserEventHandler)193 {194 m_pWebBrowserEventHandler->BeforeNavigate2(pDisp,url,Flags,TargetFrameName,PostData,Headers,Cancel);195 }196 }197 198 void DuiLib::CWebBrowserUI::NavigateError( IDispatch *pDisp,VARIANT * &url,VARIANT *&TargetFrameName,VARIANT *&StatusCode,VARIANT_BOOL *&Cancel )199 {200 if (m_pWebBrowserEventHandler)201 {202 m_pWebBrowserEventHandler->NavigateError(pDisp,url,TargetFrameName,StatusCode,Cancel);203 }204 }205 206 void DuiLib::CWebBrowserUI::NavigateComplete2( IDispatch *pDisp,VARIANT *&url )207 {208 CComPtr spDoc; 209 m_pWebBrowser2->get_Document(&spDoc); 210 211 if (spDoc)212 { 213 CComQIPtr spCustomDoc(spDoc); 214 if (spCustomDoc) 215 spCustomDoc->SetUIHandler(this); 216 }217 218 if (m_pWebBrowserEventHandler)219 {220 m_pWebBrowserEventHandler->NavigateComplete2(pDisp,url);221 }222 }223 224 void DuiLib::CWebBrowserUI::ProgressChange( LONG nProgress, LONG nProgressMax )225 {226 if (m_pWebBrowserEventHandler)227 {228 m_pWebBrowserEventHandler->ProgressChange(nProgress,nProgressMax);229 }230 }231 232 void DuiLib::CWebBrowserUI::NewWindow3( IDispatch **pDisp, VARIANT_BOOL *&Cancel, DWORD dwFlags, BSTR bstrUrlContext, BSTR bstrUrl )233 {234 if (m_pWebBrowserEventHandler)235 {236 m_pWebBrowserEventHandler->NewWindow3(pDisp,Cancel,dwFlags,bstrUrlContext,bstrUrl);237 }238 }239 void DuiLib::CWebBrowserUI::CommandStateChange(long Command,VARIANT_BOOL Enable)240 {241 if (m_pWebBrowserEventHandler)242 {243 m_pWebBrowserEventHandler->CommandStateChange(Command,Enable);244 }245 }246 void DuiLib::CWebBrowserUI::DocumentComplete()//2016.10.19247 {248 if (m_pWebBrowserEventHandler)249 {250 m_pWebBrowserEventHandler->DocumentComplete();251 }252 }253 254 // IDownloadManager255 STDMETHODIMP DuiLib::CWebBrowserUI::Download( /* [in] */ IMoniker *pmk, /* [in] */ IBindCtx *pbc, /* [in] */ DWORD dwBindVerb, /* [in] */ LONG grfBINDF, /* [in] */ BINDINFO *pBindInfo, /* [in] */ LPCOLESTR pszHeaders, /* [in] */ LPCOLESTR pszRedir, /* [in] */ UINT uiCP )256 {257 if (m_pWebBrowserEventHandler)258 {259 return m_pWebBrowserEventHandler->Download(pmk,pbc,dwBindVerb,grfBINDF,pBindInfo,pszHeaders,pszRedir,uiCP);260 }261 return S_OK;262 }263 264 // IDocHostUIHandler265 STDMETHODIMP DuiLib::CWebBrowserUI::ShowContextMenu( DWORD dwID, POINT* pptPosition, IUnknown* pCommandTarget, IDispatch* pDispatchObjectHit )266 {267 if (m_pWebBrowserEventHandler)268 {269 return m_pWebBrowserEventHandler->ShowContextMenu(dwID,pptPosition,pCommandTarget,pDispatchObjectHit);270 }271 return S_FALSE;272 }273 274 STDMETHODIMP DuiLib::CWebBrowserUI::GetHostInfo( DOCHOSTUIINFO* pInfo )275 {276 if (m_pWebBrowserEventHandler)277 {278 return m_pWebBrowserEventHandler->GetHostInfo(pInfo);279 }280 return E_NOTIMPL;281 }282 283 STDMETHODIMP DuiLib::CWebBrowserUI::ShowUI( DWORD dwID, IOleInPlaceActiveObject* pActiveObject, IOleCommandTarget* pCommandTarget, IOleInPlaceFrame* pFrame, IOleInPlaceUIWindow* pDoc )284 {285 if (m_pWebBrowserEventHandler)286 {287 return m_pWebBrowserEventHandler->ShowUI(dwID,pActiveObject,pCommandTarget,pFrame,pDoc);288 }289 return S_OK;290 }291 292 STDMETHODIMP DuiLib::CWebBrowserUI::HideUI()293 {294 if (m_pWebBrowserEventHandler)295 {296 return m_pWebBrowserEventHandler->HideUI();297 }298 return S_OK;299 }300 301 STDMETHODIMP DuiLib::CWebBrowserUI::UpdateUI()302 {303 if (m_pWebBrowserEventHandler)304 {305 return m_pWebBrowserEventHandler->UpdateUI();306 }307 return S_OK;308 }309 310 STDMETHODIMP DuiLib::CWebBrowserUI::EnableModeless( BOOL fEnable )311 {312 if (m_pWebBrowserEventHandler)313 {314 return m_pWebBrowserEventHandler->EnableModeless(fEnable);315 }316 return E_NOTIMPL;317 }318 319 STDMETHODIMP DuiLib::CWebBrowserUI::OnDocWindowActivate( BOOL fActivate )320 {321 if (m_pWebBrowserEventHandler)322 {323 return m_pWebBrowserEventHandler->OnDocWindowActivate(fActivate);324 }325 return E_NOTIMPL;326 }327 328 STDMETHODIMP DuiLib::CWebBrowserUI::OnFrameWindowActivate( BOOL fActivate )329 {330 if (m_pWebBrowserEventHandler)331 {332 return m_pWebBrowserEventHandler->OnFrameWindowActivate(fActivate);333 }334 return E_NOTIMPL;335 }336 337 STDMETHODIMP DuiLib::CWebBrowserUI::ResizeBorder( LPCRECT prcBorder, IOleInPlaceUIWindow* pUIWindow, BOOL fFrameWindow )338 {339 if (m_pWebBrowserEventHandler)340 {341 return m_pWebBrowserEventHandler->ResizeBorder(prcBorder,pUIWindow,fFrameWindow);342 }343 return E_NOTIMPL;344 }345 346 STDMETHODIMP DuiLib::CWebBrowserUI::TranslateAccelerator( LPMSG lpMsg, const GUID* pguidCmdGroup, DWORD nCmdID )347 {348 if (m_pWebBrowserEventHandler)349 {350 return m_pWebBrowserEventHandler->TranslateAccelerator(lpMsg,pguidCmdGroup,nCmdID);351 }352 return S_FALSE;353 }354 355 LRESULT DuiLib::CWebBrowserUI::TranslateAccelerator( MSG *pMsg )356 {357 if(pMsg->message < WM_KEYFIRST || pMsg->message > WM_KEYLAST)358 return S_FALSE;359 360 if( m_pWebBrowser2 == NULL )361 return E_NOTIMPL;362 363 // 当前Web窗口不是焦点,不处理加速键364 BOOL bIsChild = FALSE;365 HWND hTempWnd = NULL;366 HWND hWndFocus = ::GetFocus();367 368 hTempWnd = hWndFocus;369 while(hTempWnd != NULL)370 {371 if(hTempWnd == m_hwndHost)372 {373 bIsChild = TRUE;374 break;375 }376 hTempWnd = ::GetParent(hTempWnd);377 }378 if(!bIsChild)379 return S_FALSE;380 381 IOleInPlaceActiveObject *pObj;382 if (FAILED(m_pWebBrowser2->QueryInterface(IID_IOleInPlaceActiveObject, (LPVOID *)&pObj)))383 return S_FALSE;384 385 HRESULT hResult = pObj->TranslateAccelerator(pMsg);386 pObj->Release();387 return hResult;388 }389 390 STDMETHODIMP DuiLib::CWebBrowserUI::GetOptionKeyPath( LPOLESTR* pchKey, DWORD dwReserved )391 {392 if (m_pWebBrowserEventHandler)393 {394 return m_pWebBrowserEventHandler->GetOptionKeyPath(pchKey,dwReserved);395 }396 return E_NOTIMPL;397 }398 399 STDMETHODIMP DuiLib::CWebBrowserUI::GetDropTarget( IDropTarget* pDropTarget, IDropTarget** ppDropTarget )400 {401 if (m_pWebBrowserEventHandler)402 {403 return m_pWebBrowserEventHandler->GetDropTarget(pDropTarget,ppDropTarget);404 }405 return S_FALSE; // 使用系统拖拽406 }407 408 STDMETHODIMP DuiLib::CWebBrowserUI::GetExternal( IDispatch** ppDispatch )409 {410 if (m_pWebBrowserEventHandler)411 {412 return m_pWebBrowserEventHandler->GetExternal(ppDispatch);413 }414 return S_FALSE;415 }416 417 STDMETHODIMP DuiLib::CWebBrowserUI::TranslateUrl( DWORD dwTranslate, OLECHAR* pchURLIn, OLECHAR** ppchURLOut )418 {419 if (m_pWebBrowserEventHandler)420 {421 return m_pWebBrowserEventHandler->TranslateUrl(dwTranslate,pchURLIn,ppchURLOut);422 }423 else424 {425 *ppchURLOut = 0;426 return E_NOTIMPL;427 }428 }429 430 STDMETHODIMP DuiLib::CWebBrowserUI::FilterDataObject( IDataObject* pDO, IDataObject** ppDORet )431 {432 if (m_pWebBrowserEventHandler)433 {434 return m_pWebBrowserEventHandler->FilterDataObject(pDO,ppDORet);435 }436 else437 {438 *ppDORet = 0;439 return E_NOTIMPL;440 }441 }442 443 void DuiLib::CWebBrowserUI::SetWebBrowserEventHandler( CWebBrowserEventHandler* pEventHandler )444 {445 if ( pEventHandler!=NULL && m_pWebBrowserEventHandler!=pEventHandler)446 m_pWebBrowserEventHandler=pEventHandler;447 }448 449 void DuiLib::CWebBrowserUI::Refresh2( int Level )450 {451 CVariant vLevel;452 vLevel.vt=VT_I4;453 vLevel.intVal=Level;454 m_pWebBrowser2->Refresh2(&vLevel);455 }456 457 void DuiLib::CWebBrowserUI::SetAttribute( LPCTSTR pstrName, LPCTSTR pstrValue )458 {459 if (_tcscmp(pstrName, _T("homepage")) == 0)460 {461 m_sHomePage = pstrValue;462 }463 else if (_tcscmp(pstrName, _T("autonavi"))==0)464 {465 m_bAutoNavi = (_tcscmp(pstrValue, _T("true")) == 0);466 }467 else468 CActiveXUI::SetAttribute(pstrName, pstrValue);469 }470 471 void DuiLib::CWebBrowserUI::NavigateHomePage()472 {473 if (!m_sHomePage.IsEmpty())474 this->NavigateUrl(m_sHomePage);475 }476 477 void DuiLib::CWebBrowserUI::NavigateUrl( LPCTSTR lpszUrl )478 {479 if (m_pWebBrowser2 && lpszUrl)480 {481 m_pWebBrowser2->Navigate((BSTR)SysAllocString(T2BSTR(lpszUrl)),NULL,NULL,NULL,NULL);482 }483 }484 485 LPCTSTR DuiLib::CWebBrowserUI::GetClass() const486 {487 return _T("WebBrowserUI");488 }489 490 LPVOID DuiLib::CWebBrowserUI::GetInterface( LPCTSTR pstrName )491 {492 if( _tcscmp(pstrName, DUI_CTR_WEBBROWSER) == 0 ) return static_cast (this);493 return CActiveXUI::GetInterface(pstrName);494 }495 496 void DuiLib::CWebBrowserUI::SetHomePage( LPCTSTR lpszUrl )497 {498 m_sHomePage.Format(_T("%s"),lpszUrl);499 }500 501 LPCTSTR DuiLib::CWebBrowserUI::GetHomePage()502 {503 return m_sHomePage;504 }505 506 void DuiLib::CWebBrowserUI::SetAutoNavigation( bool bAuto /*= TRUE*/ )507 {508 if (m_bAutoNavi==bAuto) return;509 510 m_bAutoNavi=bAuto;511 }512 513 bool DuiLib::CWebBrowserUI::IsAutoNavigation()514 {515 return m_bAutoNavi;516 }517 518 STDMETHODIMP DuiLib::CWebBrowserUI::QueryService( REFGUID guidService, REFIID riid, void** ppvObject )519 {520 HRESULT hr = E_NOINTERFACE;521 *ppvObject = NULL;522 523 if ( guidService == SID_SDownloadManager && riid == IID_IDownloadManager)524 {525 *ppvObject = this;526 return S_OK;527 }528 529 return hr;530 }531 532 HRESULT DuiLib::CWebBrowserUI::RegisterEventHandler( BOOL inAdvise )533 {534 CComPtr pWebBrowser;535 CComPtr pCPC;536 CComPtr pCP;537 HRESULT hr = GetControl(IID_IWebBrowser2, (void**)&pWebBrowser);538 if (FAILED(hr))539 return hr;540 hr=pWebBrowser->QueryInterface(IID_IConnectionPointContainer,(void **)&pCPC);541 if (FAILED(hr))542 return hr;543 hr=pCPC->FindConnectionPoint(DIID_DWebBrowserEvents2,&pCP);544 if (FAILED(hr))545 return hr;546 547 if (inAdvise)548 {549 hr = pCP->Advise((IDispatch*)this, &m_dwCookie);550 }551 else552 {553 hr = pCP->Unadvise(m_dwCookie);554 }555 return hr; 556 }557 558 DISPID DuiLib::CWebBrowserUI::FindId( IDispatch *pObj, LPOLESTR pName )559 {560 DISPID id = 0;561 if(FAILED(pObj->GetIDsOfNames(IID_NULL,&pName,1,LOCALE_SYSTEM_DEFAULT,&id))) id = -1;562 return id;563 }564 565 HRESULT DuiLib::CWebBrowserUI::InvokeMethod( IDispatch *pObj, LPOLESTR pMehtod, VARIANT *pVarResult, VARIANT *ps, int cArgs )566 {567 DISPID dispid = FindId(pObj, pMehtod);568 if(dispid == -1) return E_FAIL;569 570 DISPPARAMS dispparams;571 dispparams.cArgs = cArgs;572 dispparams.rgvarg = ps;573 dispparams.cNamedArgs = 0;574 dispparams.rgdispidNamedArgs = NULL;575 576 return pObj->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &dispparams, pVarResult, NULL, NULL);577 }578 579 HRESULT DuiLib::CWebBrowserUI::GetProperty( IDispatch *pObj, LPOLESTR pName, VARIANT *pValue )580 {581 DISPID dispid = FindId(pObj, pName);582 if(dispid == -1) return E_FAIL;583 584 DISPPARAMS ps;585 ps.cArgs = 0;586 ps.rgvarg = NULL;587 ps.cNamedArgs = 0;588 ps.rgdispidNamedArgs = NULL;589 590 return pObj->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &ps, pValue, NULL, NULL);591 }592 593 HRESULT DuiLib::CWebBrowserUI::SetProperty( IDispatch *pObj, LPOLESTR pName, VARIANT *pValue )594 {595 DISPID dispid = FindId(pObj, pName);596 if(dispid == -1) return E_FAIL;597 598 DISPPARAMS ps;599 ps.cArgs = 1;600 ps.rgvarg = pValue;601 ps.cNamedArgs = 0;602 ps.rgdispidNamedArgs = NULL;603 604 return pObj->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYPUT, &ps, NULL, NULL, NULL);605 }606 607 IDispatch* DuiLib::CWebBrowserUI::GetHtmlWindow()608 {609 IDispatch* pDp = NULL;610 HRESULT hr;611 if (m_pWebBrowser2)612 hr=m_pWebBrowser2->get_Document(&pDp);613 614 if (FAILED(hr))615 return NULL;616 617 CComQIPtr pHtmlDoc2 = pDp;618 619 if (pHtmlDoc2 == NULL)620 return NULL;621 622 hr=pHtmlDoc2->get_parentWindow(&_pHtmlWnd2);623 624 if (FAILED(hr))625 return NULL;626 627 IDispatch *pHtmlWindown = NULL;628 hr=_pHtmlWnd2->QueryInterface(IID_IDispatch, (void**)&pHtmlWindown);629 if (FAILED(hr))630 return NULL;631 632 return pHtmlWindown;633 }634 635 IWebBrowser2* DuiLib::CWebBrowserUI::GetWebBrowser2( void )636 {637 return m_pWebBrowser2;638 }639 640 HRESULT STDMETHODCALLTYPE DuiLib::CWebBrowserUI::QueryStatus( __RPC__in_opt const GUID *pguidCmdGroup, ULONG cCmds, __RPC__inout_ecount_full(cCmds ) OLECMD prgCmds[ ], __RPC__inout_opt OLECMDTEXT *pCmdText )641 {642 HRESULT hr = OLECMDERR_E_NOTSUPPORTED;643 return hr;644 }645 646 HRESULT STDMETHODCALLTYPE DuiLib::CWebBrowserUI::Exec( __RPC__in_opt const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, __RPC__in_opt VARIANT *pvaIn, __RPC__inout_opt VARIANT *pvaOut )647 {648 HRESULT hr = S_OK;649 650 if (pguidCmdGroup && IsEqualGUID(*pguidCmdGroup, CGID_DocHostCommandHandler))651 {652 653 switch (nCmdID) 654 {655 656 case OLECMDID_SHOWSCRIPTERROR:657 {658 IHTMLDocument2* pDoc = NULL;659 IHTMLWindow2* pWindow = NULL;660 IHTMLEventObj* pEventObj = NULL;661 BSTR rgwszNames[5] = 662 { 663 SysAllocString(L"errorLine"),664 SysAllocString(L"errorCharacter"),665 SysAllocString(L"errorCode"),666 SysAllocString(L"errorMessage"),667 SysAllocString(L"errorUrl")668 };669 DISPID rgDispIDs[5];670 VARIANT rgvaEventInfo[5];671 DISPPARAMS params;672 BOOL fContinueRunningScripts = true;673 int i;674 675 params.cArgs = 0;676 params.cNamedArgs = 0;677 678 // Get the document that is currently being viewed.679 hr = pvaIn->punkVal->QueryInterface(IID_IHTMLDocument2, (void **) &pDoc); 680 // Get document.parentWindow.681 hr = pDoc->get_parentWindow(&pWindow);682 pDoc->Release();683 // Get the window.event object.684 hr = pWindow->get_event(&pEventObj);685 // Get the error info from the window.event object.686 for (i = 0; i < 5; i++) 687 { 688 // Get the property's dispID.689 hr = pEventObj->GetIDsOfNames(IID_NULL, &rgwszNames[i], 1, 690 LOCALE_SYSTEM_DEFAULT, &rgDispIDs[i]);691 // Get the value of the property.692 hr = pEventObj->Invoke(rgDispIDs[i], IID_NULL,693 LOCALE_SYSTEM_DEFAULT,694 DISPATCH_PROPERTYGET, ¶ms, &rgvaEventInfo[i],695 NULL, NULL);696 SysFreeString(rgwszNames[i]);697 }698 699 // At this point, you would normally alert the user with 700 // the information about the error, which is now contained701 // in rgvaEventInfo[]. Or, you could just exit silently.702 703 (*pvaOut).vt = VT_BOOL;704 if (fContinueRunningScripts)705 {706 // Continue running scripts on the page.707 (*pvaOut).boolVal = VARIANT_TRUE;708 }709 else710 {711 // Stop running scripts on the page.712 (*pvaOut).boolVal = VARIANT_FALSE; 713 } 714 break;715 }716 default:717 hr = OLECMDERR_E_NOTSUPPORTED;718 break;719 }720 }721 else722 {723 hr = OLECMDERR_E_UNKNOWNGROUP;724 }725 return (hr);726 }
带参数的: