`
caozuiba
  • 浏览: 901905 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多
<iframe marginwidth="0" marginheight="0" src="http://218.16.120.35:65001/PC/Global/images/b.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>
1 引言
很早就有搞一个浏览器的想法了,在vs2003上就试图做过,苦于经常会有这种情况出现:当自治的浏览器遇到弹出窗口时无法捕获新的弹出窗口,于是乎新的弹出窗口仍旧用ie(或其他系统默认浏览器)打开,在研究vs2005WebBrowser控件时发现有NewWindow事件,于是乎兴奋不已,决定用这个分页浏览器体验一下vs2005.
不过就在写这篇blog时突然想到在vs2003的那个axWebBrowse组件是否有这个事件呢?原来也有!只是封装的没有vs2005的好,也不知道怎么会有两个此类的事件。所以在2003下应该也可以实现分页(后续的文章会有介绍)。


2
实现功能
预览图如下:


2.1
当前浏览器的"另存为""打印""打印御览""页面设置",刷新,前进,后退等等。几乎都是控件封装好了的,没有几句代码。
2.2 浏览器的分页功能。当浏览器有NewWindow激发时产生新的一页。主要依靠NewWindow事件。
2.3
当前页面的状态。例如标题,状态栏等。
3
实现过程以及关键点
新建一个vs2005windows applaction项目
3.1
界面

一个MenuStrip实现最上面的菜单。
两个ToolStrip分别是工具栏和地址栏。
一个TabControl也就是浏览器的主体了,它的每个TabPage就是每一个分页了。
一个StatusStrip也就是状态栏了。
另外为了使窗体大小变化时控件也随着变化注意使用控件的dock属性。
搭成如下界面:


顺便说一句和vs2003不同的是vs2005把例如
this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
this.saveasToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
this.printToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.printPreToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
这些通过我们拖拽控件,系统生成的界面代码分离出来统一放在叫*.Designer.cs文件里了,详见事例代码中的Form1.Designer.cs文件。

3.2 具体code
<chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899"><strong><span>3.2.1</span></strong></chsdate>
辅助方法

#region //辅助方法
/// <summary>
///
当在浏览器地址栏敲"回车"时当前浏览器重定向到指定urltscbUrl.Tex
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tscbUrl_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
newCurrentPageUrl(tscbUrl.Text);
}
}
/// <summary>
///
新建空白页
/// </summary>
private void newPage()
{
tscbUrl.Text = "about:blank";
TabPage mypage = new TabPage();
WebBrowser tempBrowser = new WebBrowser();
tempBrowser.Navigated += new WebBrowserNavigatedEventHandler(tempBrowser_Navigated);
tempBrowser.NewWindow += new CancelEventHandler(tempBrowser_NewWindow);

tempBrowser.ProgressChanged += new WebBrowserProgressChangedEventHandler(tempBrowser_ProgressChanged);
tempBrowser.StatusTextChanged += new EventHandler(tempBrowser_StatusTextChanged);
tempBrowser.Dock = DockStyle.Fill;
mypage.Controls.Add(tempBrowser);

tabControl1.TabPages.Add(mypage);
tabControl1.SelectedTab = mypage;
}
/// <summary>
///
临时浏览器进度变化事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void tempBrowser_ProgressChanged(object sender, WebBrowserProgressChangedEventArgs e)
{
toolStripProgressBar1.Maximum = (int)e.MaximumProgress;
toolStripProgressBar1.Value = (int)e.CurrentProgress;
}
/// <summary>
///
新建一页并定向到指定url
/// </summary>
/// <param name="address">
新一页的浏览器重新定向到的url</param>
private void newPage(string address)
{
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.Url = getUrl(address);
tempBrowser.Dock = DockStyle.Fill;
mypage.Controls.Add(tempBrowser);
tabControl1.TabPages.Add(mypage);
}
/// <summary>
///
获取当前浏览器
/// </summary>
/// <returns>
当前浏览器</returns>
private WebBrowser getCurrentBrowser()
{
WebBrowser currentBrowser = (WebBrowser)tabControl1.SelectedTab.Controls[0];
return currentBrowser;
}
/// <summary>
///
处理字符串为合法url
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
private Uri getUrl(string address)
{
string tempaddress = address;
if ((!address.StartsWith("http://")) && (!address.StartsWith("https://")) && (!address.StartsWith("ftp://")))
{
tempaddress = "http://" + address;
}
Uri myurl;
try
{
myurl = new Uri(tempaddress);
}
catch
{
myurl = new Uri("about:blank");
}
return myurl;
}
/// <summary>
///
截取字符串为指定长度
/// </summary>
/// <param name="oldstring"></param>
/// <returns></returns>
private string newstring(string oldstring)
{
string temp;
if (oldstring.Length < TITLE_COUNT)
{
temp = oldstring;
}
else
{
temp = oldstring.Substring(0, TITLE_COUNT);
}
return temp;
}
/// <summary>
///
设置"前进","后退"button的可用状态
/// </summary>
private void setStatusButton()
{
backButton.Enabled = getCurrentBrowser().CanGoBack;
forwordButton.Enabled = getCurrentBrowser().CanGoForward;
}
#endregion


说明:其中getCurrentBrowser()是获取当前页面的浏览器,这里把它叫当前浏览器,即getCurrentBrowser()为获取当前浏览器。
<chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899"><strong><span>3.2.22</span></strong></chsdate>
菜单栏
#region//
菜单栏
/// <summary>
///
另存为
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void saveasToolStripMenuItem_Click(object sender, EventArgs e)
{
getCurrentBrowser().ShowSaveAsDialog();
}
/// <summary>
///
打印
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void printToolStripMenuItem_Click(object sender, EventArgs e)
{
getCurrentBrowser().ShowPrintDialog();
}
/// <summary>
///
打印御览
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void printPreToolStripMenuItem_Click(object sender, EventArgs e)
{
getCurrentBrowser().ShowPrintPreviewDialog();
}
/// <summary>
///
关闭浏览器
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
Application.Exit();
}
/// <summary>
///
页面设置
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void pageSetupToolStripMenuItem_Click(object sender, EventArgs e)
{
getCurrentBrowser().ShowPageSetupDialog();
}
/// <summary>
///
属性设置
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void propeToolStripMenuItem_Click(object sender, EventArgs e)
{
getCurrentBrowser().ShowPropertiesDialog();
}
#region//
关于
private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
{
AboutBox1 myabout = new AboutBox1();
myabout.Show();
}

private void tipToolStripMenuItem_Click(object sender, EventArgs e)
{
MessageBox.Show("
小提示:双击分页标题即可关闭当前页面。");
}
#endregion
#endregion
说明:其中文件菜单的功能大都是WebBrowser控件封装好的仅仅是用上文提到的getCurrentBrowser()获取一下当前浏览器罢了。
<chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899"><strong><span>3.2.3</span></strong></chsdate>
工具栏
#region//
工具栏
/// <summary>
///
后退
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void backButton_Click(object sender, EventArgs e)
{
getCurrentBrowser().GoBack();
setStatusButton();
}
/// <summary>
///
前进
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void forwordButton_Click(object sender, EventArgs e)
{
getCurrentBrowser().GoForward();
setStatusButton();
}
/// <summary>
///
停止
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void stopButton_Click(object sender, EventArgs e)
{
getCurrentBrowser().Stop();
}
/// <summary>
///
刷新
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void refreshButton_Click(object sender, EventArgs e)
{
getCurrentBrowser().Refresh();
}
/// <summary>
///
定向到主页
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void homeButton_Click(object sender, EventArgs e)
{
getCurrentBrowser().GoHome();
}
/// <summary>
///
搜索
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void searchButton_Click(object sender, EventArgs e)
{
getCurrentBrowser().GoSearch();
}
/// <summary>
///
打印
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void printButton_Click(object sender, EventArgs e)
{
getCurrentBrowser().Print();
}
/// <summary>
///
新建空白页
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void newButton_Click(object sender, EventArgs e)
{
newPage();
}
/// <summary>
///
使当前的浏览器定位到给定url
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void gotoButton_Click(object sender, EventArgs e)
{
newCurrentPageUrl(tscbUrl.Text);
}
#endregion
说明:和菜单栏实现的功能类似,也是一些简单的调用,仅仅是表现形式不同。
3.2.4
初始化
#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
说明:分页浏览器初始化时要定向到主页,虽然我们的浏览器暂时没有提供设置主页的功能。
3.2.5
临时浏览器事件
#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){..}
事件是比较重要的,我认为它是整个程序的核心部分。
3.2.6tabControl1
事件
#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思路解决此问题。
4
总结
分页浏览器所谓"分页",从实现上讲就是"控件的动态添加",当前浏览器产生新窗体时,先new出一个TabPage,再new一个WebBrowser,把这个WebBrowser加载了一些事件以后添加到先前的这个TabPage上,然后把这个TabPage添加到"主窗体"tabControl1中。
5
不足之处
最大的不足:
((WebBrowser)sender).StatusText无法捕获的url(例如StatusText "javascript:void(0)")目前无法解决这也是某些莫名其妙的问题的出处。
另外某些脚本不支持。

分享到:
评论

相关推荐

    艺帆全屏公司网站源码CMS企业版 v1.7.5.zip

    简单易用,高扩展性是艺帆CMS的特征,艺帆的主旨是打造最适合大众的免费cms,企业cms,免费网站模板,免费的网站制作软件 其他说明:首页幻灯才用JS而非Flash ,搜索引擎蜘蛛更能识别并爬到相关链接,默认模板全站DIV...

    艺帆全屏公司网站源码CMS企业版1.7.5V

    简单易用,高扩展性是艺帆CMS的特征,艺帆的主旨是打造最适合大众的免费cms,企业cms,免费网站模板,免费的网站制作软件 其他说明:首页幻灯才用JS而非Flash ,搜索引擎蜘蛛更能识别并爬到相关链接,默认模板全站DIV加...

    艺帆CMS紫泽科技企业版 v1.7.zip

    简单易用,高扩展性是艺帆CMS的特征,艺帆的主旨是打造最适合大众的免费cms,企业cms,免费网站模板,免费的网站制作软件 功能:单页设置 单页分类设置 新闻 产品 下载 在线招聘 在线留言 会员系统 在线下单 幻灯管理 ...

    艺帆物业保洁公司网站模板CMS企业版 v1.7.rar

    简单易用,高扩展性是艺帆CMS的特征,艺帆的主旨是打造最适合大众的免费cms,企业cms,免费网站模板,免费的网站制作软件 其他说明:首页幻灯才用JS而非Flash ,搜索引擎蜘蛛更能识别并爬到相关链接,默认模板全站DIV...

    艺帆CMSPOS机网站模板企业版 v1.7.rar

    简单易用,高扩展性是艺帆CMS的特征,艺帆的主旨是打造最适合大众的免费cms,企业cms,免费网站模板,免费的网站制作软件   其他说明:首页幻灯才用JS而非Flash ,搜索引擎蜘蛛更能识别并爬到相关链接,默认模板全站...

    《程序天下:JavaScript实例自学手册》光盘源码

    15.30 使用VML打造可改变大小的圆框 15.31 JavaScript实现文档结构图 15.32 判断一副图片是否加载完毕 第16章 页面数据的验证 16.1 验证字符串是否全由数字组成 16.2 验证表单项必须填写 16.3 判断用户输入是否为...

    艺帆艺帆物业保洁公司网站模板CMS企业版1.7V

    简单易用,高扩展性是艺帆CMS的特征,艺帆的主旨是打造最适合大众的免费cms,企业cms,免费网站模板,免费的网站制作软件 其他说明:首页幻灯才用JS而非Flash ,搜索引擎蜘蛛更能识别并爬到相关链接,默认模板全站DIV加...

    程序天下:JavaScript实例自学手册

    15.30 使用VML打造可改变大小的圆框 15.31 JavaScript实现文档结构图 15.32 判断一副图片是否加载完毕 第16章 页面数据的验证 16.1 验证字符串是否全由数字组成 16.2 验证表单项必须填写 16.3 判断用户输入是否为...

    艺帆蓝色宽屏公司网站源码 v1.7.5.rar

    简单易用,高扩展性是艺帆CMS的特征,艺帆的主旨是打造最适合大众的免费cms,企业cms,免费网站模板,免费的网站制作软件   其他说明:首页幻灯才用JS而非Flash ,搜索引擎蜘蛛更能识别并爬到相关链接,默认模板全站...

    GoodProject Maven Webapp.zip

    系统主要运用在:在系统中一些分页或者样式交互事件处理中使用到了(比如地址选择框) 前端用到了ajax AJAX即"Asynchronous Javascript And XML"(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术。...

    动易PowerEasy® SiteWeaver™ CMS v6.8正式版build2009.rar

    动易® SiteWeaver™ CMS 是开源和免费的,用户可免费下载、免费使用、免费升级,无使用时间与功能限制。 “PowerEasy® SiteWeaver™ ”寓意为“网站编织者”,象征着产品的易用性、灵活性等特性,此产品线为面向...

    动易PowerEasy® SiteWeaver™eShopv6.8正式版build2009.rar

    动易® SiteWeaver™ CMS 是开源和免费的,用户可免费下载、免费使用、免费升级,无使用时间与功能限制。 “PowerEasy® SiteWeaver™ ”寓意为“网站编织者”,象征着产品的易用性、灵活性等特性,此产品线为面向...

    DoubleY自动生成HTML全站静态程序 3.0.rar

    专为“中小企业”、“设计师”、“个人博客”、“SEO推广”打造的轻量级傻瓜型静态操作体验系统。 DoubleY自动生成HTML全站静态程序 3.0 更新信息:2011-03-25 1.全站采用同步数据自动生成技术,支持手动快速生成...

    易酷CMS v2.5.zip

    2:安装使用简单(一健安装/一键采集/一键备份/一键切换动静态模式/操作简便/灵活实用) 3:网站运营全面(支持免费点播/收费点播/QQ用户可直接登录/集成支付宝接口) 4:影片资源丰富(多播放器/多浏览器支持/百万集片库/...

    艺帆CMS企业版官方版源码 v1.7.5

    简单易用,高扩展性是艺帆CMS的特征,艺帆的主旨是打造最适合大众的免费cms,企业cms,免费网站模板,免费的网站制作软件,喜欢asp网站开发的朋友可以下载参考一下。 功能:单页设置 单页分类设置 新闻 产品 下载 在线...

    C#编程经验技巧宝典

    8 &lt;br&gt;0018 有效利用Visual Studio 2005附带程序 8 &lt;br&gt;0019 有效使用MSDN帮助 9 &lt;br&gt;0020 如何设置MSDN帮助 9 &lt;br&gt;1.4 其他 10 &lt;br&gt;0021 如何添加项目引用 10 &lt;br&gt;0022 如何添加Web...

    时代网站信息管理系统SDCMS v2.3 正式版

    SDCMS2.0是由SDCMS开发团队历时一年打造的基于Asp+Access/MsSql的网站信息管理系统。从前后台UI到每一行代码都是全新的体验。 SDCMS2.0系统内置新闻、视频、组图、下载四大内容模型,在很大程度上满足了更多层次用户...

    网页与Web程序设计 课件 ppt 机械工业出版社 part1

    6.4.2 打造多彩文字链接 116 6.4.3 用CSS控制网页整体风格 117 本章小结 118 思考题 118 第7章 JavaScript 119 7.1 JavaScript概述 119 7.1.1 引例 119 7.1.2 JavaScript的特点 120 7.1.3 JavaScript与Java的...

Global site tag (gtag.js) - Google Analytics