日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

控制 WebBrowser 控件的外观和行为

發布時間:2025/3/20 编程问答 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 控制 WebBrowser 控件的外观和行为 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

控制 WebBrowser 控件的外觀和行為 2011-03-23 09:33

在 CSDN 上經常看到以下兩個問題:
1、在 MFC 應用程序中,如果創建了一個 WebBrowser 控件(包括 CHtmlView 在內),如何可以把該控件的三維邊框禁止掉?
2、在 MFC 應用程序中,如果創建了一個 WebBrowser 控件(包括 CHtmlView 在內),如何可以把該控件的滾動條禁止掉?

其實,這兩個問題的解決辦法是一樣的。待老漢從頭道來。

從 Internet Explorer 4.0 開始,WebBrowser 控件的容器可以通過 IDocHostUIHandler 接口對 WebBrowser 控件的外觀和某些行為進行定制。上述的兩個問題,均可以通過實現該接口來達到我們的目的。但是,由于程序員自己實現 WebBrowser 控件的容器是一件很痛苦的事情,而且 MFC 中的 CHtmlView 和在 IDE 中插入 WebBrowser 控件后生成的包裝類已經具有比較完整的功能封裝,故罕有人愿意從頭再開發自己的容器。不過令人遺憾的是,隨 Visual C++ 6.0 發布的 MFC 4.2 版本中并沒有對 IDocHostUIHandler 接口進行支持(順便說一句,從 Visual C++ 7.0 開始,MFC 已經對該接口進行了支持),所以這些問題在 Visual C++ 6.0 中比較突出。

為了解決此問題,老漢特意寫了一個類來完成此工作(代碼見下)。該類名為 CWebUIController,使用很簡單,以對話框上包含了 WebBrowser 控件為例:

假設對話框上的 WebBrowser 控件對應的變量名為 m_webNavigator,則需要以下步驟:

1、向對話框類中添加 CWebUIController m_webUICtrl;

2、在對話框的 OnInitDialog 函數中加入以下代碼:

m_webADCtrl = NULL;
??LPUNKNOWN pUnk1 = m_web.GetControlUnknown();
??if(pUnk1 != NULL)
??{
???IWebBrowser2* pWB2 = NULL;
???HRESULT hr = pUnk1->QueryInterface(IID_IWebBrowser2, (void**)&pWB2);
???if(SUCCEEDED(hr) && pWB2 != NULL)
???{
????if (!m_webADCtrl)
????{
?????m_webADCtrl = new CWebUIController();
????}
????m_webADCtrl->AddRef();
????
????m_webADCtrl->Enable3DBorder(TRUE);???? // 此代碼禁止三維邊框
????m_webADCtrl->EnableScrollBar(FALSE); // 此代碼禁止滾動條
????m_webADCtrl->SetWebBrowser(pWB2);
????m_webADCtrl->Release();
????pWB2->Release();
???}
??}

?

3、在對話框的 OnDestroy 函數中加入以下代碼:

m_webADCtrl->SetWebBrowser( NULL );

?

也可以在運行時調用 Enable3DBorder() 或者 EnableScrollBar(),調用完成后請調用 WebBrowser 控件的刷新功能。

該類實現于一個獨立的頭文件 WebUIController.h 中,其完整源代碼如下;從源代碼中不難看出,還可以很容易的擴充此類的功能,例如控制關聯菜單的顯示等等。

WebUIController.h 源代碼:

// class name: CWebUIController // author: Dandy Cheung // email: dandycheung@21cn.com // date: 2005-3-18#ifndef __WEBUICONTROLLER_H__ #define __WEBUICONTROLLER_H__#if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000#include <MSHTMHST.H> #include <EXDISP.H> #include <EXDISPID.H>inline HRESULT _CoAdvise(IUnknown* pUnkCP, IUnknown* pUnk, const IID& iid, LPDWORD pdw) {IConnectionPointContainer* pCPC = NULL;IConnectionPoint* pCP = NULL;HRESULT hRes = pUnkCP->QueryInterface(IID_IConnectionPointContainer, (void**)&pCPC);if(SUCCEEDED(hRes) && pCPC != NULL){hRes = pCPC->FindConnectionPoint(iid, &pCP);if(SUCCEEDED(hRes) && pCP != NULL){hRes = pCP->Advise(pUnk, pdw);pCP->Release();}pCPC->Release();}return hRes; }inline HRESULT _CoUnadvise(IUnknown* pUnkCP, const IID& iid, DWORD dw) {IConnectionPointContainer* pCPC = NULL;IConnectionPoint* pCP = NULL;HRESULT hRes = pUnkCP->QueryInterface(IID_IConnectionPointContainer, (void**)&pCPC);if(SUCCEEDED(hRes) && pCPC != NULL){hRes = pCPC->FindConnectionPoint(iid, &pCP);if(SUCCEEDED(hRes) && pCP != NULL){hRes = pCP->Unadvise(dw);pCP->Release();}pCPC->Release();}return hRes; }class CWebUIController : public DWebBrowserEvents2, public IDocHostUIHandler {ULONG m_uRefCount;IWebBrowser2* m_pWebBrowser2;DWORD m_dwCookie;BOOL m_bEnable3DBorder;BOOL m_bEnableScrollBar;public:CWebUIController() : m_uRefCount(0), m_pWebBrowser2(NULL), m_dwCookie(0){m_bEnable3DBorder = TRUE;m_bEnableScrollBar = TRUE;}virtual ~CWebUIController(){}protected:// IUnknown MethodsSTDMETHOD(QueryInterface)(REFIID riid, void** ppvObject){*ppvObject = NULL;if(IsEqualGUID(riid, DIID_DWebBrowserEvents2) ||IsEqualGUID(riid, IID_IDispatch)){*ppvObject = (DWebBrowserEvents2*)this;AddRef();return S_OK;}else if(IsEqualGUID(riid, IID_IDocHostUIHandler) ||IsEqualGUID(riid, IID_IUnknown)){*ppvObject = (IDocHostUIHandler*)this;AddRef();return S_OK;}return E_NOINTERFACE;}STDMETHOD_(ULONG, AddRef)(void){m_uRefCount++;return m_uRefCount;}STDMETHOD_(ULONG, Release)(void){m_uRefCount--;ULONG uRefCount = m_uRefCount;if(uRefCount == 0)delete this;return uRefCount;}// IDispatch MethodsSTDMETHOD(GetTypeInfoCount)(unsigned int FAR* pctinfo){return E_NOTIMPL;}STDMETHOD(GetTypeInfo)(UINT itinfo, LCID lcid, ITypeInfo** pptinfo) {return E_NOTIMPL;}STDMETHOD(GetIDsOfNames)(REFIID riid, OLECHAR FAR* FAR* rgszNames, unsigned int cNames, LCID lcid, DISPID FAR* rgDispId){return E_NOTIMPL;}STDMETHOD(Invoke)(DISPID dispidMember,REFIID riid, LCID lcid, WORD wFlags,DISPPARAMS* pDispParams, VARIANT* pvarResult,EXCEPINFO* pexcepinfo, UINT* puArgErr){if(!pDispParams)return E_INVALIDARG;switch(dispidMember){//// The parameters for this DISPID are as follows:// [0]: URL to navigate to - VT_BYREF|VT_VARIANT// [1]: An object that evaluates to the top-level or frame// WebBrowser object corresponding to the event. case DISPID_NAVIGATECOMPLETE2://// The IDocHostUIHandler association must be set// up every time we navigate to a new page.//if(pDispParams->cArgs >= 2 && pDispParams->rgvarg[1].vt == VT_DISPATCH)SetCustomDoc(pDispParams->rgvarg[1].pdispVal);elsereturn E_INVALIDARG;break;default:break;}return S_OK;}// IDocHostUIHandler Methods protected:STDMETHOD(ShowContextMenu)(DWORD dwID, POINT FAR* ppt, IUnknown FAR* pcmdtReserved,IDispatch FAR* pdispReserved){return E_NOTIMPL;}STDMETHOD(GetHostInfo)(DOCHOSTUIINFO FAR* pInfo){if(pInfo != NULL){pInfo->dwFlags |= (m_bEnable3DBorder ? 0 : DOCHOSTUIFLAG_NO3DBORDER);pInfo->dwFlags |= (m_bEnableScrollBar ? 0 : DOCHOSTUIFLAG_SCROLL_NO);}return S_OK;}STDMETHOD(ShowUI)(DWORD dwID, IOleInPlaceActiveObject FAR* pActiveObject,IOleCommandTarget FAR* pCommandTarget,IOleInPlaceFrame FAR* pFrame,IOleInPlaceUIWindow FAR* pDoc){return E_NOTIMPL;}STDMETHOD(HideUI)(void){return E_NOTIMPL;}STDMETHOD(UpdateUI)(void){return E_NOTIMPL;}STDMETHOD(EnableModeless)(BOOL fEnable){return E_NOTIMPL;}STDMETHOD(OnDocWindowActivate)(BOOL fActivate){return E_NOTIMPL;}STDMETHOD(OnFrameWindowActivate)(BOOL fActivate){return E_NOTIMPL;}STDMETHOD(ResizeBorder)(LPCRECT prcBorder, IOleInPlaceUIWindow FAR* pUIWindow,BOOL fRameWindow){return E_NOTIMPL;}STDMETHOD(TranslateAccelerator)(LPMSG lpMsg, const GUID FAR* pguidCmdGroup,DWORD nCmdID){return E_NOTIMPL;}STDMETHOD(GetOptionKeyPath)(LPOLESTR FAR* pchKey, DWORD dw){return E_NOTIMPL;}STDMETHOD(GetDropTarget)(IDropTarget* pDropTarget,IDropTarget** ppDropTarget){return E_NOTIMPL;}STDMETHOD(GetExternal)(IDispatch** ppDispatch){return E_NOTIMPL;}STDMETHOD(TranslateUrl)(DWORD dwTranslate, OLECHAR* pchURLIn,OLECHAR** ppchURLOut){return E_NOTIMPL;}STDMETHOD(FilterDataObject)(IDataObject* pDO, IDataObject** ppDORet){return E_NOTIMPL;}public:HRESULT SetWebBrowser(IWebBrowser2* pWebBrowser2){// Unadvise the event sink, if there was a// previous reference to the WebBrowser control.if(m_pWebBrowser2){_CoUnadvise(m_pWebBrowser2, DIID_DWebBrowserEvents2, m_dwCookie);m_dwCookie = 0;// _CoUnadvise中就已經被Release
// m_pWebBrowser2->Release();}m_pWebBrowser2 = pWebBrowser2;if(pWebBrowser2 == NULL)return S_OK;m_pWebBrowser2->AddRef();return _CoAdvise(m_pWebBrowser2, (IDispatch*)this, DIID_DWebBrowserEvents2, &m_dwCookie);}void Enable3DBorder(BOOL bEnable = TRUE){m_bEnable3DBorder = bEnable;}void EnableScrollBar(BOOL bEnable = TRUE){m_bEnableScrollBar = bEnable;}private:void SetCustomDoc(LPDISPATCH lpDisp){if(lpDisp == NULL)return;IWebBrowser2* pWebBrowser2 = NULL;HRESULT hr = lpDisp->QueryInterface(IID_IWebBrowser2, (void**)&pWebBrowser2);if(SUCCEEDED(hr) && pWebBrowser2){IDispatch* pDoc = NULL;hr = pWebBrowser2->get_Document(&pDoc);if(SUCCEEDED(hr) && pDoc){ICustomDoc* pCustDoc = NULL;hr = pDoc->QueryInterface(IID_ICustomDoc, (void**)&pCustDoc);if(SUCCEEDED(hr) && pCustDoc != NULL){pCustDoc->SetUIHandler(this);pCustDoc->Release();}pDoc->Release();}pWebBrowser2->Release();}} };#endif // __WEBUICONTROLLER_H__
以上方式實現后在打開web頁后如果設置未起效,這時你應該調用web控件的刷新功能刷新一下頁面即可! 還有一點打開頁面應該放在設置之后進行!

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的控制 WebBrowser 控件的外观和行为的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。