WebBrowser 事件讲解

来源:互联网 发布:淘宝网野生松杉灵芝 编辑:程序博客网 时间:2024/05/18 12:03

由Internet Explorer 5激发事件

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

注意


如何领会到Internet Explorer加法那些事件?最佳途径是MSDN Online Web Workshop. 另外采用 OLE-COM Object Viewer

不像WebBrowser 控件 和 Internet Explorer的其他接口,是剑接口没有继承体系.DWebBrowserEvents 接口严格应用于Internet Explorer 3. 如果你正宿主WebBrowser 控件或者自动化Internet Explorer 5, 你可以通过此接口接收事件—但是不可挂接. DWebBrowserEvents2 接口包含的方法是为Internet Explorer 5定制的.用 DWebBrowserEvents2 替代DWebBrowserEvents ,你将有更多的控制能力. 所以不要忘记接口的最后面的2.

尽管DWebBrowserEvents2 是一个事件接口, 它其实就是像IWebBrowser2  一样的另外 COM 接口,所以它可以包含方法. (D 开头的命名是表示这是派遣接口.一个派遣接口是一个IDispatch 接口.但不同于普通接口, 派遣接口没有vtable.) 就像一个接口一样,派遣接口只不过提供一些函数的定义—他们并不真实实现.事件的实现由客户提供.举例来说,为了让WebBrowser 激发一个事件, 在DWebBrowserEvents2 接口中适当定义一些方法.这些方法由客户实现.但WebBrowser不直接调用这些方法.换句话讲, WebBrowser 并不调用DocumentComplete 方法.因为 DWebBrowserEvents2 是派遣接口, WebBrowser 通过IDispatch::Invoke调用客户的实现早期, 当WebBrowser 调用客户的Invoke 实现, WebBrowser 传递事件被激发的DISPID.

注意


某些工具如Visual Basic, MFC,  ATL 提供Invoke实现

表7-6 列出 WebBrowser 事件. (这些是WebBrowser 控件和Internet Explorer供有的事件,尽管有些事件仅仅用于自动化Internet Explorer).

注意


尽管有些方法为不包含2.尽管DWebBrowserEvents2 并非继承自WebBrowserEvents,DWebBrowserEvents2 还是匹配 DWebBrowserEvents 中被更改的,以免混淆。

注意表 7-6 重的参数有些值同样有 VARIANT_ TRUE 或 VARIANT_FALSE. 如果你使用Visual C++,确信分派使用这些值不要使用 TRUE 或 FALSE. 如果你使用Visual Basic, 它会自动帮助你转换,你可以比较True和False.

现在来仔细看看这些事件

Table 7-6 WebBrowser 事件

私有事件

描述

BeforeNavigate2

在导航之前发生. (该事件并不在不刷新页面的时候发生)

CommandStateChange

当命令状态改变时发生.该事件告诉你何时使能或者禁止 Back 以及Forward 菜单像或者按钮.

DocumentComplete

当整个文档完全完成装载时发生.如果你刷新页面此事件并不激发.

DownloadBegin

当一个下载项目开始时候发生 ,此事件也在你刷新(IWebBrowser2::Refresh.)时发生

DownloadComplete

党整个下载项目完成是发生该事件也发生在完成刷新页面.

NavigateComplete2

当整个导航完成该事件对应于 BeforeNavigate2.

NewWindow2

在一个新的窗口被创建以显示Web页或者其他资源的时候发生。譬如你在页面中以新建窗口的方式打开一个连接

OnFullScreen

FullScreen 属性被改变时候发生.此事件携带一个VARIANT_ BOOL类型的输入参数指示Internet Explorer 是否处于全屏(full-screen 模式(VARIANT_TRUE或者处于普通模式(VARIANT_FALSE).

OnMenuBar

菜单条MenuBar 属性被改变的时候发生一个VARIANT_ BOOL类型输入参数指  Internet Explorer的菜单条属性是可见(VARIANT_TRUE或者隐藏 (VARIANT_ FALSE).

OnQuit

Internet Explorer正在退出时发生该事件当用户关闭浏览器或者调用Quit 方法.

OnStatusBar

StatusBar 属性被改变的时候发生。事件携带VARIANT_ BOOL类型的输入参数 指示Internet Explorer的状态条是否可见 (VARIANT_TRUE或者隐藏 (VARIANT_FALSE).

OnTheaterMode

TheaterMode 属性被改变时发生事件携带VARIANT_ BOOL类型的输入参数 指示Internet Explorer的状态条是否可见 (VARIANT_TRUE或者隐藏 (VARIANT_FALSE).

OnToolBar

ToolBar属性被改变时发生事件携带VARIANT_ BOOL类型的输入参数 指示Internet Explorer的状态条是否可见 (VARIANT_TRUE或者隐藏(VARIANT_FALSE).

OnVisible

WebBrowser将被显示或者隐藏时发生。事件携带VARIANT_ BOOL类型的输入参数 指示Internet Explorer的状态条是否可见(VARIANT_TRUE或者隐藏 (VARIANT_FALSE).

ProgressChange

当下载进度被更新时候发生

PropertyChange

当属性改变时候发生。典型的PutProperty 方法被调用时

StatusTextChange

Internet Explorer  WebBrowser 控件改变状态条时候发生。即使webbrowser控件没有状态条。 StatusTextChange 给客户一个改变状态条的机会

TitleChange

.当文档对象的title可用或者改变的时候发生

BeforeNavigate2

BeforeNavigate2 就像字面上所说. 当Internet Explorer 导航到一个WEB页是激发; 因此, 当用户输入一个 URL, 点击 Back 或者 Forward 按钮, 或者处理一个导航时都会发生. BeforeNavigate2 也在WebBrowser 控件导航类方法调用时发生, 例如 NavigateNavigate2GoHome, 或者GoSearch. 也许, 该事件不会在你刷新页面时发生. 如果页面上有帧, BeforeNavigate2 将像顶级窗口一样被激发BeforeNavigate2 由7个输入参数, 见7-7.

Table 7-7 Input Parameters of the BeforeNavigate2 Event

Parameter

Description

pDisp

将发生导航的顶级窗口或者帧的Idispatch 接口的地址

URL

将导航至的URL

Flags

保留

TargetFrameName

显示资源的窗口或者帧的名字字符串,或者为NULL(如果没有命名)

PostData

HTTP POST 传输的数据地址

Headers

增加的将要发给服务器的 HTTP 一般HTTP头指定其它的服务器要求。传送给服务器的数据类型、状态马等

Cancel

cancel 标志的地址设置为TRUE可取消导航

注意打所属参数匹配于Navigate 或者 Navigate2的调用参数.如果 BeforeNavigate2 由一个或者多个导航类调用激发,这些导航类的方法参数 传递到BeforeNavigate2 方法.

在事件的句柄函数中, 你可以使用Cancel 参数取消导航, 或者你可以是用pDisp 参数修改导航目的.设置Cancel 参数为 VARIANT_TRUE 可以取消导航,如果你想,你可以通过pDisp修改参数导航信息且导航到另外的位置.举例来说,如果我们向停止当前导航, 增加一些头信息,且导航到原先的URL.在Visual Basic, 我们可以如下代码实现:

Private Sub WebBrowser1_BeforeNavigate2(ByVal pDisp As Object, _
                                        URL As Variant, _
                                        Flags As Variant, _
                                        TargetFrameName As Variant, _
                                        PostData As Variant, _
                                        Headers As Variant, _
                                        Cancel As Boolean)
 
   If TypeName(pDisp) = "WebBrowser" And Headers = "" Then
      pDisp.Stop
      pDisp.Navigate URL, Flags, TargetFrameName, PostData, _
                     Headers + "MyHeaders"
      Cancel = True
   End If
End Sub

我们需要注意以上代码的几个重点.

首先你必须检查pDisp 的类型使之确定为WebBrowser. 当页面包含帧, pDisp 可能不是 WebBrowser 对象由此一些导航会导致错误.

其次你必须检查确信Headers 参数是空字符串以避免无限循环.记住BeforeNavigate2 每一次导航都会发生.因此如果你在BeforeNavigate2事件处理中调用Navigate, 另外一次 BeforeNavigate2 将被激活. 在前面的代码中, 仅仅在Headers 参数为空才调用Navigate 避免了无限循环. 如果Headers参数是空, Navigate 将携带非空的 Headers 参数. 下一次BeforeNavigate2 北激活, Headers 将不为空; 此时,我们千万不可再次Navigate a,从而导致一个无限循环.

第三点你必须调用pDisp Stop 方法.如果你没做到这点,"about:NavigationCanceled" Web 页将会载你首次取消掉导航时被显示.

CommandStateChange

CommandStateChange 是当Internet Explorer 想通知一个应用程序WebBrowser 命令状态已经改变时激发.当检测到Forward和Back 菜单项和按钮禁止或者使能时激发此事件.

CommandStateChange 事件有2个参数, Command 和 Enable。 Command 输入参数将要改变状态的按钮的表示符,可以取值—CSC_NAVIGATEFORWARD 和 CSC_NAVIGATEBACK分别表示是Forward按钮项和Back项,每次导航发生, CommandStateChange 事件发生并告诉你Forward 或者 Back 菜单项以及按钮将使能或禁止. 举例来说, 如果没有Web页在当前导航后发生, Command 的值应该为CSC_NAVIGATEFORWARD, 并且Enable 参数将等于VARIANT_FALSE.

第二个参数, Enable,如果命令可用(使能) 则为VARIANT_TRUE,如果禁止则值为VARIANT_FALSE.

 

为说明问题,我们看看代码。一下代码为定义事件接收的宏声明:

 
// Event sink map declaration for WebBrowser 
// control events. This declaration goes in the
// header file for CMfcWebHostView _ MfcWebHostView.h.
//
DECLARE_EVENTSINK_MAP()
 
// Initialize the event sink map and handle the 
// CommandStateChange event.
BEGIN_EVENTSINK_MAP(CMfcWebHostView, CView)
   ON_EVENT(CMFCIEEvtSpyDlg, IDC_WEBBROWSER, DISPID_COMMANDSTATECHANGE,
            OnCommandStateChange, VTS_I4 VTS_BOOL)
END_EVENTSINK_MAP()

重要的一点是要通过WebBrowser控件的Create 方法来创建. ON_EVENT的第二个参数为你宿主的WebBrowser控件的IID.之前的例子中是NULL. 你必须为webbrowser控件声明一个ID 且用此 ID 创建实例.如果不这么做,事件将不会正确工作.

你可以在工程的任何文件定义此ID. (推荐在资源头文件resource.h.) 因为 最大的资源Id是32,779, 所以你可以如下定义WebBrowser 控件的ID:

#define IDC_WEBBROWSER  35000

此数高于resource.h中的任何资源ID, 因此可以确信ID 数字不会同采用ClassWizard添加的ID冲突.现在可以采用使用ID的 Create 方法来创建WebBrowser控件:

if (!m_webBrowser.Create(NULL, WS_CHILD|WS_VISIBLE,
                         CRect(), this, IDC_WEBBROWSER))
{
   return -1;
}

下一步声明OnCommandStateChange 方法,该方法将在WebBrowser控件激发CommandStateChange 事件时被调用.可声明 如下:

void OnCommandStateChange(long lCommand, BOOL bEnable);

在 OnCommandStateChange 方法的是现代码中, 设定表示Go Forward 或者 Go Back 想得导航菜单项的数据成员为使能或者禁止. 该书据成员将被UPDATE_COMMAND_UI 句柄使用。以下为OnCommandStateChange 方法实现:

void CMfcWebHostView::OnCommandStateChange(long lCommand, BOOL bEnable)
{
   switch(lCommand)
   {
      // Forward command
      //
 
      case CSC_NAVIGATEFORWARD:
         m_fForwardEnabled = bEnable;
         break;
 
      // Back command
      //
      case CSC_NAVIGATEBACK:
         m_fBackEnabled = bEnable;
         break;
 
      default:
         break;
   }
}

声明m_fForwardEnabled 和 m_fBackEnabled 数据变量为保护成员,类型为BOOL.同样在构造函数中谁的些数据成员为TRUE。.

现在当Go Forward和Go Back的菜单 UPDATE_COMMAND_UI被处理, 你可以直接进行设置. 下为示例代码:

void CMfcWebHostView::OnUpdateNavigateGoForward(CCmdUI* pCmdUI) 
{
   pCmdUI->Enable(m_fForwardEnabled);
}
 
void CMfcWebHostView::OnUpdateNavigateGoBack(CCmdUI* pCmdUI) 
{
   pCmdUI->Enable(m_fBackEnabled);
}

DocumentComplete

当一个文档完整的完成下载Internet Explorer 激发DocumentComplete 事件. 仅仅当此事件激发后 文档对象才可安全使用.在一个无帧的Web页情形中文档对象是IHTMLDocument2 对象, 我们以后会讨论. 当文档对象准备好可用,他的状态为READYSTATE_COMPLETE.

关于 DocumentComplete 事件以西击点需要注意:

·         在没有帧的web页, DocumentComplete 事件在下载完成后激发一次.

  • 在多帧的web页,此事件激发多次.并非每一个帧激发一个事件但每一个帧激发DownloadBegin事件将会相应激发DocumentComplete 事件.
  • DocumentComplete又一个指向 IDispatch 的指针参数该参数指向激发此事件的窗口此窗口可以是帧中的窗口
  • 顶级帧在所有子帧激发了各自的DocumentComplete事件后激发自己的 DocumentComplete事件。因此,,要看一个web页是否完整下载完成你需要从该事件的处理句柄中获取由事件产地过来的IDispatch 参数的IUnknown 接口。下一步,比较IUnknown 接口是否指向你正宿主的WebBrowser控件或者自动化的IE的实例的IUnknown 接口.如果这两个指针相同,这意味着全部HTML, 图片images, 控件,以及诸如此类在顶级帧或者子帧的全部对象元素都被下载了.

 

VB中实现以上四点及其容易.仅需要检查发送给事件的pDisp 参数事一个WebBrowser 对象. Visual Basic小心检查这些对象的 Iunknown否为同一个对象.此处为VB代码::

Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object,
                                         URL As Variant)
   If (pDisp Is WebBrowser1.Object) Then
      MsgBox "The document is finished loading."
   End If
End Sub

实现以上四点在Visual C++ 应用程序里较困难一点,但你可以做到! 首先在DocumentComplete 事件的宏中如下声明:

ON_EVENT(CMfcWebHostView, IDC_WEBBROWSER, DISPID_DOCUMENTCOMPLETE,
         OnDocumentComplete, VTS_DISPATCH VTS_PVARIANT)

接下来声明OnDocumentComplete 方法作为事件处理句柄

void OnDocumentComplete(LPDISPATCH lpDispatch, VARIANT FAR* URL);

最后,实现该方法以检测 是否页面已经下载,我们得到我们宿主控制bBrowser 控件的IUnknown. (注意我们不是简单获取指向 IUnknown ,而是要调用GetControlUnknown 方法. GetControlUnknown方法返回的IUnknown 指针 实际上并不等于被宿主话的 WebBrowser控件的IUnknown. 那将返回IOleObject 接口指针.) 下一步, 获取IUnknown 指针,如果QueryInterface 查询得到的Dispatch参数同Iunknown接口是同一对象,则页面完成整个下载。.

void CMfcWebHostView::OnDocumentComplete(LPDISPATCH lpDispatch,
                                         VARIANT FAR* URL)
{
   HRESULT   hr;
   LPUNKNOWN lpUnknown;
   LPUNKNOWN lpUnknownWB = NULL;
   LPUNKNOWN lpUnknownDC = NULL;
 
   lpUnknown = m_webBrowser.GetControlUnknown();
   ASSERT(lpUnknown);
 
   if (lpUnknown)
   {
      // Get the pointer to the IUnknown interface of the WebBrowser 
      // control being hosted. The pointer to the IUnknown returned from 
      // GetControlUnknown is not the pointer to the IUnknown of the 
      // WebBrowser control. It's actually a pointer to the IOleObject.
      // 
      hr = lpUnknown->QueryInterface(IID_IUnknown,
                                     (LPVOID*)&lpUnknownWB);
 
      ASSERT(SUCCEEDED(hr));
 
      if (FAILED(hr))
         return;
 
      // Get the pointer to the IUnknown of the object that fired this 
      // event.
      //
      hr = lpDispatch->QueryInterface(IID_IUnknown, 
                                      (LPVOID*)&lpUnknownDC);
 
      ASSERT(SUCCEEDED(hr));
 
      if (SUCCEEDED(hr) && lpUnknownWB == lpUnknownDC)
      {
         // The document has finished loading.
         //
         MessageBox("The document has finished loading.");
      }
 
      if (lpUnknownWB)
         lpUnknownWB->Release();
 
      if (lpUnknownDC)
         lpUnknownDC->Release();
   }
}

有一点需要注意上面的代码我们在GetControlUnknown 返回的IUnknown 接口指针使用时并没有进行Release ,因为b IUnknown 指针并没有在GetControlUnknown方法中 AddRef'. GetControlUnknown方法仅仅返回一个IOleObject 数据成员的指针,该指针由控件站点类—CcontrolSite 操纵处理. 如果你释放了IUnknown 接口指针, 载你关闭应用程序时,一个访问违例将会发生,因为MFC 将试图在对象被删除时候多释放一次.

DownloadBegin

DownloadBegin 事件通知应用程序一个导航操作开始. 一般情况下该事件在BeforeNavigate2 事件之后激发, 除非导航操作在BeforeNavigate2 事件处理过程中被取消.容器应当显示动画或者忙指示当前正处于连接的DownloadBegin事件. 每一个 DownloadBegin 事件有一个相应的DownloadComplete事件. 在刷新页面的情形中, DownloadBegin 和 DownloadComplete 使唯一的被激发的导航事件.

DownloadComplete

DownloadComplete在一个导航操作完成时候发生, 停止, 或者失败. 不像 NavigateComplete2仅仅当成功导航才发生, DownloadComplete总是在道涵开始后激发.任何在DownloadBegin 中显示的动画或者忙指示将会在DownloadComplete 中停止.

NavigateComplete2

NavigateComplete2 事件在导航到一个超连接整个窗口或者帧集合的元素全部完成时候发生. 第一此事件发生表示文档document已经准备好.在此事件发生后, 你可以通过Document 属性存取文档(document)而不接收到错误.但是能够访问一个文档不意味着你访问文档使安全的.你可以在DocumentComplete 事件激发后安全访问文档.

档你需要访问document对象但是不需要访问文档内的元素,你可以在NavigateComplete2 事件中尽可能快的处理,例如当你在文打工通过高级宿主接口. NavigateComplete2 事件有2个参数—IDispatchof 代表激发事件的对象URL 为你需要导航到的URL.

NewWindow2

NewWindow2 档用户显示一个新窗口以进行新导航显示web页或者其他资源时发生.在WebBrowser控件响应柄进行预处理 (举例来说, 在响应window.open 方法).

NewWindow2 也在Navigate 或者 Navigate2 方法被调用且navOpenInNewWindow 标志被设定时发生. 档采用文件菜单中的New Window按钮时并不发生(Internet Explorer帧不是一个 HTML 帧; 它是帧窗口.) 因此, WebBrowser 对象不知道什么时候新窗口将被打开. 因为 NewWindow2 有时候很难使用, 所以我们来检查它的两个参数: ppDisp and Cancel.

ppDisp 参数是接口指针, 一般是接收新WebBrowser 或者 InternetExplorer 对象的IDispatch 接口指针, 是你能够创建一个Internet Explorer新实例以便能够控制来自你的应用程序导航产生的新窗口. 该实例开始为新建的, 隐藏的, (暂时)不可导航WebBrowser 或者 InternetExplorer 对象. 在NewWindow2事件句柄函数返回之前, InternetExplorer 对象激发NewWindow2 事件将配置新WebBrowser对象的导航目标位置.

另外参数, Cancel, 时取消(Cancel)标志的地址. 应用程序能够设定此参数为TRUE 以取消导航操作或者设定为FALSE 以允许新建窗口操作. 设定Cancel 为 TRUE 完全取消新建窗口操作和导航.

如果你不在NewWindow2 事件处理过程中作任何事, 新的 InternetExplorer 对象将自动建立. 一些原因你想控制NewWindow2 事件以便控制新建InternetExplorer 对象. 为什么? 因为你想限制Internet Explorer的实例数量,或者你想控制创建的实例的事件.

以下 NewWindow2 事件控制函数中; 建立了一个新的, 隐藏的, 不可导航的Internet Explorer实例; 并且设定ppDisp 参数指向新实例.如果你想,你可以加入任何接收新实例事件的代码.

void CMyEvtSink::NewWindow2(LPDISPATCH* ppDisp, BOOL* Cancel)
{
   // Note that m_pIE is a class member of type IWebBrowser2*.
   HRESULT hr = CoCreateInstance(CLSID_InternetExplorer, NULL, 
                                 CLSCTX_LOCAL_SERVER, IID_IWebBrowser2, 
                                 (void**)&m_pIE);
   if (hr == S_OK)
      *ppDisp = (IDispatch*)pIE;
 
   // Do not set Cancel to TRUE. If you do,
   // the navigation will be completely canceled.
}

另外的原因控制NewWindow2 事件是由于你想你应用程序在用户选择在新窗口打开一个url时进行控制. 如果你不进行控制NewWindow2 事件, Internet Explorer 新实例将被创建.

以下为控制新建窗口的vb代码:

Private Sub WebBrowser1_NewWindow2(ppDisp As Object, Cancel As Boolean)
   Dim frmWB As Form1
   Set frmWB = New Form1
 
   Set ppDisp = frmWB.WebBrowser1.Object
   frmWB.Visible = True
 
   Set frmWB = Nothing
End Sub

在此NewWindow2事件代码中,档一个新常口需要被创建, 我们建立一个新的当前窗体Form1的拷贝. 在此表单窗体, 相当于Internet Explorer的新实例,将处理导航.

在mfc中我们需要首先加入NewWindow2 事件的映射条目到视图类的事件映射宏. (不要忘记包含 ExDispID.h in, 那里有DISPID_NEWWINDOW2 定义.)

ON_EVENT(CMfcWebHostView, IDC_WEBBROWSER, DISPID_NEWWINDOW2,
         OnNewWindow2, VTS_PDISPATCH VTS_PBOOL)

下一步声明OnNewWindow2 方法:

void OnNewWindow2(LPDISPATCH* ppDisp, BOOL* Cancel);

最后实现OnNewWindow2 方法以创建一个新的MfcWebHost窗口实例:

void CMfcWebHostView::OnNewWindow2(LPDISPATCH FAR* ppDisp,
                                   BOOL FAR* Cancel)
{
   // Ensure that ppDisp is not NULL.
   // If it is NULL, you probably specified
   // VT_DISPATCH for the first parameter in 
   // the ON_EVENT macro for NewWindow2 in 
   // the event sink map. The correct parameter
   // type is VT_PDISPATCH.
   //
   ASSERT(ppDisp);
   if (!ppDisp)
      return;
 
   // Get a pointer to the application object
   // for this application.
   //
   CWinApp* pApp = AfxGetApp();
 
   // Get the correct document template.
   //
   CDocTemplate* pDocTemplate;
   POSITION pos = pApp->GetFirstDocTemplatePosition();
   pDocTemplate = pApp->GetNextDocTemplate(pos);
 
   ASSERT(pDocTemplate);
 
   // Create the new frame.
   CFrameWnd* pNewFrame = pDocTemplate->CreateNewFrame(GetDocument(),
                                            (CFrameWnd*)AfxGetMainWnd());
   ASSERT(pNewFrame);
 
   // Activate the frame, and set its active view.
   //
   pDocTemplate->InitialUpdateFrame(pNewFrame, NULL);
 
   CMfcWebHostView* pWbView = 
                    (CMfcWebHostView*)pNewFrame->GetActiveView();
   
   ASSERT(pWbView);
 
   *ppDisp = pWbView->m_webBrowser.GetApplication();
}

如果你在sid或者mdi应用程序中控制一个WebBrowser控件,实现OnNewWindow2 方法是复杂的且需要知道如何解决同文档模版如何工作. 或许, 如果你在一个给予对话框的应用程序控制一个WebBrowser控件是较为容易的.此处为示例:

void CMyDlg::OnNewWindow2(LPDISPATCH FAR* ppDisp, BOOL FAR* Cancel) 
{
   m_dlgNewWB = new CMyDlg;
   m_dlgNewWB->Create(IDD_MYDLG_DIALOG);
 
   *ppDisp = m_dlgNewWB->m_webBrowser.GetApplication();
}

记住当你完成打开的新对话框后删除(delete) m_dlgNewWB. 且不要在CMyDlg::OnInitDialog方法中导航, 因为这样代码将不会工作.

                 

 

ProgressChange

ProgressChange 事件通告你的应用程序下在操作状态已经更新. ProgressChange 有两个参数:

·         Progress. 总计有多少进度将被展示, 如果为-1 表示整个进度已经完成

  • ProgressMax.最大进度值

容器可通过此事件显示下载进度。

 

事件发生序列

下图展示了IE的事件发生序列.但这仅仅为不包含帧的普通网页浏览. (没有包含诸如ProgressChange, CommandStateChangeOnToolBar, 等等事件.)不是所有事件都会被激发. 但是BeforeNavigate2 和DocumentComplete 每次浏览都会被激发.

 

  

Figure 7-5. The sequence of events fired by the WebBrowser control during a typical navigation.

WebBrowser 控件-说明、这是我自己编制浏览器时的资料,供各位参考。 
控件文件:system32\shdocvw.oca  shdocvw.dll 
注册:regsvr32 shdocvw.dll 
WebBrowser 是 IE 内核做的 VB 控件, 
WebBrowser.Document 为活动的文档返回自动化对象,引用 Microsoft HTML Object Library 可查看详细属性和方法

下面的解说假设窗体中有一个名称为 Web1 的 WebBrowser 控件 
■■方法 ============================== 
▲GoBack    相当于IE的“后退”按钮,使你在当前历史列表中后退一项 
▲GoForward 相当于IE的“前进”按钮,使你在当前历史列表中前进一项 
▲GoHome    相当于IE的“主页”按钮,连接用户默认的主页 
▲GoSearch  相当于IE的“搜索”按钮,连接用户默认的搜索页面 
▲Navigate  连接到指定的 URL,并显示网页 
▲Navigate2 与 Navigate 作用同? 
▲Refresh   刷新当前页面 
▲Refresh2  同上,只是可以指定刷新级别,所指定的刷新级别的值来自RefreshConstants枚举表, 
   该表定义在ExDisp.h中,可以指定的不同值如下: 
   REFRESH_NORMAL 执行简单的刷新,不将HTTP pragma: no-cache头发送给服务器 
   REFRESH_IFEXPIRED 只有在网页过期后才进行简单的刷新 
   REFRESH_CONTINUE 仅作内部使用。在MSDN里写着DO NOT USE! 请勿使用 
   REFRESH_COMPLETELY 将包含pragma: no-cache头的请求发送到服务器 
▲Stop      相当于IE的“停止”按钮,停止当前页面及其内容的载入 
■■属性=================================== 
▲Document 为活动的文档返回自动化对象。如果HTML当前正被显示在 Web1 中,则 Document 提供 
         对DHTML Object Model的访问途径。下面有详细介绍 
▲TopLevelContainer 返回一个Boolean值,表明 IE 是否是 Web1 控件顶层容器,是就返回 true 
▲Type    返回已被 Web1 控件加载的对象的类型。例如: 
        如果加载.doc文件,就会返回 Microsoft Word Document 
▲LocationName 返回一个字符串,该字符串包含着 Web1 当前显示的资源的名称, 
        如果资源是网页就是网页的标题; 
        如果是文件或文件夹,就是文件或文件夹的名称 
▲LocationURL 返回 Web1 当前正在显示的资源的 URL 
▲Busy 返回一个Boolean值,说明 Web1 当前是否正在加载 URL,如果返回 true 
        就可以使用 stop 方法来撤销正在执行的访问操作 
▲Object  设置返回一个显现网页的 SHDocVwCtl.WebBrowser_V1 对象。参见下文。 
▲MenuBar 
▲StatusBar 
▲ToolBar 
▲Visible 
▲ 
■■事件=================================== 
▲BeforeNavigate2    导航发生前触发(打开网页前),刷新时不触发 
▲CommandStateChange 当命令的激活状态改变时触发。它表明何时激活或关闭Back和Forward菜单项或按钮 
▲DocumentComplete   当整个文档完成是触发,刷新页面不触发 
▲DownloadBegin      当某项下载操作已经开始后触发,刷新也可触发此事件 
▲DownloadComplete   当某项下载操作已经完成后触发,刷新也可触发此事件 
▲NavigateComplete2  导航完成后触发,刷新时不触发 
▲NewWindow2         弹出新窗口以前触发 
   可在此事件中设置 ppDisp 参数新网页显示对象,同时不会出现 SHDocVwCtl.WebBrowser_V1 的 NewWindow 事件 
▲OnFullScreen       当 FullScreen 属性改变时触发。该事件采用 VARIENT_BOOL 的一个输入参数来指示 IE 是全 
   屏显示方式(VARIENT_TRUE)还是普通显示方式(VARIENT_FALSE) 
▲OnMenuBar          改变 MenuBar 属性时触发,标示参数是 VARIENT_BOOL 类型的。 
   VARIANT_TRUE 可见,VARIANT_ FALSE 隐藏 
▲OnQuit             无论是用户关闭浏览器还是开发者调用Quit方法,当IE退出时就会触发 
▲OnStatusBar        改变 StatusBar 属性时触发,标示状态栏是否可见。 
▲OnToolBar          改变 ToolBar 属性时触发,标示工具栏是否可见。 
▲OnVisible          改变 Visible 属性时触发 
▲StatusTextChange   控件的状态信息改变时触发。 
▲TitleChange        网页标题改变时触发。参数 Text 是新标题,Web1.LocationName 属性是旧标题 
■■SHDocVwCtl.WebBrowser_V1 对象================== 
  在窗体声明部分加入:Private WithEvents Web_V1 As SHDocVwCtl.WebBrowser_V1 
  在  Form_Load 加入:Set Web_V1 = Web1.Object 
  这样,Web_V1 就会有如下事件: 
▲NewWindow  弹出新窗口以前触发 
  如果在 Web1_NewWindow2 设置了 ppDisp 为新显示对象,就不会出现此事件 
  ★例子1,用自己开发的程序的新窗口显示弹出网页: 
    Dim nForm As New FormMain 'FormMain 为你的放有 Web1 控件的窗体 
    Processed = True '阻止控件调用 IE 弹出窗口 
    nForm.Show 
    nForm.Web1.Navigate URL 
  ★例子2,在同一窗口显示网页: 
    Processed = True '阻止控件调用 IE 弹出窗口 
    Web1.Navigate URL 
■■■■■■■■■■■■■■■■■■■■■■■■ 
■■Web1.Document 对象(HTMLDocument 对象)======================= 
▲All(1)集合,已加载到 Web1 中的 html 文档包含的所有标签对象:HTMLAreaElement 
  集合对象索引起点为0,总个数为 All.length 
  可以用索引访问其中对象,如:All(1) 
  也可以用 Html 头元素名称访问对象,如:All("body") 
  All(0) 一般是自身的 outerHTML,可以这样返回文档代码(查看源文件): 
    Text1.Text = Web1.Document.All(0).outerhtml 
  但上一条语句并不可靠,有的网页开头的代码不是<html>,而是其他,例如:<!--STATUS OK--> 
  All()集合有 HTMLAreaElement 对象的大多数属性,有的元素还有特有的属性。 
  注意 某元素的 sourceIndex 属性就是该对象在 Document.All() 集合中的编号 
▲body          主体元素对象:IHTMLElement 
▲activeElement 活动元素:IHTMLElement 
▲anchors       锚集合:IHTMLElementCollection 
▲appendChild   方法:附加子对象(newChild As IHTMLDOMNode) As IHTMLDOMNode 
▲applets       程序集合Java:IHTMLElementCollection 
▲attachEvent   方法:隶属事件(event As String, pdisp As object) As Boolean 
▲attributes    属性对象:object 
▲bgColor       背景色:Variant 
▲childNodes    子节点:object 
▲clear         方法:清除 
▲cloneNode     方法:复制节点(fDeep As Boolean) As IHTMLDOMNode 
▲close         方法:关闭 
▲compatMode 
▲cookie                 缓存 
▲createAttribute        方法:创建属性(bstrattrName As String) As IHTMLDOMAttribute 
▲createComment          方法:创建注释(bstrdata As String) As IHTMLDOMNode 
▲createDocumentFragment 方法:创建文档片段() As IHTMLDocument2 
▲createDocumentFromUrl  方法:从URL创建文档(bstrUrl As String, bstrOptions As String) As IHTMLDocument2 
▲createElement          方法:创建元素(eTag As String) As IHTMLElement 
▲CreateEventObject      方法:创建事件对象([pvarEventObject]) As IHTMLEventObj 
▲createRenderStyle      方法:(v As String) As IHTMLRenderStyle 
▲createStyleSheet       方法:创建方式表([bstrHref As String], [lIndex As Long = -1]) As IHTMLStyleSheet 
▲createTextNode         方法:创建文本节点(text As String) As IHTMLDOMNode 
▲defaultCharset         默认字符集? 
▲detachEvent            方法:分离事件(event As String, pdisp As object) 
▲dir 
▲doctype             文档类型:IHTMLDOMNode 
▲documentElement      文档元素:IHTMLElement 
▲domain 
▲elementFromPoint     方法:点所属组(x As Long, y As Long) As IHTMLElement 
▲embeds               :IHTMLElementCollection 
▲execCommand          方法:实行命令(cmdID As String, [showUI As Boolean = False], [value]) As Boolean 
▲execCommandShowHelp  方法:帮助命令(cmdID As String) As Boolean 
▲fgColor              前景色:Variant 
▲fileCreatedDate      文件创建日期 
▲file Modified Date   文件修改日期 
▲fileSize             文件大小 
▲fileUpdatedDate      文件更新日期 
▲FireEvent            方法:首事件(bstrEventName As String, [pvarEventObject]) As Boolean 
▲firstChild           首子对象:IHTMLDOMNode 
▲focus                方法: 
▲forms                窗体:IHTMLElementCollection 
▲frames               框架结构:FramesCollection 
▲getElementById       方法:获取指定的 ID 元素(v As String) As IHTMLElement 
▲getElementsByName    方法:获取指定的   Name  元素集合(v As String) As IHTMLElementCollection 
▲getElementsByTagName 方法:获取指定的 TagName 元素集合(v As String) As IHTMLElementCollection 
▲hasChildNodes        方法: 
▲hasFocus             方法:() As Boolean 
▲images               图像集合:IHTMLElementCollection

▲implementation       执行:IHTMLDOMImplementation 
▲insertBefore         方法:插入前面(newChild As IHTMLDOMNode, [refChild]) As IHTMLDOMNode 
▲lastChild 
▲lastModified         上一修改 
▲linkColor            链接色 
▲alinkColor           A 链接色: 
▲vlinkColor           V 链接色: 
▲links                连接集合:IHTMLElementCollection 
▲location             位置:HTMLLocation 
▲media                媒体 
▲mimeType 
▲nameProp 
▲namespaces           名称空间:object 
▲nextSibling          下一相同对象 
▲nodeName 
▲nodeType 
▲nodeValue 
▲open              方法:打开([url As String = "text/html"], [name], [features], [replace]) As object
▲ownerDocument     所有者文档:object 
▲parentNode        父节点:IHTMLDOMNode 
▲parentWindow      父窗口:IHTMLWindow2 
▲plugins           插件集合?:IHTMLElementCollection 
▲previousSibling   前一兄弟:IHTMLDOMNode 
▲protocol          协议 
▲queryCommandEnabled   方法:查询命令能否执行(cmdID As String) As Boolean 
▲queryCommandIndeterm  方法:查询命令?  (cmdID As String) As Boolean 
▲queryCommandState     方法:查询命令状态(cmdID As String) As Boolean 
▲queryCommandSupported 方法:查询命令支持(cmdID As String) As String 
▲queryCommandText      方法:查询命令文本(cmdID As String) As Boolean 
▲queryCommandValue     方法:查询命令值  (cmdID As String) 
▲readyState 
▲recalc         方法:([fForce As Boolean = False]) 
▲referrer 
▲releaseCapture 方法: 
▲removeChild    方法: 
▲removeNode     方法: 
▲replaceChild   方法: 
▲replaceNode    方法:替换节点(replacement As IHTMLDOMNode) As IHTMLDOMNode 
▲scripts              script集合:IHTMLElementCollection 
▲security             安全:String 
▲selection            已选择的对象集合:IHTMLSelectionObject 
▲styleSheets          方式表单:HTMLStyleSheetsCollection 
▲swapNode   方法:交换节点(otherNode As IHTMLDOMNode) As IHTMLDOMNode 
▲title 
▲toString   方法: 
▲url 
▲URLUnencoded 
▲write      方法:(ParamArray psarray() As Variant) 
▲writeln    方法:(ParamArray psarray() As Variant) 
▲onstop 既是属性,又是事件 
▲共有属性和事件 
■■共有属性和事件:既是属性,又是事件。面带 on 的======================= 
▲onactivate         onActivate         激活 
▲onafterupdate      onAfterUpdate      更新后 
▲onbeforeactivate   onBeforeActivate   激活前 
▲onbeforecopy       onBeforeCopy       复制前 
▲onbeforecut        onBeforeCut        剪切前 
▲onbeforedeactivate onBeforeDeactivate 无效前 
▲onbeforeeditfocus  onBeforeEditFocus  获得编辑焦点前 
▲onbeforepaste      onBeforePaste      粘贴前 
▲onbeforeupdate     onBeforeUpdate     更新前 
▲onblur             onBlur             模糊 
▲oncellchange       onCellChange       单元改变 
▲onclick            onClick            单击 
▲oncontextmenu      onContextMenu      上下文菜单 
▲oncontrolselect    onControlSelect    控件选定 
▲oncopy             onCopy             复制 
▲oncut              onCut              剪切 
▲ondataavailable    onDataAvailable    有用数据 
▲ondatasetchanged   onDataSetChanged   数据设置改变 
▲ondatasetcomplete  onDataSetComplete  数据设置完成 
▲ondblclick         onDblClick         双击 
▲ondeactivate       onDeactivate       变为非活动 
▲ondrag             onDrag             拖 
▲ondragend          onDragEnd          拖结束 
▲ondragenter        onDragEnter        拖进 
▲ondragleave        onDragLeave        拖离 
▲ondragover         onDragOver         拖过 
▲ondragstart        onDragStart        拖开始 
▲ondrop             onDrop 
▲onerrorupdate      onErrorUpdate      更新错误 
▲onfilterchange     onFilterChange     过滤器改变 
▲onfocus            onFocus       
▲onfocusin          onFocusIn          焦点进入 
▲onfocusout         onFocusOut         焦点离开 
▲onhelp             onHelp 
▲onkeydown          onKeyDown 
▲onkeypress         onKeyPress 
▲onkeyup            onKeyUp 
▲onlayoutcomplete   onLayoutComplete   版面完成 
▲onlosecapture      onLoseCapture      失去捕获 
▲onmousedown        onMouseDown 
▲onmouseenter       onMouseEnter 
▲onmouseleave       onMouseLeave 
▲onmousemove        onMouseMove 
▲onmouseout         onMouseOut 
▲onmouseover        onMouseOver 
▲onmouseup          onMouseUp 
▲onmousewheel       onMouseWheel       鼠标滚轮 
▲onmove             onMove 
▲onmoveend          onMoveEnd 
▲onmovestart        onMoveStart 
▲onpage             onPage 
▲onpaste            onPaste            粘贴 
▲onpropertychange   onPropertyChange   性质改变 
▲onreadystatechange onSeadyStateChange 准备状态改变 
▲onresize           onResize 
▲onresizeend        onResizeEnd 
▲onresizestart      onResizeStart 
▲onrowenter         onRowEnter         行进入 
▲onrowexit          onRowExit 
▲onrowsdelete       onRowsDelete 
▲onrowsinserted     onRowsInserted 
▲onscroll           onScroll 
▲onselectstart      onSelectStart 
  ------- 
■■HTMLDivElement  对象:div 元素特有的属性======================= 
▲align         排列:String 
▲dataFld       数据流体:String 
▲dataFormatAs  数据格式:String 
▲dataSrc       数据Src:String 
▲noWrap 
■■HTMLAreaElement  对象:区域元素 大多数元素共有的属性======================= 
一个 HTMLAreaElement 可以包含多个 HTMLAreaElement 对象,用 all() 集合访问 
▲sourceIndex   对象在 Document.All() 集合中的编号 
▲accessKey  String:访问键 
▲addBehavior  方法:添加行为(bstrUrl As String, [pvarFactory]) As Long 
▲addFilter    方法:添加过滤器(pUnk As Unknown) 
▲all          【参 HTMLAreaElement】 
▲alt 
▲appendChild  【参 HTMLAreaElement】 
▲applyElement 方法:申请元素(apply As IHTMLElement, where As String) As IHTMLElement 
▲attachEvent  方法:隶属事件(event As String, pdisp As object) As Boolean 
▲attributes   【参 HTMLAreaElement】 
▲behaviorUrns 行为缸对象:object 
▲blur         方法:模糊 
▲canHaveChildren 是否能拥有子对象 
▲canHaveHTML     是否能拥有HTML 
▲childNodes      子节点:object 
▲children        是否子对象 
▲className       类名 
▲clearAttributes 方法:清除属性 
▲click           方法:单击 
▲clientHeight    内部高度? 
▲clientLeft 
▲clientTop 
▲clientWidth 
▲cloneNode          方法:克隆节点(fDeep As Boolean) As IHTMLDOMNode 
▲componentFromPoint 方法:点所属组(x As Long, y As Long) As String 
▲contains           方法:包含contains(pChild As IHTMLElement) As Boolean 
▲contentEditable 
▲coords 
▲createControlRange 方法:创建控制山脉(行列)() As object 
▲currentStyle       当前样式:IHTMLCurrentStyle 
▲detachEvent        方法:分离事件(event As String, pdisp As object) 
▲dir 
▲disabled       不可用 
▲document       文档对象:object 
▲doScroll  方法([component]) 
▲dragDrop  方法:拖放 
▲filters   过滤器: IHTMLFiltersCollection 
▲FireEvent 方法FireEvent(bstrEventName As String, [pvarEventObject]) As Boolean 
▲firstChild  首子对象:IHTMLDOMNode 
▲focus            方法 
▲getAdjacentText  方法:获取临近文本(where As String) As String 
▲getAttribute     方法:获取属性(strAttributeName As String, [lFlags As Long]) 
▲getAttributeNode 方法:获取属性节点(bstrName As String) As IHTMLDOMAttribute 
▲getBoundingClientRect 方法:获取内部范围矩形() As IHTMLRect 
▲getClientRects        方法:获取委托矩形() As IHTMLRectCollection 
▲getElementsByTagName  【参 HTMLAreaElement】 
▲getExpression         方法:获取表达(propname As String) 
▲hasChildNodes         【参 HTMLAreaElement】 
▲hash        无用信息 
▲hideFocus 
▲host        主人 
▲hostname    主人名称 
▲href      默认属性 
▲id          标示字符串 
▲innerHTML   元素内的 html 代码 
▲innerText   内部的纯文本,可以显示到网页上的文字 
▲insertAdjacentElement 方法:插入临近元素(where As String, insertedElement As IHTMLElement) As IHTMLElement 
▲insertAdjacentHTML    方法:(where As String, html As String) 
▲insertAdjacentText    方法:(where As String, text As String) 
▲insertBefore          方法:(newChild As IHTMLDOMNode, [refChild]) As IHTMLDOMNode 
▲isContentEditable 
▲isDisabled 
▲isMultiLine 
▲isTextEdit 
▲lang 
▲language 
▲lastChild 
▲mergeAttributes  方法:合并属性(mergeThis As IHTMLElement, [pvarFlags]) 
▲nextSibling      下一同级对象 
▲nodeName 
▲nodeType 
▲nodeValue 
▲noHref 
▲normalize        方法:规格化 
▲offsetHeight  偏移(缩进)高度 
▲offsetLeft 
▲offsetParent 
▲offsetTop 
▲offsetWidth   平移宽度

▲outerHTML          包含元素本身及内部的 html 代码 
▲outerText 
▲ownerDocument 
▲parentElement 
▲parentNode 
▲parentTextEdit 
▲pathname 
▲port 
▲previousSibling 
▲protocol 
▲readyState 
▲recordNumber 
▲releaseCapture       方法:释放捕获 
▲removeAttribute      方法:移除属性 
▲removeAttributeNode  方法 移除属性节点
▲removeBehavior       方法:移除行为 
▲removeChild          方法 移子
▲removeExpression     方法   移表达式
▲removeFilter         方法 
▲removeNode           方法 
▲replaceAdjacentText  方法:替换临近文本 
▲replaceChild         方法 
▲replaceNode          方法 
▲runtimeStyle   运行方式:IHTMLStyle 
▲scopeName      范围名称 
▲scrollHeight 
▲scrollIntoView   方法 
▲scrollLeft 
▲scrollTop 
▲scrollWidth 
▲search 
▲setActive        方法 
▲setAttribute     方法 
▲setAttributeNode 方法 
▲setCapture       方法 
▲setExpression    方法 
▲shape 
▲style 
▲swapNode         方法:交换节点 
▲tabIndex 
▲tagName          标签名 
▲tagUrn           标签缸 
▲target           目标 
▲title 
▲toString 
■■Web1 应用例子 
▲在网页加裁完毕后,运行其中某层的链接,当然事先必须知道该层链接的TagName: 
   WebBrowser1.Document.getElementsByname("TagName").click。


0 0
原创粉丝点击