zoukankan      html  css  js  c++  java
  • duilib 的IE浏览器控件去边框和去滚动条的代码

     近些天在duilib群里经常有朋友问起,怎么让duilib的IE控件可以去边框,去滚动条的问题,或者是如何去控件IE控件的行为。为了避免重复的回答,我就写一篇博文,把处理方法说明一下。

            duilib中有Webbrowser控件,是继承ActivexUI控件后针对IE进行的封装,使用IE控件的话就用他了。这个控件留了一个接口名为SetWebBrowserEventHandler,这个函数用了指定一个事件处理器,来控制IE的行为。而这个函数需要一个CWebBrowserEventHandler对象指针,这个CWebBrowserEventHandler类在duilib的Utils目录中已经写好了,是一个基本的事件处理器框架,只要重写这个CWebBrowserEventHandler类的GetHostInfo函数就可以控制去掉IE浏览器的边框和滚动条,同时还有其他功能,比如控制是否可以显示IE右键菜单,NavigateComplete2来截获浏览器加载完毕的事件等等。

            所以我们如果要去控制浏览器,那么正确的做法就是写一个类,继承CWebBrowserEventHandler然后重写你需要的函数。我简单写了一个名叫CCustomWebEventHandler,代码如下:

    #ifndef _CCUSTOM_WEBBROWSER_EVENT_HANDLER_H_
    #define _CCUSTOM_WEBBROWSER_EVENT_HANDLER_H_
    
    #pragma once
    class CCustomWebEventHandler:public CWebBrowserEventHandler
    {
    public:
        CCustomWebEventHandler() {}
        ~CCustomWebEventHandler() {}
    
        virtual void BeforeNavigate2( IDispatch *pDisp,VARIANT *&url,VARIANT *&Flags,VARIANT *&TargetFrameName,VARIANT *&PostData,VARIANT *&Headers,VARIANT_BOOL *&Cancel ) {}
        virtual void NavigateError(IDispatch *pDisp,VARIANT * &url,VARIANT *&TargetFrameName,VARIANT *&StatusCode,VARIANT_BOOL *&Cancel) {}
        virtual void NavigateComplete2(IDispatch *pDisp,VARIANT *&url){    }
    
        virtual void ProgressChange(LONG nProgress, LONG nProgressMax){}
        virtual void NewWindow3(IDispatch **pDisp, VARIANT_BOOL *&Cancel, DWORD dwFlags, BSTR bstrUrlContext, BSTR bstrUrl){}
        virtual void CommandStateChange(long Command,VARIANT_BOOL Enable){}
    
        // interface IDocHostUIHandler
        virtual HRESULT STDMETHODCALLTYPE ShowContextMenu(
            /* [in] */ DWORD dwID,
            /* [in] */ POINT __RPC_FAR *ppt,
            /* [in] */ IUnknown __RPC_FAR *pcmdtReserved,
            /* [in] */ IDispatch __RPC_FAR *pdispReserved)
        {
            return S_OK;
            //return S_FALSE
        }
    
        virtual HRESULT STDMETHODCALLTYPE GetHostInfo(
            /* [out][in] */ DOCHOSTUIINFO __RPC_FAR *pInfo)
        {
            if (pInfo != NULL)
            {        
                pInfo->cbSize = sizeof(DOCHOSTUIINFO);  
                pInfo->dwDoubleClick = DOCHOSTUIDBLCLK_DEFAULT;  
                pInfo->dwFlags |= DOCHOSTUIFLAG_NO3DBORDER | DOCHOSTUIFLAG_THEME | 
                    DOCHOSTUIFLAG_NO3DOUTERBORDER | DOCHOSTUIFLAG_DIALOG |
                    DOCHOSTUIFLAG_DISABLE_HELP_MENU;//| DOCHOSTUIFLAG_SCROLL_NO;;
    
                //这里还可以加其他代码来控制网页
                 //LPWSTR m_pZoom = L"BODY{Zoom:100%;}";
                //pInfo->pchHostCss = (LPWSTR)::CoTaskMemAlloc((lstrlenW(m_pZoom)+1)*2);
                //lstrcpyW(pInfo->pchHostCss, m_pZoom);
            }
    
            return S_OK;
            
        }
    
        virtual HRESULT STDMETHODCALLTYPE ShowUI(
            /* [in] */ DWORD dwID,
            /* [in] */ IOleInPlaceActiveObject __RPC_FAR *pActiveObject,
            /* [in] */ IOleCommandTarget __RPC_FAR *pCommandTarget,
            /* [in] */ IOleInPlaceFrame __RPC_FAR *pFrame,
            /* [in] */ IOleInPlaceUIWindow __RPC_FAR *pDoc)
        {
            return S_FALSE;
        }
    
        virtual HRESULT STDMETHODCALLTYPE HideUI( void)
        {
            return S_OK;
        }
    
        virtual HRESULT STDMETHODCALLTYPE UpdateUI( void)
        {
            return S_OK;
        }
    
        virtual HRESULT STDMETHODCALLTYPE EnableModeless(
            /* [in] */ BOOL fEnable)
        {
            return S_OK;
        }
    
        virtual HRESULT STDMETHODCALLTYPE OnDocWindowActivate(
            /* [in] */ BOOL fActivate)
        {
            return S_OK;
        }
    
        virtual HRESULT STDMETHODCALLTYPE OnFrameWindowActivate(
            /* [in] */ BOOL fActivate)
        {
            return S_OK;
        }
    
        virtual HRESULT STDMETHODCALLTYPE ResizeBorder(
            /* [in] */ LPCRECT prcBorder,
            /* [in] */ IOleInPlaceUIWindow __RPC_FAR *pUIWindow,
            /* [in] */ BOOL fRameWindow)
        {
            return S_OK;
        }
    
        virtual HRESULT STDMETHODCALLTYPE TranslateAccelerator(
            /* [in] */ LPMSG lpMsg,
            /* [in] */ const GUID __RPC_FAR *pguidCmdGroup,
            /* [in] */ DWORD nCmdID)
        {
            return S_OK;
        }
    
        virtual HRESULT STDMETHODCALLTYPE GetOptionKeyPath(
            /* [out] */ LPOLESTR __RPC_FAR *pchKey,
            /* [in] */ DWORD dw)
        {
            return S_OK;
        }
    
        virtual HRESULT STDMETHODCALLTYPE GetDropTarget(
            /* [in] */ IDropTarget __RPC_FAR *pDropTarget,
            /* [out] */ IDropTarget __RPC_FAR *__RPC_FAR *ppDropTarget)
        {
            return S_OK;
        }
    
        virtual HRESULT STDMETHODCALLTYPE GetExternal(
            /* [out] */ IDispatch __RPC_FAR *__RPC_FAR *ppDispatch)
        {
            return S_OK;
        }
    
        virtual HRESULT STDMETHODCALLTYPE TranslateUrl(
            /* [in] */ DWORD dwTranslate,
            /* [in] */ OLECHAR __RPC_FAR *pchURLIn,
            /* [out] */ OLECHAR __RPC_FAR *__RPC_FAR *ppchURLOut)
        {
            return S_OK;
        }
    
        virtual HRESULT STDMETHODCALLTYPE FilterDataObject(
            /* [in] */ IDataObject __RPC_FAR *pDO,
            /* [out] */ IDataObject __RPC_FAR *__RPC_FAR *ppDORet)
        {
            return S_OK;
        }
    
        //     virtual HRESULT STDMETHODCALLTYPE GetOverrideKeyPath( 
        //         /* [annotation][out] */ 
        //         __deref_out  LPOLESTR *pchKey,
        //         /* [in] */ DWORD dw)
        //     {
        //         return E_NOTIMPL;
        //     }
    
        // IDownloadManager
        virtual HRESULT STDMETHODCALLTYPE 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)
        {
            return S_OK;
        }
    };
    
    #endif //_CCUSTOM_WEBBROWSER_EVENT_HANDLER_H_

    使用他的方法如下:

            首先在xml中写入一个Webbrowser控件并且在c++代码中通过FindControl找到这个控件的指针,然后写类似的代码:

        CWebBrowserUI* pActiveXUI = static_cast<CWebBrowserUI*>(m_PaintManager.FindControl(_T("ActiveXDemo1")));
    
        if( pActiveXUI ) 
        {
            pActiveXUI->SetDelayCreate(false);
            CCustomWebEventHandler *pWebHandle = new CCustomWebEventHandler;
            pActiveXUI->SetWebBrowserEventHandler(pWebHandle);
            pActiveXUI->Navigate2(L"about:blank");    //这行代码,如果注释掉,就不会去掉边框,IE有bug,第二次加载网页才会让事件处理器有效
            pActiveXUI->Navigate2(L"http://www.kugou.com/");
        }

      我这里强调两点

            第一、我这里只是示范,为了方便,我使用的是alberl的demo,简单改了几行代码。可以看到我new了一个CCustomWebEventHandler,但是没有去delete,所以自己使用时千万要注意代码规范!!

           第二、先加载了一个blank页面,再跳转到目标页面,第一次加载页面不会触发事件处理器,第二次才会,为了不影响效率我直接加载blank。关于这个bug的说明,在微软官网有,具体地址我忘了~~

  • 相关阅读:
    linux
    ansible
    语法糖
    jupyter login
    hadoop patch
    ganglia
    unixbench安装使用
    linux使用FIO测试磁盘的iops
    cpu事实负载使用top命令
    phoronix-test-suite测试云服务器
  • 原文地址:https://www.cnblogs.com/qintangtao/p/4045402.html
Copyright © 2011-2022 走看看