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 控件导航类方法调用时发生, 例如 Navigate, Navigate2, GoHome, 或者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, CommandStateChange, OnToolBar, 等等事件.)不是所有事件都会被激发. 但是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。
- WebBrowser 事件讲解
- WebBrowser 事件
- WebBrowser 事件
- WebBrowser捕获点击事件
- webbrowser delphi 事件详解
- webbrowser delphi 事件详解
- webbrowser控件事件
- WebBrowser控件的事件
- 事件讲解
- WebBrowser控件捕捉DHTML事件
- WebBrowser接收事件的途径
- WebBrowser控件捕捉DHTML事件
- 忆龙2009:webBrowser事件处理
- wtl添加webbrowser事件无效
- WebBrowser方法,属性和事件
- Webbrowser新开窗口事件
- 通过webbrowser触发onmousedown事件
- webbrowser相关操作大全-1-----WebBrowser的方法、属性、事件
- 关于C++单例模式的终极总结
- 解决Oracle ORA-12505, TNS:listener does not currently know of SID given in connect
- Makefile模板
- 如何创建一个动态链接库DLL
- wifi pineapple | WiFiPineapple plus 基本设置
- WebBrowser 事件讲解
- 你需要知道的 16 个 Linux 服务器监控命令
- JAVA中使用FTPClient实现FTP上文件的操作
- 【IOS网络编程】socket编程 - Asyncsocket
- NSUserDefaults保存NSObject类型的方法
- 最简单的基于FFmpeg的封装格式处理:视音频复用器(muxer)
- js实现图片滚动
- Lua中获取指定月份总天数
- activity切换动画原理