知识大全 使用VS2005打造简单分页浏览器
Posted 事件
篇首语:知识就是力量,时间就是生命。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 使用VS2005打造简单分页浏览器相关的知识,希望对你有一定的参考价值。
使用VS2005打造简单分页浏览器 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
引言
很早就有搞一个浏览器的想法了 在vs 上就试图做过 苦于经常会有这种情况出现 当自治的浏览器遇到弹出窗口时无法捕获新的弹出窗口 于是乎新的弹出窗口仍旧用ie(或其他系统默认浏览器)打开 在研究vs 的WebBrowser控件时发现有NewWindow事件 于是乎兴奋不已 决定用这个分页浏览器体验一下vs
实现功能
预览图如下
当前浏览器的 另存为 打印 打印御览 页面设置 刷新 前进 后退等等 几乎都是控件封装好了的 没有几句代码
浏览器的分页功能 当浏览器有NewWindow激发时产生新的一页 主要依靠NewWindow事件
当前页面的状态 例如标题 状态栏等
实现过程以及关键点
新建一个vs 的windows applaction项目
界面
一个MenuStrip实现最上面的菜单
两个ToolStrip分别是工具栏和地址栏
一个TabControl也就是浏览器的主体了 它的每个TabPage就是每一个分页了
一个StatusStrip也就是状态栏了
另外为了使窗体大小变化时控件也随着变化注意使用控件的dock属性
搭成如下界面
顺便说一句和vs 不同的是vs 把例如
this toolStripMenuItem = new System Windows Forms ToolStripMenuItem();this saveasToolStripMenuItem = new System Windows Forms ToolStripMenuItem();this toolStripSeparator = new System Windows Forms ToolStripSeparator();this printToolStripMenuItem = new System Windows Forms ToolStripMenuItem();this printPreToolStripMenuItem = new System Windows Forms ToolStripMenuItem();this toolStripSeparator = new System Windows Forms ToolStripSeparator();this exitToolStripMenuItem = new System Windows Forms ToolStripMenuItem();
这些通过我们拖拽控件 系统生成的界面代码分离出来统一放在叫* Designer cs文件里了 详见事例代码中的Form Designer cs文件
辅助方法
#region //辅助方法/// <summary>/// 当在浏览器地址栏敲 回车 时当前浏览器重定向到指定url(tscbUrl 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);
tabControl TabPages Add(mypage); tabControl SelectedTab = mypage;/// <summary>/// 临时浏览器进度变化事件/// </summary>/// <param name= sender ></param>/// <param name= e ></param>void tempBrowser_ProgressChanged(object sender WebBrowserProgressChangedEventArgs e) toolStripProgressBar Maximum = (int)e MaximumProgress; toolStripProgressBar 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); tabControl TabPages Add(mypage);/// <summary>/// 获取当前浏览器/// </summary>/// <returns>当前浏览器</returns>private WebBrowser getCurrentBrowser() WebBrowser currentBrowser = (WebBrowser)tabControl SelectedTab Controls[ ]; return currentBrowser; /// <summary>/// 处理字符串为合法url/// </summary>/// <param name= address ></param>/// <returns></returns>private Uri getUrl(string address) string tempaddress = address; if ((!address StartsWith( // )) && (!address StartsWith( // )) && (!address StartsWith( ftp:// ))) tempaddress = // + 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( TITLE_COUNT); return temp;/// <summary>/// 设置"前进" "后退"button的可用状态/// </summary>private void setStatusButton() backButton Enabled = getCurrentBrowser() CanGoBack; forwordButton Enabled = getCurrentBrowser() CanGoForward;#endregion
说明 其中getCurrentBrowser()是获取当前页面的浏览器 这里把它叫当前浏览器 即getCurrentBrowser()为获取当前浏览器 菜单栏
#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) AboutBox myabout = new AboutBox (); myabout Show();
private void tipToolStripMenuItem_Click(object sender EventArgs e) MessageBox Show( 小提示 双击分页标题即可关闭当前页面 );#endregion#endregion
说明 其中文件菜单的功能大都是WebBrowser控件封装好的仅仅是用上文提到的getCurrentBrowser()获取一下当前浏览器罢了
工具栏
#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
说明 和菜单栏实现的功能类似 也是一些简单的调用 仅仅是表现形式不同 初始化
#region//初始化/// <summary>/// 初始化/// </summary>/// <param name= sender ></param>/// <param name= e ></param>private void Form _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); tabControl 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 toolStripStatusLabel 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 tabControl 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) 事件是比较重要的 我认为它是整个程序的核心部分
tabControl 事件
#region//tabControl 事件/// <summary>/// 切换tab/// </summary>/// <param name= sender ></param>/// <param name= e ></param>private void tabControl _SelectedIndexChanged(object sender EventArgs e) WebBrowser mybor = (WebBrowser)tabControl SelectedTab Controls[ ]; if (mybor Url != null) //地址输入框 tscbUrl Text = mybor Url ToString(); tabControl SelectedTab Text = newstring(mybor DocumentTitle); else tscbUrl Text = about:blank ; tabControl SelectedTab Text = 空白页 ; setStatusButton();/// <summary>/// 关闭当前tab/// </summary>/// <param name= sender ></param>/// <param name= e ></param>private void tabControl _DoubleClick(object sender EventArgs e) //仅仅剩下一个tab时返回 if (tabControl TabPages Count <= ) tabControl SelectedTab Text = 空白页 ; getCurrentBrowser() Navigate( about:blank ); else //先将tabControl 隐藏然后remove掉目标tab(如果不隐藏则出现闪烁 即系统自动调转到tabControl 的第一个tab然后跳会 )最后显示tabControl
tabControl Visible = false; WebBrowser mybor = getCurrentBrowser(); //释放资源 mybor Dispose(); mybor Controls Clear(); this tabControl TabPages Remove(this tabControl SelectedTab); //重新设置当前tab tabControl SelectedTab = tabControl TabPages[tabControl TabPages Count ]; tabControl Visible = true; #endregion
说明:当双击当前Tabpage从而关闭当前页面时 tabControl 会首先定位到第一个tab然后再定位到指定的Tabpage上 我采取隐藏tabControl 处理 显示tabControl 思路解决此问题
总结
分页浏览器所谓 分页 从实现上讲就是 控件的动态添加 当前浏览器产生新窗体时 先new出一个TabPage 再new一个WebBrowser 把这个WebBrowser加载了一些事件以后添加到先前的这个TabPage上 然后把这个TabPage添加到 主窗体 tabControl 中
不足之处
最大的不足
cha138/Article/program/net/201311/15669相关参考
VS2005系列控件演示之表格 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  
用VS2005开发XAML程序 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!如果我们使用Visua
VisualC#打造“浏览器” 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! VisualC#是
知识大全 “不完美”的VS 2005 Team System
“不完美”的VS2005TeamSystem 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Vi
关注:VS.NET2005Beta2初体验 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在经历
VS2005数据存取层深入剖析基础篇 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!摘要本文试图对V
VS2005数据存取层深入剖析高级篇 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!一扩展表格适配器
VS.NET2005Beta2初体验 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在经历了N次
知识大全 VS2005+Crystal Report开发Web应用
VS2005+CrystalReport开发Web应用 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧
VS2005中C#用代码打开软键盘 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &nb