二、关键技术分析
解决问题的关键在于对浏览器控件WebBrowser的NewWindow2事件的编程。当需要显示某种文件而生成一个新窗口时,NewWindow2 事件即被激活。注意,该事件发生在WebBrowser控件的新窗口产生之前。例如,作为对导航到一个新窗口或者一个脚本控制的window.open方法的响应,即发生该事件。为了声明当一个新窗口被打开时,将使用我们自己的浏览器程序,应该把参数ppDisp置为Application 对象。此时,如果你选择“在新窗口中打开”,则新产生一个窗口来显示Web页面。你也可以把RegisterAsBrowser设置为TRUE,这将导致新生成的WebBrowser控件参与到窗口命名的冲突问题上。例如,如果一个窗口的名字在脚本的另外一处用到,那么该控件被派上用场,而不是再产生一个新的窗口,因为控件在打开一个新的窗口之前先检查一下所有已存在的窗口名称以避免命名冲突。 在本文示例中,作为对该事件的响应,我们动态地创建一个tab页面,并通过调用CreateNewWebBrowser()方法产生一个WebBrowser控件作为其子控件――这里每一个子控件都有一个包含该控件相关信息的tag属性。详见下面的源码:
private void axWebBrowser1_NewWindow2(object sender, AxSHDocVw.DWebBrowserEvents2_NewWindow2Event e) |