基於Duilib的多標籤瀏覽器(IE核心)
阿新 • • 發佈:2019-01-11
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來操作網頁元素;
效果截圖:
完整程式碼請聯絡Troy(QQ:656067418)
duilib開源專案交流圈(QQ群:261851826、261675375)