如何对webbrowser和IE编程(十一)

仅仅用于Internet Explorer的事件

有些是仅仅可用于自动化 Internet Explorer,:

·         OnQuit

  • OnVisible
  • OnToolBar
  • OnMenuBar
  • OnStatusBar
  • OnFullScreen
  • OnTheaterMode

大多数这些事件属于浏览器用户接口. 另外一些必须要先是或者关闭Internet Explorer才发生. 一些情形中,这些事件将在你宿主webbrowser空间的时候发生. 举例来讲,当你在你的应用程序设置MenuBar 属性,尽管你的WebBrowser control 并没有菜单条, OnMenuBar 事件将被激发, 但是如果你显示或者隐藏你的应用程序菜单条,OnMenuBar 事件不会激发.为什么?因为你的菜单条由你控制,webbrowser对这些用户接口项一无所知. 很长时间以来,这些相互矛盾的功能是一些混乱的根源。

其中一个事件—OnQuit—将永远不会在你的应用程序中激发.举个例子, 察看表 Table 7-6. 注意到OnQuit 事件当用户关闭 Internet Explorer 或者当Quit 方法被调用时激发.如果你宿主改控件且用户关闭你的应用程序,  OnQuit 事件不会激发.它仅仅在你自动化Internet Explorer 且用户手动关闭浏览器时候发生.另外,如果你在宿主一个webbrowser控件时试图调用Quit 方法,一个自动化错误将会发生.

自ActiveX控件中控制Internet Explorer 事件

通过 IWebBrowser2 接口你可以在利用vc++在ActiveX 控件中接受事件.

你可能疑惑为什么要在ActiveX控件中接受 Internet Explorer事件.之前介绍"DocumentComplete," 事件时候,我提到过你不可以在DocumentComplete event 事件被触发前安全存取文档.在Activex控件中获知DocumentComplete 事件被触发的途径是ActiveX 控件接收 Internet Explorer并处理 DocumentComplete 事件.

除了你必须接收Internet Explorer 事件外, 你可以开发一个可导航的类浏览器的应用于公司intranet或者学校网络.你可以在ActiveX control中自动化Internet Explorer并接受其事件。.

当你刷新一个页面 , 也许 DocumentComplete 事件并不激发 . 当 DocumentComplete 事件并未触发 ,  ProgressChange 事件被用来控制以检测某页是否完成加载 . 载一个简单的 web 页或者没有嵌入帧时 ProgressChange 工作的很好 .

记住 ProgressChange 右两个参数告诉你下载操作的进度.第一个参数当下在完成时候设定为-1, 者可以帮助你检测是否可做类打印等操作

让我们学习一个打印控active控件,为从Internet Explorer接收事件,你必须设置事件接收,意味着你必须通过IWebBrowser2  接口以获得实现,如下实现:



.

接下来覆盖IOleObjectImpl 的SetClientSite方法的实现. SetClientSite 放方法是在Internet Explorer通知气客户区的控件的时候被调用.你可用客户区的site指针 (m_spClientSite) 存取容器并且得到IWebBrowser2 接口指针. 在SetClientSite 实现中, 你必须首先调用其基类版本,就想如下:


这些带吗看起来可能有些生疏, 但记住 IOleObjectImpl 是一个模版类. 为了调用它的方法, 你必须制定要求的模版参数以指示编译器哪一个类实例在调用SetClientSite 方法时被使用. 现在讲残存的访问容器和IWebBrowser2接口指针的代码从Print方法迁移到SetClientSite 方法Now move the remaining code Print 方法将看起来如下:




														

														





														


而 SetClientSite 方法将接收事件,SetClientSite 讲看起来如下:

注意

你不能够再 FinalConstruct m 方法中接收事件因为此时客户站点还未设定。




														




														


														

														






														

														






														







														


注意到在AtlAdvise 调用时你必须建立protected 或者private DWORD的数据成员以掌握返回自AtlAdvise 方法的cookie. CprintCtl 类的构造函数初始化改成员为0.尽管我们注意到CPrintCtl::SetClientSite 方法使用IOleObjectImpl::SetClientSite 方法的返回值. 此方法并不检查已被调用的返回值因为CPrintCtl::SetClientSi将 反射客户站点的设定状态.

最好, 我们检查pClientSite 的返回值,输入参数是NULL. 如果这样,我们当Internet Explorer 卸载这些控时, 他调用SetClientSite w设置为NULL. 或者告诉你已经从站点解除, 所以包含一个接口, IWebBrowser2 容器不需要一定执行。.

因为当你完成任务时应当关闭任务的站点, 也包含某个控件被卸载时。检查pClientSite 是否为NULL,以便放置AtlUnadvise 方法. 记住pClientSite在控件被卸载时为 NULL. 看起来如下:




														


														


现在你可以使用AtlAdvise接收事件,让我们控制事件.为此你必须覆盖重写IDispatchImpl 的Invoke 方法. 典型的,你将为你的时间建立一个单独的类因为 Internet Explorer 事件的DISPIDs 必须同你的控件的DISPIDs 不同.但在此你可以简单在 CPrintCtl  类中来实现.实现Invoke (入代码所示)以控制ProgressChange 事件.在事件句柄, 如果progres的总数设定为 -1,设定一个标志变量指示已被打印.

 












														


														























														

														









														


														


在 ProgressChange 事件处理中,当Progress 参数(pDispParams->rgvarg[1].lVal) 是-1, 我们设置一个变量告诉控件问打光在完成可以打印. FCanBePrinted 就是我们要设定的变量。

现在当用户试图调用Print 方法打印文档,你可以检查变量以确定是否可打印. 此处为 Print 方法的代码:









														

														

														





														

														
时间: 2024-08-03 08:16:24

如何对webbrowser和IE编程(十一)的相关文章

如何对webbrowser和IE编程(七)

加入高级功能 本节将展示如何加入高级功能到你的应用程序或者ActiveX控件.将展示如何从一个ActiveX控件中访问Internet Explorer的 IWebBrowser2,以及如何从一个Web页面的frame中获得WebBrowser 对象.将会展示实现一些并非容易实现的功能.本节有一定难度.所有代码采用C++ 和COM实现,你应当有一定坚实的基础才可以完成本节的理解 从ActiveX 控件中访问Internet Explorer 的IWebBrowser2 在Activx控件中访问I

如何对webbrowser和IE编程(四)

寄宿WebBrowser 控件 我们现在开始在VB和VC中创建一些程序来寄宿(Host)WebBrowser控件.在你完成本部分的样本,你将对如何创建寄宿一个WebBrowser控件的应用程序又一个基本的了解.当你看到如此容易的加入Web浏览功能加入到你的应用程序,我相信你会立即开始实践的. 使用VB 在VB中,你可以在5分钟内开发一个全功能的自己的web浏览 .以下步骤为建立一个web浏览器程序: 1.     启动VB. 2.        选择" Standard EXE " ,

如何对webbrowser和IE编程(一)

一. 因为工作缘故,需要研究对 IE 编程,所以翻译了 MS 的有关资料,供参考.   IE 的体系   WebBrowser Host 首先,必须有 COM 的基础知识,因为 IE 本身就是 COM 技术的典型应用.我们看到最上层是 WebBrowser 的宿主( Host ),也就是任何你想重用(ReUse)webbrowser control 的应用程序,可以是 vb 程序,也可以是 vc 或者任何其他语言的应用程序.应用程序必须是可容纳 activex 控件的容器. Webbrowser

如何对webbrowser和IE编程(九)

接收事件的途径 依靠开发工具你创建客户应用程序,你可以接收事件通过不同的途径. 显然, 在Vb中接收事件同在VC中接收事件相比是如此不同和容易.在 C++ 应用中,你可以用不同的技术,通过使用 ATL, MFC, 或者标准C++. Visual Basic 中接收事件 Visual Basic是创建大多数类型应用的最轻松的工具, 所以我告诉你VB是处理事件最溶的工具时也不要惊奇. ATL 和 Visual Basic 示例我们同样的工作,但是ATL花费了我4个小时, 而 Visual Basic

如何对webbrowser和IE编程(十)

由Internet Explorer 5激发事件 如你所知, Internet Explorer像其他COM对象一样激发事件-通过连接点.但实际上Internet Explorer如何激发事件呢?每次 Internet Explorer需要向客户提供关于当前活动状态的信息, Internet Explorer 激发通过DWebBrowserEvents2 连接点激发一个事件. (之前到版本 4, Internet Explorer 通过 DWebBrowserEvents 接口激发事件.但到了版

如何对webbrowser和IE编程(六)

使用VC++和COM API 尽管使用VC不像Vb中那么容易自动化IE,但是也不太难,尤其是你理解了CON和COM API.无论你使用MFC, ATL, 或者标准 C++自动化IE,方法都是一样-你使用COM API来实现. VC++中创建一个Internet Explorer实例包括要调用COM API CoCreateInstance ,指定第一个参数为 CLSID_InternetExplorer .创建IE自动化实例不像创建包含webbrowser的Activex控件困难.你不需要实现容

如何对webbrowser和IE编程(五)

自动化 Internet Explorer 自动化打开了开发基于web应用的世界. 它允许你使用VB或者VC定制成熟的应用.自动化的好处:通过属性和方法可以改变IE的外观:你可以提供诸如导航条等用户接口以便控制用户的导航. 自动化IE很容易.你建立一个简单的应用启动一个IE实例,然后使用控制webbrowser的途径- IWebBrowser2 接口来控制IE实例. 提醒 术语自动化( automation ) 真实的含义是通过自动化接口 -- IDispatch. 控制一个 COM 对象.但是

如何对webbrowser和IE编程(三)

IWebBrowserApp IWebBrowserApp 接口仅仅在IE中实现. 典型的,你使用InternetExplorer 对象创建一个IE的实例. 然后你使用 IWebBrowserApp 接口操纵此实例. (今天采用IWebBrowser2 替代) IWebBrowserApp 接口继承自 IWebBrowser, 所以它提供 IWebBrowser 的全部功能. 因为IWebBrowserApp呈现一个IE窗口的实例, 所以它的方法和属性典型地允许你控制浏览器窗口的用户接口. 这些

如何对webbrowser和IE编程(八)

Internet Explorer 事件 IWebBrowser2 的属性和方法给了你确切的控制导航和用户接口的途径,但是如果你不能够检测到浏览器正在处理什么以及何时处理什么,你还是没有全面的控制它.因此,WebBrowser控件和Internet Explorer暴露出事件,通过此你可以必要时监视活动以及处理某些活动. 举例来说,假设你建立一个intranet应用程序, 你想限制用户用户访问某些web页.利用Internet Explorer的时间处理句柄,你可以指令应用程序在用户试图访问受限