科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件使用VS2005打造简单分页浏览器

使用VS2005打造简单分页浏览器

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

很早就有搞一个浏览器的想法了,在VS2003上就试图做过,苦于经常会有这种情况出现

作者:zhangjidong 来源:博客园 2007年11月11日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
初始化

#region//初始化
/// <summary>
/// 初始化
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_Load(object sender, EventArgs e)
{
 initMainForm();
}
/// <summary>
/// 初始化浏览器
/// </summary>
private void initMainForm()
{
 TabPage mypage = new TabPage();
 WebBrowser tempBrowser = new WebBrowser();
 tempBrowser.Navigated += new WebBrowserNavigatedEventHandler(tempBrowser_Navigated);
 tempBrowser.NewWindow += new CancelEventHandler(tempBrowser_NewWindow);
 tempBrowser.StatusTextChanged += new EventHandler(tempBrowser_StatusTextChanged);
 tempBrowser.ProgressChanged += new WebBrowserProgressChangedEventHandler(tempBrowser_ProgressChanged);
 tempBrowser.Dock = DockStyle.Fill;
 tempBrowser.GoHome();//和新建空白页不同
 mypage.Controls.Add(tempBrowser);
 tabControl1.TabPages.Add(mypage);
}

#endregion

  说明:分页浏览器初始化时要定向到主页,虽然我们的浏览器暂时没有提供设置主页的功能。

  临时浏览器事件

#region//临时浏览器事件
/// <summary>
/// 临时浏览器状态变化事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void tempBrowser_StatusTextChanged(object sender, EventArgs e)
{
 WebBrowser myBrowser = (WebBrowser)sender;
 if (myBrowser != getCurrentBrowser())
 {
  return;
 }
 else
 {
  toolStripStatusLabel1.Text = myBrowser.StatusText;
 }
}
/// <summary>
/// 在当前页面上重新定向
/// </summary>
/// <param name="address">url</param>
private void newCurrentPageUrl(String address)
{
 getCurrentBrowser().Navigate(getUrl(address));
}
/// <summary>
/// 临时浏览器产生新窗体事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void tempBrowser_NewWindow(object sender, CancelEventArgs e)
{
 //获取触发tempBrowser_NewWindow事件的浏览器
 WebBrowser myBrowser = (WebBrowser)sender;
 //获取触发tempBrowser_NewWindow事件的浏览器所在TabPage
 TabPage mypage = (TabPage)myBrowser.Parent;
 //通过StatusText属性获得新的url
 string NewURL = ((WebBrowser)sender).StatusText;
 //生成新的一页
 TabPage TabPageTemp = new TabPage();
 //生成新的tempBrowser
 WebBrowser tempBrowser = new WebBrowser();
 //临时浏览器定向到新的url
 tempBrowser.Navigate(NewURL);
 tempBrowser.Dock = DockStyle.Fill;
 //为临时浏览器关联NewWindow等事件
 tempBrowser.NewWindow += new CancelEventHandler(tempBrowser_NewWindow);
 tempBrowser.Navigated += new WebBrowserNavigatedEventHandler(tempBrowser_Navigated);
 tempBrowser.ProgressChanged += new WebBrowserProgressChangedEventHandler(tempBrowser_ProgressChanged);
 tempBrowser.StatusTextChanged+=new EventHandler(tempBrowser_StatusTextChanged);
 //将临时浏览器添加到临时TabPage中
 TabPageTemp.Controls.Add(tempBrowser);
 //将临时TabPage添加到主窗体中
 this.tabControl1.TabPages.Add(TabPageTemp);
 //使外部无法捕获此事件
 e.Cancel = true;
}
/// <summary>
/// 临时浏览器定向完毕
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tempBrowser_Navigated(object sender, WebBrowserNavigatedEventArgs e)
{
 tscbUrl.Text = getCurrentBrowser().Url.ToString();
 WebBrowser mybrowser = (WebBrowser)sender;
 TabPage mypage=(TabPage)mybrowser.Parent;
 //设置临时浏览器所在tab标题
 mypage.Text= newstring(mybrowser.DocumentTitle);
}
#endregion

  说明:临时浏览器实际上是用程序的方式先new出一个tempBrowser然后添加到一个分页中去。其中这个tempBrowser我称它为临时浏览器。其中void tempBrowser_NewWindow(object sender, CancelEventArgs e){..}事件是比较重要的,我认为它是整个程序的核心部分。

  tabControl1事件

#region//tabControl1事件
/// <summary>
/// 切换tab
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
{
 WebBrowser mybor = (WebBrowser)tabControl1.SelectedTab.Controls[0];
 if (mybor.Url != null)
 {
  //地址输入框
  tscbUrl.Text = mybor.Url.ToString();
  tabControl1.SelectedTab.Text = newstring(mybor.DocumentTitle);
 }
 else
 {
  tscbUrl.Text = "about:blank";
  tabControl1.SelectedTab.Text = "空白页";
 }
 setStatusButton();
}
/// <summary>
/// 关闭当前tab
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tabControl1_DoubleClick(object sender, EventArgs e)
{
 //仅仅剩下一个tab时返回
 if (tabControl1.TabPages.Count <= 1)
 {
  tabControl1.SelectedTab.Text = "空白页";
  getCurrentBrowser().Navigate("about:blank");
 }
 else
 {
  //先将tabControl1隐藏然后remove掉目标tab(如果不隐藏则出现闪烁,即系统自动调转到tabControl1的第一个tab然后跳会。)最后显示tabControl1。

  tabControl1.Visible = false;
  WebBrowser mybor = getCurrentBrowser();
  //释放资源
  mybor.Dispose();
  mybor.Controls.Clear();
  this.tabControl1.TabPages.Remove(this.tabControl1.SelectedTab);
  //重新设置当前tab
  tabControl1.SelectedTab = tabControl1.TabPages[tabControl1.TabPages.Count - 1];
  tabControl1.Visible = true;
 }
}
#endregion

  说明:当双击当前Tabpage从而关闭当前页面时,tabControl1 会首先定位到第一个tab然后再定位到指定的Tabpage上,我采取隐藏tabControl1-处理-显示tabControl1思路解决此问题。

  总结

  分页浏览器所谓"分页",从实现上讲就是"控件的动态添加",当前浏览器产生新窗体时,先new出一个TabPage,再new一个WebBrowser,把这个WebBrowser加载了一些事件以后添加到先前的这个TabPage上,然后把这个TabPage添加到"主窗体"tabControl1中。

  不足之处

  最大的不足:

  用((WebBrowser)sender).StatusText无法捕获的url(例如StatusText 为"javascript:void(0)")目前无法解决这也是某些莫名其妙的问题的出处。另外某些脚本不支持。其他一些罪状让我们共同罗列…

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章