| 网站首页 | 文章中心 | 电子书下载 | 矢量图库 | 视频教程 | 素材下载 | 程序代码下载 | JS代码 | 论坛 | 
常用软件类:
|杀毒安全 |联络聊天 |网络软件 |多媒体类 |系统工具 |图形图像 |系统工具 |应用软件 |行业软件
开发设计类:
|动画制作 |图像处理 |3D设计 |操作系统 |站长学院 |网络相关 |WEB设计 |数据库类 |程序开发
VS2005打造简单分页浏览器
作者:佚名    文章来源:网络    点击数:    更新时间:2006-12-1
 

 

初始化

#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)")目前无法解决这也是某些莫名其妙的问题的出处。另外某些脚本不支持。其他一些罪状让我们共同罗列…

上一页  [1] [2] [3] [4] 


  • 上一篇文章:

  • 下一篇文章: 没有了
  • 相关文章