基於Duilib的多標籤瀏覽器(IE內核)

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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章