简介
这篇文章简单介绍了如何用WebBrower控件创建web浏览器。
控件基础
WebBrowser用ActiveX控件的形式实现,很容易就能加到对话框中,就象用普通的控件一样方便。WebBrowser控件的很多功能都继承自COM对象(Shdocvw.dll、 MSHTML.DLL 和 Urlmon.dll)。该控件的实现都在CWebBrowser2类中。
GoBack 返回到上一浏览界面
GoForward 前进到下一浏览界面
GoHome 直接浏览到主页
Navigate 用具体的URL浏览
Navigate2 用的URL或者文件路径浏览
Refresh 刷新当前页面
WebBrowser是一个ActiveX控件,必须用一个对话框(用作容器)来容纳它。该控件通过发送事件的方式来与对话框交互。通用的事件包括:
BeforeNavigate2 该事件由调用Navigate或Navigate2的方法引起,当用户点击超连接时也会引发该事件
DownloadBegin 该事件在开始下载文档时发生。即在找到文档,并即将下载时。
DownloadComplete 在三种情况下都会引发该事件:下载文档失败、停止、下载失败
NavigateComplete2 文档已经下载了一部分,并没有完全下载时。
StatusTextChange 浏览器的状态文本改变时发生。即在IE状态条上显示的文本。
DocumentComplete 该事件发生在文档成功下载时。关于该事件有以下两点要注意:
1. 当下载的页面只有一个框时,该事件会在下载完成该页面所有的内容时发生
2. 当下载的页面有多个框时,该时间可能会引发多次。但也不是每个框都会对应引发该事件。每个框能引发DownloadBegin和相应的DocumentComplete事件。
项目实施步骤
以下用VC++6.0举例说明
1. 启动VC++集成开发环境
选择“新建菜单项”
选择工程选项:MFC AppWizard (exe)
输入工程名:例如Browser_Control,并选择工程的目录
点击OK
2. 在MFC AppWizard -1中选择Dialog-based,点击“next”
3. 接下来只要点击“Next”和“Finish”就可以了。
4. 右键击对话框编辑器,在弹出菜单中选择“Insert ActiveX Control”。接着出现一个对 话框,在对话框中选择“Microsoft Web Browser”,点击OK。
5. 右键点击WebBrowser控件
在弹出菜单中选择“ClassWizard”
点击“Member Variables”项目,显示控件ID。
选择IDC_EXPLORER1
点击“Add Variable”,确认消息框弹出
点击“OK”,输入变量名:例如m_WebBrowser
程序启动的时候,对话框上的控件就是一块空白,什么都没有。要使其能正常的显示就需要在OnInitDialog中调用WebBrowser控件的Navigate接口。代码如下:
- BOOL CBrowser_ControlDlg::OnInitDialog()
- {
- m_WebBrowser.Navigate("http://www.google.com", NULL, NULL, NULL, NULL);
- }
到这一步,程序就可以跑起来了,并能简单的一次浏览单个网页。
为了加入更丰富的功能,例如:输入URL进行浏览、前进、后退、停止、刷新、主页和搜索等,需要继续在上面的基础上添加编辑控件、下拉列表和按钮。添加这些控件的步骤就不在此详细说明了,与上面添加WebBrowser控件的方法差不多。下面仅列出相应的控件ID和名称:
转到--ID_OK,
返回--ID_BACK
前进--ID_FORWARD
停止--ID_STOP
刷新--ID_REFRESH
主页--ID_HOME
搜索--ID_SEARCH
添加完控件之后,就需要给每个控件添加消息响应函数了。以下便是源码:
- void CBrowser_ControlDlg::OnOK()
- {
- // TODO: Add extra validation here
- m_WebBrowser.Navigate(m_sURL , NULL, NULL, NULL, NULL);
- //OR you can also do the following to achieve the same result
- // CString str;
- // m_eURL.GetWindowText(str);
- // m_WebBrowser.Navigate(str , NULL, NULL, NULL, NULL);
- }
返回调用GoBack
- void CBrowser_ControlDlg::OnBack()
- {
- // TODO: Add your control notification handler code here
- m_WebBrowser.GoBack();
- }
前进调用GoForward
- void CBrowser_ControlDlg::OnForward()
- {
- // TODO: Add your control notification handler code here
- m_WebBrowser.GoForward();
- }
停止调用Stop
- void CBrowser_ControlDlg::OnStop()
- {
- // TODO: Add your control notification handler code here
- m_WebBrowser.Stop();
- }
更新调用Refresh
- void CBrowser_ControlDlg::OnRefresh()
- {
- // TODO: Add your control notification handler code here
- m_WebBrowser.Refresh();
- }
回到主页
- void CBrowser_ControlDlg::OnHome()
- {
- // TODO: Add your control notification handler code here
- m_WebBrowser.GoHome();
- }
调用默认的搜索功能
- void CBrowser_ControlDlg::OnSearch()
- {
- // TODO: Add your control notification handler code here
- m_WebBrowser.GoSearch();
- }
接下来就要给完善这个用控件制作的浏览器了:
(1)当浏览器处于忙状态时,播放一个.avi文件
(2)显示浏览器的当前状态
(3)用当前访问的URL更新URL输入框
要获得这些功能其实很简单,响应几个事件就可以(DownloadBegin, DownloadComplete, StatusTextChange 和 DocumentComplete )。下面是部分代码:
- BOOL CBrowser_ControlDlg::OnInitDialog()
- {
- .
- m_Animate.Open("progress.avi");
- .
- }
- void CBrowser_ControlDlg::OnDownloadBeginExplorer1()
- {
- // TODO: Add your control notification handler code here
- m_Animate.Play(0,-1,-1);
- }
- void CBrowser_ControlDlg::OnDownloadCompleteExplorer1()
- {
- // TODO: Add your control notification handler code here
- m_Animate.Stop();
- m_Animate.Seek(0);
- }
- void CBrowser_ControlDlg::OnStatusTextChangeExplorer1(LPCTSTR Text)
- {
- // TODO: Add your control notification handler code here
- if (GetSafeHwnd())
- {
- CWnd *pWnd = GetDlgItem(IDC_STATUS_TEXT);
- if (pWnd)
- pWnd->SetWindowText(Text);
- }
- }
- void CBrowser_ControlDlg::OnDocumentCompleteExplorer1(LPDISPATCH pDisp, VARIANT FAR* URL)
- {
- // TODO: Add your control notification handler code here
- CString locURL;
- locURL= m_WebBrowser.GetLocationURL();
- m_eURL.SetWindowText(locURL);
- }