WTL SDK sample中有个例子工程TabBrowser实现了MultiTab WebBrowser的功能,但是只是表面上实现了该功能,当页面链接或者按钮不是在本窗口打开的时候,会弹出IE浏览器窗口打开链接,如何才能实现在一个新的tab页打开呢?我们只要响应下browser控件的NewWindow2事件就可以了,下面介绍如何在该例子程序上修改代码:
1、定义NewWindow2事件的参数结构
修改文件:CBrowserView.h
声明定义静态变量的代码处:
// IDispatch events function info
static _ATL_FUNC_INFO DocumentComplete2_Info;
static _ATL_FUNC_INFO TitleChange_Info;
static _ATL_FUNC_INFO StatusTextChange_Info;
static _ATL_FUNC_INFO CommandStateChange_Info;
static _ATL_FUNC_INFO NewWindow2_Info; //该行代码为新加
初始化静态变量的代码处:
__declspec(selectany) _ATL_FUNC_INFO CBrowserView::DocumentComplete2_Info = { CC_STDCALL, VT_EMPTY, 2, { VT_DISPATCH, VT_BYREF | VT_VARIANT } };
__declspec(selectany) _ATL_FUNC_INFO CBrowserView::TitleChange_Info = { CC_STDCALL, VT_EMPTY, 1, { VT_BSTR } };
__declspec(selectany) _ATL_FUNC_INFO CBrowserView::StatusTextChange_Info = { CC_STDCALL, VT_EMPTY, 1, { VT_BSTR } };
__declspec(selectany) _ATL_FUNC_INFO CBrowserView::CommandStateChange_Info = { CC_STDCALL, VT_EMPTY, 2, { VT_I4, VT_BOOL } };
__declspec(selectany) _ATL_FUNC_INFO CBrowserView::NewWindow2_Info = { CC_STDCALL, VT_EMPTY, 2, { VT_DISPATCH, VT_BOOL | VT_BYREF} }; //该行代码为新加
2、声明一个事件的处理函数
修改文件:CBrowserView.h
void __stdcall OnEventNewWindows2(IDispatch **ppDisp, BOOL* pCancel);
3、绑定事件
修改文件:CBrowserView.h
BEGIN_SINK_MAP(CBrowserView)
SINK_ENTRY_INFO(_nDispatchID, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnEventDocumentComplete, &DocumentComplete2_Info)
SINK_ENTRY_INFO(_nDispatchID, DIID_DWebBrowserEvents2, DISPID_TITLECHANGE, OnEventTitleChange, &TitleChange_Info)
SINK_ENTRY_INFO(_nDispatchID, DIID_DWebBrowserEvents2, DISPID_STATUSTEXTCHANGE, OnEventStatusTextChange, &StatusTextChange_Info)
SINK_ENTRY_INFO(_nDispatchID, DIID_DWebBrowserEvents2, DISPID_COMMANDSTATECHANGE, OnEventCommandStateChange, &CommandStateChange_Info)
SINK_ENTRY_INFO(_nDispatchID, DIID_DWebBrowserEvents2, DISPID_NEWWINDOW2, OnEventNewWindows2, &NewWindow2_Info) //该行代码为新加
END_SINK_MAP()
4、实现函数
为了方便,较少的修改代码,我们首先把MainFrm.h里面的变量m_view修改为静态变量:static CCustomTabView m_view;,加一句初始化该变量的代码:CCustomTabView CMainFrame::m_view;
然后我们实现先前声明的OnEventNewWindows2函数,实现我们放在TabBrowser.cpp里面,
void __stdcall CBrowserView::OnEventNewWindows2(IDispatch **ppDisp, BOOL* pCancel)
{
*pCancel = FALSE; //这一句比较重要,如果为TRUE,该事件就是终止了,不会打开任何网页
CString strURL;
CString strLoading;
strLoading.LoadString(IDS_LOADING);
strURL.LoadString(IDS_BLANK_URL);
CBrowserView* pView = new CBrowserView;
pView->Create(CMainFrame::m_view, rcDefault, strURL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_VSCROLL | WS_HSCROLL);
CComPtr<IWebBrowser2> spWebBrowser;
HRESULT hRet = pView->QueryControl(IID_IWebBrowser2, (void**)&spWebBrowser);
if(SUCCEEDED(hRet)){
spWebBrowser->put_RegisterAsBrowser(VARIANT_TRUE);
spWebBrowser->get_Application(ppDisp); //这一句是关键,关联我们新建的窗口的browser控件到点击的目标链接
}
if(pView->IsWindow()){
CMainFrame::m_view.AddPage(pView->m_hWnd, strLoading, 0, pView);
}else{
pView->DestroyWindow();
}
}
OK了,赶快编译一下运行看看效果吧!~~~
相关推荐
这个示例项目,"Tab、WebBrowser、对话框间控制示例",旨在帮助初学者学习如何在不同控件之间进行有效控制,包括在Tab控件、WebBrowser控件以及对话框之间。我们将深入探讨以下几个关键知识点: 1. **Tab控件**:...
**WTL 控件库 v1.3:深入解析与应用** Windows Template Library(WTL)是一种轻量级的C++库,由微软开发并维护,主要用于构建Windows应用程序。WTL是ATL(Active Template Library)的扩展,它提供了一种高效、...
WTL 中控件消息实现 WTL(Windows Template Library)是一种基于模板的C++类库,用于简化Windows编程。 WTL 中控件消息实现是指在WTL中如何处理控件消息的机制。 在WTL中,可以使用两种方法来处理控件消息:动态...
利用WTL实现在webbrower利用google map api展示google地图;包含在C++中调用google map api...同时也包含webbrowser中的javascript函数触发WTL中C++写的事件的例子。 在VS2005下调试通过(VC6.0下应该也是能通过的);
在本文中,我们将深入探讨如何使用Windows Template Library (WTL) 实现自定义控件以创建具有图片功能的用户界面。WTL 是一个轻量级的C++库,它为开发Windows应用程序提供了一种高效的方法,特别是对于创建桌面应用...
WTL 切分窗口简单实现, 利用 CSplitterWindow // 创建切分窗口容器 CRect lSplitWndRect; GetClientRect(lSplitWndRect); HWND hWnd = mMainSplitWnd.Create(*this, lSplitWndRect, //CWindow::...
一直想做html的界面,基于MFC的html界面开发网上有很多源码,但是使用WTL开发的网上资源很少。CSDN上有些貌似的资源不过可惜的还是MFC的翻版,让人可恨的是,抄别人的代码,你也改改文件名,函数明吧,你就把别人的...
2. **文件格式**:描述中提到的“wtl格式”可能是指WTL源代码文件的格式,这些文件通常包含C++代码,利用WTL库来实现Windows应用的界面和功能。 **标签解析:** 1. **wil查看器和wtl**:可能是因为命名上的误解,...
【webbrowser2控件详解】 Webbrowser2控件是.NET Framework提供的一种用于在Windows应用程序中嵌入网页浏览功能的组件。这个控件是基于Internet Explorer的ActiveX技术,因此,它的功能和表现与用户系统上的IE版本...
在这个工程文件中,开发者使用VS2010作为集成开发环境,并利用WTL库来实现自定义的Tab控件。由于代码未经全面和严格的测试,它可能包含一些未解决的问题或者需要优化的地方。然而,这正好为学习者提供了一个探索和...
**WTL库实现浏览器框架详解** Windows Template Library(WTL)是Microsoft开发的一个轻量级C++库,它为Windows应用程序开发提供了强大的支持,尤其在创建小型、高效的应用程序时,WTL显示出了其优越性。WTL是基于...
开发者可以通过WTL直接操作Windows消息机制,实现高度定制化的用户界面。 描述中提到的"wtl的开发工具,解压缩可以直接使用,没有插件,安全",这意味着这个压缩包可能包含了一个精简版的WTL开发环境或者示例代码库...
1. **WTL8.0**: WTL 8.0是一个重要的版本,它引入了对Visual Studio 2005的支持,并提供了新的控件和组件,如Command Bar、Splitter Window、Tab Control等。此外,8.0版本还增强了对Unicode和多线程的支持,优化了...
**Windows Template Library (WTL) 指南与 WTL7.1** ...通过阅读“WTL Guide”,开发者可以深入理解WTL的用法和最佳实践,而“WTL7.1 Exe”可能包含示例代码或可执行文件,帮助开发者直观地看到WTL的实现效果。
【标题】"docktabframe_demo" 是一个基于WTL(Windows Template Library)库的应用程序示例,它展示了如何实现可停靠的标签页框架。在IT领域,这种框架常用于创建复杂的用户界面,允许用户自定义窗口布局,将不同的...
本教程将深入探讨如何使用WTL来实现一个托盘图标功能,这在很多系统级应用或者后台服务中是非常常见的需求。 首先,我们需要理解托盘图标的基本概念。托盘图标,也称为系统托盘图标或通知区域图标,通常位于Windows...
1. **UI设计模式**:讲解如何利用WTL实现常见的UI设计模式,如模型-视图-控制器(MVC)或模型-视图-视图模型(MVVM)。 2. **异常处理**:介绍WTL中的异常处理机制,以及如何编写健壮的异常安全代码。 3. **调试和...
在本主题中,我们将深入探讨如何使用WTL来实现停靠(Docking)窗口。 停靠窗口是Windows应用程序中常见的设计元素,允许用户自由地将窗口附加到主窗口的边缘或中心,以便于多任务处理和布局管理。WTL提供了一套完善...
5. **模板编程**:WTL大量使用模板技术,实现高度的灵活性和类型安全。 总的来说,WTL插件如Visual FC和WTL Helper,极大地提升了WTL开发的效率和便利性,降低了开发复杂度,使得开发者能够更加专注于应用程序的...
WTL 的主要特点是使用模板来实现通用编程,提供了一个高效、灵活的解决方案。 2. ATL 背景知识 ATL(Active Template Library)是WTL的前身,由微软公司开发,提供了一个通用的模板库,用于构建COM组件。ATL 的...