国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
定制瀏覽器 - IE編程 - vc++ c++ c 程序開發(fā)(vc學習園地
定制瀏覽器下載本文示例代碼
瀏覽器控件是個典型的Active控件,提供了大量的接口及自動化對象,可以靈活的加以控制,需要的時候,可以通過這些接口控制瀏覽器的行為,或提供相應的出接口定制瀏覽器。
一、概述
瀏覽器對象CLSID:
CLSID_WebBrowser
提供的主要接口
IWebBrowser2 瀏覽器的接口
當文檔建立后,可以得到相應的文檔接口,文檔中各標記元素的接口。
在DHTML中,大量的對象和事件就是又這些接口提供和管理的。
IHTMLDocument2
IHTMLWindow2
IHTMLEventObj
IHTMLElement
....
瀏覽器還將調(diào)用宿主提供的接口,以發(fā)出事件或給用戶提供定制機會。
出接口
DIID_DWebBrowserEvents2
DIID_HTMLDocumentEvents
DIID_HTMLWindowEvents
(ICustomDoc)
IDocHostUIHandler
二、事件的相應
除了使用MFC缺省的事件響應機制外,也可以自建事件接受器,來響應事件
也就是,在封裝對象中提供DIID_DWebBrowserEvents2 接口,然后將此接口作為接受器連接到瀏覽器對象。
一種做法是
在派生類中,使用MFC建立接口方案提供一個DIID_DWebBrowserEvents2接口對象嵌套成員。
class CFMDBrowser : public CWebBrowser { ... //事件接收器接口 //DWebBrowserEvents //這是一個IDispatch分發(fā)接口 BEGIN_INTERFACE_PART(BrowserEventSink,DWebBrowserEvents) STDMETHOD(GetTypeInfoCount)(UINT *pctinfo); STDMETHOD(GetTypeInfo)(UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo); STDMETHOD(GetIDsOfNames)(REFIID riid, LPOLESTR *rgszNames,UINT cNames, LCID lcid,DISPID *rgDispId); STDMETHOD(Invoke)(DISPID dispIdMember,REFIID riid,LCID lcid, WORD wFlags,DISPPARAMS *pDispParams, VARIANT *pVarResult,EXCEPINFO *pExcepInfo, UINT *puArgErr); END_INTERFACE_PART(BrowserEventSink) DWORD m_dwEventSinkCookie; ... }
這是一個接收器接口,無需添入到對象的接口表中。
(無需:BEGIN_INTERFACE_MAP、END_INTERFACE_MAP)
這是一個以分發(fā)接口(IDispatch)作為出接口的典型例子。在接口函數(shù)的實現(xiàn)中。Invoke負責又分發(fā)ID調(diào)用不同的虛擬函數(shù)。(事件函數(shù)作為虛擬函數(shù),供派生類重載)
STDMETHODIMP CFMDBrowser::XBrowserEventSink::Invoke(DISPID dispIdMember,REFIID riid,LCID lcid, WORD wFlags,DISPPARAMS *pDispParams, VARIANT *pVarResult,EXCEPINFO *pExcepInfo, UINT *puArgErr) { METHOD_PROLOGUE(CFMDBrowser,BrowserEventSink) //將事件分發(fā)到各虛擬函數(shù) //分發(fā)ID的定義見 exdispid.h switch(dispIdMember) { case DISPID_BEFORENAVIGATE: ... HRESULT hr=pThis->OnBeforeNavigate(..) //事件對應的虛擬函數(shù) ... break; case DISPID_NAVIGATECOMPLETE: ... case ... case ... }
建立與瀏覽器的連接
得到IConnectionPointContainer接口,查找與DIID_DWebBrowserEvents對應的接收器,建立連接,記錄連接的標號(m_dwEventSinkCookie);
BOOL CFMDBrowser::Connect() { IUnknown *p_Unk=GetControlUnknown(); if(p_Unk==NULL) return FALSE; BOOL bOK=FALSE; //查找連接點對象 IConnectionPointContainer *i_cpc=0; HRESULT hr=p_Unk->QueryInterface(IID_IConnectionPointContainer, (void **)(&i_cpc)); if (SUCCEEDED(hr)) { IConnectionPoint *i_cp=0; hr=i_cpc->FindConnectionPoint(DIID_DWebBrowserEvents,&i_cp); if (SUCCEEDED(hr)) { hr=i_cp->Advise(&m_xBrowserEventSink,&m_dwEventSinkCookie); i_cp->Release(); bOK=TRUE; } i_cpc->Release(); } return bOK; }
結(jié)束時,斷開與瀏覽器的連接
BOOL CFMDBrowser::DisConnect() { IUnknown *p_Unk=GetControlUnknown(); if(p_Unk==NULL) return FALSE; BOOL bOK=FALSE; //查找連接點對象 IConnectionPointContainer *i_cpc=0; HRESULT hr=p_Unk->QueryInterface(IID_IConnectionPointContainer, (void **)(&i_cpc)); if (SUCCEEDED(hr)) { IConnectionPoint *i_cp=0; hr=i_cpc->FindConnectionPoint(DIID_DWebBrowserEvents,&i_cp); if (SUCCEEDED(hr)) { hr=i_cp->Unadvise(m_dwEventSinkCookie); i_cp->Release(); bOK=TRUE; } i_cpc->Release(); } return bOK; }
三、定制瀏覽器UI
瀏覽器提供了IDocHostUIHandler出接口,向用戶查詢界面特性
可以提供這個接口,與瀏覽器連接上,在其實現(xiàn)中,定制界面
1.建立接口
class CFMDBrowser : public CWebBrowser { ... //IDocHostUIHandler接口,控制瀏覽器界面 BEGIN_INTERFACE_PART(UIHandlerSink,IDocHostUIHandler) STDMETHOD(ShowContextMenu)(DWORD,POINT*,IUnknown*,IDispatch*); STDMETHOD(GetHostInfo)(DOCHOSTUIINFO*); STDMETHOD(ShowUI)(DWORD, IOleInPlaceActiveObject*, IOleCommandTarget*, IOleInPlaceFrame*, IOleInPlaceUIWindow*); STDMETHOD(HideUI)(); STDMETHOD(UpdateUI)(); STDMETHOD(EnableModeless)(INT); STDMETHOD(OnDocWindowActivate)(INT); STDMETHOD(OnFrameWindowActivate)(INT); STDMETHOD(ResizeBorder)(LPCRECT,IOleInPlaceUIWindow*,INT); STDMETHOD(TranslateAccelerator)(LPMSG,const GUID*,DWORD); STDMETHOD(GetOptionKeyPath)(LPOLESTR*,DWORD); STDMETHOD(GetDropTarget)(IDropTarget*,IDropTarget**); STDMETHOD(GetExternal)(IDispatch**); STDMETHOD(TranslateUrl)(DWORD,OLECHAR*,OLECHAR**); STDMETHOD(FilterDataObject)(IDataObject*,IDataObject**); END_INTERFACE_PART(UIHandlerSink) ... }
無需添加接口映射
2.連接到瀏覽器
需要在NavigateComplete時間發(fā)生后,得到
ICustomDoc接口,由此接口的
SetUIHandler成員設置UI接口。
//設置界面接口 IDispatch *i_dispatch=0; if (SUCCEEDED(i_dispatch=pThis->GetDocument())) { IHTMLDocument2 *i_htmldoc2=0; if (SUCCEEDED(i_dispatch->QueryInterface(IID_IHTMLDocument2, (void **)(&i_htmldoc2)))) { // force connection of IDocHostUIHandler ICustomDoc *i_customdoc=0; if (SUCCEEDED(i_htmldoc2->QueryInterface( IID_ICustomDoc, (void **)(&i_customdoc)))) { i_customdoc->SetUIHandler( &(pThis->m_xUIHandlerSink)); i_customdoc->Release(); } } i_dispatch->Release(); }
3.在接口的實現(xiàn)中,控制用戶界面
例如更改右鍵菜單
在STDMETHOD(ShowContextMenu)(DWORD,POINT*,IUnknown*,IDispatch*);
的實現(xiàn)中:
HRESULT CFMDBrowser::ShowContextMenu(DWORD,POINT*,IUnknown*,IDispatch*) { ..建立自己的菜單 return S_OK; }
下載本文示例代碼
本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
人生如夢,你我皆過客,來去匆匆......
VC調(diào)用COM的方法總結(jié)
COM 組件設計與應用(十一)
去除WebBrowser控件的邊界和ScrollBar
COM/ATL通信原理
開發(fā)OFFICE插件總結(jié) - 在夢想的天空自由飛翔 - C 博客
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服