基于Duilib的多标签浏览器(IE内核)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/duiplus/article/details/54342964

Duilib开源库封装了一个简单的WebBrowser控件,提供了各种事件回调接口。可以方便简单的嵌入到客户端程序做网页展示用,如果想做一个类似IE的多标签的浏览器,就需要封装一下事件接口,并提供一个标签管理器来进行网页管理。

首先参照例子建立一个简单的Duilib项目,并创建一个主窗口CMainWnd,CMainWnd继承于WindowImplBase(窗口基类)和CWebBrowserEventHandler(WebBrowser事件接口)。创建以后,实现以下方法,用于处理WebBrowser事件:

virtual HRESULT STDMETHODCALLTYPE ShowContextMenu(CWebBrowserUI* pWeb, DWORD dwID, POINT __RPC_FAR *ppt, IUnknown __RPC_FAR *pcmdtReserved, IDispatch __RPC_FAR *pdispReserved);
    virtual HRESULT STDMETHODCALLTYPE GetHostInfo(CWebBrowserUI* pWeb, DOCHOSTUIINFO __RPC_FAR *pInfo);
    virtual void BeforeNavigate2(CWebBrowserUI* pWeb, IDispatch *pDisp,VARIANT *&url,VARIANT *&Flags,VARIANT *&TargetFrameName,VARIANT *&PostData,VARIANT *&Headers,VARIANT_BOOL *&Cancel);
    virtual void NavigateError(CWebBrowserUI* pWeb, IDispatch *pDisp,VARIANT * &url,VARIANT *&TargetFrameName,VARIANT *&StatusCode,VARIANT_BOOL *&Cancel);
    virtual void NavigateComplete2(CWebBrowserUI* pWeb, IDispatch *pDisp,VARIANT *&url);
    virtual void ProgressChange(CWebBrowserUI* pWeb, LONG nProgress, LONG nProgressMax);
    virtual void NewWindow3(CWebBrowserUI* pWeb, IDispatch **pDisp, VARIANT_BOOL *&Cancel, DWORD dwFlags, BSTR bstrUrlContext, BSTR bstrUrl);
    virtual void CommandStateChange(CWebBrowserUI* pWeb, long Command,VARIANT_BOOL Enable);
    virtual void TitleChange(CWebBrowserUI* pWeb, BSTR bstrTitle);
    virtual void DocumentComplete(CWebBrowserUI* pWeb, IDispatch *pDisp,VARIANT *&url);

然后我们定一个结构体TabInfo来存储标签和WebBrowser的信息:

typedef struct _tagTabInfo
{
    UINT64 nID;
    TCHAR szUrl[2048];
    TCHAR szTitle[256];
    TCHAR szFavUrl[2048];
    TCHAR szFavName[256];
    CBrowserTab* pTab;
    CWebBrowserUI* pWebBrowser;
}TabInfo;

有了上面的信息,我们把所有标签使用std::vector<TabInfo*>来管理,新建、关闭、切换标签都可以通过操作上面的数组来完成。

核心流程如下:
1、NewWindow3 WebBrowser发起新开网页的要求,这个地方创建TabInfo,并添加到标签管理器;
2、TitleChange 网页标题改变,此时更新标签文字;
3、DocumentComplete 网页加载完毕,此时可以通过注入JS来操作网页元素;

效果截图:
基于Duilib的多标签浏览器(TroyBrowser)

完整代码请联系Troy(QQ:656067418)

duilib开源项目交流圈(QQ群:261851826、261675375)

猜你喜欢

转载自blog.csdn.net/duiplus/article/details/54342964