1. 程式人生 > >基於Duilib的多標籤瀏覽器(IE核心)

基於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)