65.9K
CodeProject 正在变化。 阅读更多。
Home

编程IE-使用WebBrowser控件创建浏览器。

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.17/5 (13投票s)

2008年10月4日

CPOL

8分钟阅读

viewsIcon

77501

downloadIcon

5063

本文介绍如何使用WebBrowser控件创建您自己的浏览器。

Browser_Control_Src

引言

本文介绍如何使用WebBrowser控件创建您自己的浏览器。

WebBrowser控件基础

WebBrowser控件实现为一个ActiveX控件,可以轻松地添加到对话框资源中,从而使您可以在对话框中使用该控件。Internet Explorer/WebBrowser控件的大部分功能来自Shdocvw.dll、MSHTML.DLL和Urlmon.dll中实现的COM对象。用于控制WebBrowser控件的接口是IWebBrowser2。当WebBrowser控件添加到您的项目中时,会创建一个名为CWebBrowser2的包装类。此类用于管理与WebBrowser控件的交互。WebBrowser控件提供了许多可用于控制它的方法。

GoBack           导航到历史列表中的上一个位置
GoForward       导航到历史列表中的下一个位置
GoHome             导航到主页URL
Navigate           加载指定的URL
Navigate2         加载指定的URL或特殊文件夹
Refresh           强制重新加载当前位置?

WebBrowser控件是一个ActiveX控件,它托管在一个容器(在本例中是对话框)中,并通过发送事件通知其容器。WebBrowser控件会生成许多事件,常用的事件有:

BeforeNavigate2     调用Navigate或Navigate2方法,或用户单击链接时,会触发此事件。
DownloadBegin       浏览器开始下载文档时(即浏览器找到文档并即将下载时)发生此事件。
DownloadComplete  下载文档完成、暂停或失败时会触发此事件。
NavigateComplete2 在文档完全下载之前,但至少有一部分文档已下载时,可能会发生此事件。
StatusTextChange 浏览器状态文本更改时(即IE状态栏中显示的消息)会触发此事件。
DocumentComplete WebBrowser控件在完成下载网页时会触发DocumentComplete事件。有关此事件的一些有趣的事实:

• 对于没有框架的页面,DocumentComplete事件会在所有操作完成后触发一次。
• 对于多帧页面,DocumentComplete事件会触发多次。并非每个框架都会触发此事件,但每个触发DownloadBegin事件的框架都会触发相应的DocumentComplete事件。

项目实现步骤

我正在使用Microsoft Visual C++ 6.0 IDE来创建此应用程序,步骤如下:

步骤(1)

启动Visual C++ Studio
在“文件”菜单中选择“新建”。
选择项目:“MFC AppWizard (exe)”。
输入项目名称(例如:Browser_Control)并选择一个可接受的位置。
点击“确定”。

步骤(2)

当出现“步骤1”对话框时,选择“基于对话框”,然后单击“下一步”。

步骤(3)

其余步骤的默认选择是合适的,所以不做任何操作,只需单击“下一步”,然后单击“完成”。

现在您已经有了一个基本框架。由于我们选择了基于对话框的应用程序,因此在对话框编辑器中会出现一个带有“确定”和“取消”按钮的对话框。现在我们需要将Web Browser ActiveX控件添加到对话框中。

步骤(4)

右键单击对话框编辑器。从菜单中选择“插入ActiveX控件”。选择“Microsoft Web Browser”。单击“确定”。
现在浏览器ActiveX控件已嵌入到您的对话框中,但要使用它并与之交互,我们需要添加WebBrowser类和成员变量。

步骤(5)

右键单击WebBrowser控件。
选择ClassWizard。
单击“成员变量”选项卡以显示标识符。
现在选择IDC_EXPLORER1。
单击“添加变量”,会出现一个确认消息框。
单击“确定”,然后为浏览器变量输入一个名称(例如:m_WebBrowser)。

步骤(6)

要显示WebBrowser控件,您的应用程序必须导航到某个URL,因此在OnInitDialog方法中,我们将调用Browser的Navigate方法。

BOOL CBrowser_ControlDlg::OnInitDialog()
 {
  .
    m_WebBrowser.Navigate("http://www.google.com/">http://www.google.com", NULL, NULL, NULL, NULL);
  .
 }        

现在,您的应用程序已具备最基本的功能。现在您可以直接编译并运行该应用程序。

要为您的应用程序添加浏览功能,您必须提供一个编辑框或组合框用于输入URL,以及几个用于控制导航的按钮,如GO、Back、Forward、Stop、Refresh、Home和Search。要添加编辑控件,只需转到对话框编辑器,从控件工具栏中选择“编辑控件”,然后将其拖放到所需位置。这将创建编辑控件,但要访问和使用编辑控件,您需要添加成员变量。要添加成员变量,请右键单击编辑控件。选择ClassWizard。单击“成员变量”选项卡以显示标识符。现在选择IDC_URL(这是我添加的编辑控件的ID)并单击“添加变量”。为变量输入一个名称:m_sURL(类别-值,类型为CString)。再次选择IDC_URL并单击“添加变量”。为变量输入一个名称:m_eURL(类别-控件,类型为CEdit)。
现在添加按钮,转到对话框编辑器,从控件工具栏中选择“按钮”,然后将其拖放到所需位置。添加七个按钮,分别具有以下名称和ID:

GO--ID_OK, Back--ID_BACK, Forward--ID_FORWARD, Stop--ID_STOP, Refresh--ID_REFRESH, Home--ID_HOME, Search--ID_SEARCH。

您可以根据自己的选择设置ID。现在为所有添加的按钮添加事件处理程序。要添加事件处理程序,只需右键单击按钮,选择“事件…”,然后单击“添加处理程序”。将弹出一个包含成员函数名称的消息框。单击“确定”,您的事件处理程序将被添加到相应的源文件中。现在您需要在适当的事件处理程序中添加与您希望提供的功能相关的代码。

在“GO”按钮单击时,您希望浏览器导航到编辑框中给出的URL。为此,您需要从编辑框中获取URL,并将其作为参数传递给Browser的Navigate方法。您可以按如下方式完成此任务:

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);
}  

For going Back, call the Browser's 'GoBack' method.
void CBrowser_ControlDlg::OnBack()
{
  // TODO: Add your control notification handler code here
  m_WebBrowser.GoBack();
}  
 
For going Forward, call the Browser's 'GoForward' method.
void CBrowser_ControlDlg::OnForward()
{
  // TODO: Add your control notification handler code here
  m_WebBrowser.GoForward();
}
For Stopping the Browser's Navigation, call the Browser's 'Stop' method.
void CBrowser_ControlDlg::OnStop()
{
  // TODO: Add your control notification handler code here
  m_WebBrowser.Stop();
}
For Refreshing a Page, call the Browser's 'Refresh' method.
void CBrowser_ControlDlg::OnRefresh()
{
  // TODO: Add your control notification handler code here
  m_WebBrowser.Refresh();
}
To Navigate to the Home URL, call the Browser's 'Home' method.
void CBrowser_ControlDlg::OnHome()
{
  // TODO: Add your control notification handler code here
  m_WebBrowser.GoHome();
}
To invoke the default Search, call the Browser's 'GoSearch' method.
void CBrowser_ControlDlg::OnSearch()
{
  // TODO: Add your control notification handler code here
  m_WebBrowser.GoSearch();
}
        

现在我们将为应用程序添加更多功能,例如:

(1)在浏览器忙碌时播放.avi文件。
(2)显示浏览器的当前状态。
(3)使用当前位置更新URL框。

为了实现这些目标,我们需要处理一些事件(DownloadBegin、DownloadComplete、StatusTextChange和DocumentComplete),这些事件我在本文前面已经讨论过。要添加上述事件,请按Ctrl+W打开Class Wizard(或者您可以转到对话框编辑器,选择Browser Control,右键单击并选择Class Wizard)。现在选择第一个选项卡,即“消息映射”,然后选择IDC_EXPLORER1。现在,从“消息”中逐个选择上述事件,然后单击“添加函数”按钮,然后单击“确定”。VC++ IDE将在相应的源文件中插入这些事件的最小代码。

要播放.avi文件,我们需要将Animate Control添加到我们的对话框中。要添加Animate Control,请转到对话框编辑器,从控件工具栏中选择“Animate Control”,然后将其拖放到所需位置。为Animate Control添加一个名为m_Animate的变量。现在我们的Animate Control已准备好使用。我们需要告诉Animate Control播放哪个.avi文件,这可以通过调用Animate Control的“Open”方法来完成。我们将在OnInitDialog方法中调用Animate Control的“Open”方法。

BOOL CBrowser_ControlDlg::OnInitDialog()
{
 .
  m_Animate.Open("progress.avi");
 .
}     

正如我之前所讨论的,DownloadBegin是浏览器开始下载文档时发生的事件,所以这是我们将通过调用Animate Control的“Play”方法来开始播放动画(.avi文件)的地方。

void CBrowser_ControlDlg::OnDownloadBeginExplorer1()
{
  // TODO: Add your control notification handler code here
  m_Animate.Play(0,-1,-1);
}   

传递给Animation Control的Play()方法的第一个和第二个参数指定开始和结束帧。第一个参数的值0表示从AVI剪辑的第一个帧开始,第二个参数的值-1表示AVI文件将播放到最后一帧。第三个参数是重播AVI剪辑的次数。值为-1表示无限次重播文件。

由于我们知道DownloadComplete是下载完成、暂停或失败时会触发的事件,所以这是我们将通过调用Animate Control的“Stop”方法来停止播放动画(.avi文件),并通过调用“Seek”方法来重置它。Seek中的值0表示显示AVI剪辑中的第一帧。

void CBrowser_ControlDlg::OnDownloadCompleteExplorer1()
{
  // TODO: Add your control notification handler code here
   m_Animate.Stop();
   m_Animate.Seek(0);
}

要显示当前的浏览器状态,请将一个静态文本字段(ID为:IDC_STATUS_TEXT)添加到对话框中。我们知道StatusTextChange是浏览器状态文本更改时触发的事件,因此我们可以使用它在静态文本字段中显示当前的浏览器状态。

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);
  }
}

要使用当前位置更新URL框,我们需要检索浏览器当前的URL位置,并使用该位置更新URL框。我们可以通过在DocumentComplete事件中使用“GetLocationURL”方法来实现这一点,该事件在浏览器完成下载网页时触发。

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);
}

参考文献

http://www.msdn.microsoft.com

未来工作

在本文中,我讨论了如何使用Browser Control创建一个简单的WebBrowser。在下一篇文章中,我将展示如何使用CHtmlView类创建一个WebBrowser。

历史

初始版本:1.0

© . All rights reserved.