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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DuiLib是一个基于DirectUI的C++ UI库,可以用于开发Windows平台的应用程序。下面是对你的问题的回答: 1. DuiLib实现异形窗体: DuiLib提供了`CWindowWnd`类和`CPaintManagerUI`类,可以用来实现异形窗体。你可以通过重写`CWindowWnd`类的`OnNcCalcSize`和`OnNcPaint`方法来自定义非客户区的绘制和大小计算。具体的实现可以参考DuiLib的官方文档和示例代码。 2. DuiLib与CEF浏览器内核相结合: DuiLib可以与CEF(Chromium Embedded Framework)浏览器内核相结合,实现在DuiLib窗口中嵌入浏览器。你可以使用CEF提供的API来创建和控制浏览器实例,然后将浏览器的渲染区域嵌入到DuiLib窗口中的某个控件中。具体的实现可以参考CEF的官方文档和DuiLib的示例代码。 3. EnableWindow()和SetFocus()的含义和用法: - `EnableWindow()`函数用于启用或禁用窗口或控件。当传入参数为TRUE时,窗口或控件将启用,可以响应用户输入;当传入参数为FALSE时,窗口或控件将禁用,不再响应用户输入。该函数的调用格式为:`EnableWindow(hWnd, bEnable)`,其中hWnd为窗口或控件的句柄,bEnable为一个BOOL值。 - `SetFocus()`函数用于设置焦点到指定的窗口或控件上。当调用该函数时,指定的窗口或控件将成为当前活动窗口,并接收用户输入。该函数的调用格式为:`SetFocus(hWnd)`,其中hWnd为窗口或控件的句柄。 这些函数在DuiLib中也可以使用,通过获取控件的句柄(可以使用DuiLib提供的`FindControl()`等方法)来操作窗口或控件的启用状态和焦点。具体的用法可以参考DuiLib的官方文档和示例代码。 希望以上回答能对你有所帮助!如有更多问题,请继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值