下载 webbrowserexpress.msi 示例文件简介
web 浏览器的一个功能是在同一浏览器窗口内打开不同选项卡或子页,这个功能正在变得更加普及。当浏览多个站点时,使用选项卡来分开多个页会保持桌面的整齐。有若干种第三方 web 浏览器在 windows 和其他平台上提供这一功能,如果您跟我一样,您将发现这是一种让人上瘾的浏览方法。很多浏览器,无论是默认设置还是通过插件,也提供一种快速方法,无须直接使用搜索引擎就可以执行 web 搜索。能够编写自己的浏览器,并使其能够完成所有这些工作,还能把它微调并调整到完全适合您的需要,那不是很棒吗?
图 1:用 visual c# express 设计并实现自己的 web 浏览器
将这些对功能的渴望变为一种全新的产品看起来好像需要大量的工作。毕竟,开发 internet explorer 用了多少时间?(答:很长时间。)我如何能够只用一晚上的时间,单枪匹马,就能复制出 internet explorer 的强大 html 呈现功能并添加我自己的新功能列表?那是因为我使用 visual c# express。
利用他人成果的好处
在一个晚上编写 web 浏览器的秘密在于使用其他人的成果。在本例中,秘密是使用了 c# express webbrowser 控件。如果您安装了 c# express 并且打开了帮助,您可能已经看到了一个叫做¡°如何:用 c# express创建 windows 应用程序¡±的主题。这一简短的项目将指导您完成创建 windows 窗体应用程序所涉及的各个步骤。如果您还没有看完,而且您对 c# 不熟悉,我建议您阅读它。
关键之处是,通过使用与 c# express 配套的控件,创建多个应用程序(包括完整的 web 浏览器)都是很容易的。一旦 webbrowser 控件确实已在 windows 窗体上了,您只需告诉它哪些 url 是要获取并显示的,以及是否需要返回、向前、刷新或停止。连接到 internet、获取数据、格式化 html、显示图形等所有困难的工作都由该控件处理。
这个项目与帮助项目相近,除了一点,该项目创建多个 webbrowser 控件并将其添加到 tabcontrol 中的网页上,而不是只添加一个 webbrowser 控件到 windows 窗体上。是的,我甚至无须编写代码来创建 tabcontrol。这是从工具箱到 windows 窗体拖放的另一个示例。
那么,虽然我知道这看似一个巨大而复杂的应用程序,仿佛需要数月的工作来完成,但事实上我只是连结了现有控件间的点,就在一个晚上完成了所有工作。这就是我的编程方式!
设计 web 浏览器
图 2:从工具箱拖动控件是编写这一应用程序的关键
以下描述了我如何着手创建 web browser express 项目。在从 c# express 新项目对话框创建一个windows 应用程序之后,我将下列控件拖到 windows 窗体:
1.
tabcontrol:这个控件存储所有子页,每个子页能控制一个 webbrowser 控件。一旦它已经创建,向其添加其他页就会很容易。为了确定它填充了整个 windows 窗体,dock 属性被设定为 fill。这使得该控件保持与 windows 窗体同样大小,即便是调整大小之后。
2.
menustrip:尽管这个应用程序中没有菜单,还是存在 menustrip 来提供一个屏幕顶端的区域,按钮和文本框可以添加到这个区域。另外,如果您决定添加一些菜单选项,您可以在这里添加。我将 menustrip 拖出以使其变得稍大。
3.
buttons:需要有一些用于 web 浏览的简单控件。按钮被拖动到 menustrip 中,并调整大小,有一个图像应用于这些按钮。我惟一需要做的一件事就是重新绘制图像背景,使其为浅蓝色,以便看起来像 menustrip。
4.
textboxes 和 comboboxes :除了按钮,我还需要一个用于 url 和搜索字符串的文本框。实际上,url 是一个 comboboxes,允许用户输入一个 web 地址,并从一个下拉列表中选择项目。这个列表是在设计器中填充的,但如果您希望的话可以以编程方式添加新项。
5.
picturebox:最右边的 picturebox 控件是为了装饰用的。web 浏览器在下载内容时会显示一些动画。
6.
timer:timer 对象用于一秒钟数次发出一个消息。这个消息被一个叫做 timer1_tick() 的方法捕获,并用于更改在 picturebox 中显示的图像。结果是动画。这并不算是第一流的解决方案,但是它奏效。
工作原理
当该程序启动后,它所做的第一件事是调用 create_a_new_tab()。此方法创建一个新选项卡页,将其添加到 tabcontrol,然后在其上创建一个 webbrowser 控件。webbrowser url 被设定为“主页”,无论它在您的系统上可能是什么。下面是创建新选项卡的代码:
// create a new tab pagetabpage newpage = new tabpage("loading…");tabcontrol1.tabpages.add(newpage);
这是创建新 webbrowser 控件的代码:
// create a new webbrowser control.webbrowser webpage = new webbrowser(); webpage.parent = newpage;webpage.dock = dockstyle.fill;webpage.documentcompleted += new webbrowserdocumentcompletedeventhandler(webpage_documentcompleted);webpage.gohome();
此代码确定 webbrowser 的父级是 tab 页。它还用设置为 fill 的 dock 来确定它也保持在窗口的实际大小。我们还添加了一个事件处理程序:控件通过将消息发送到您的程序来工作。您可以选择您所聆听的消息,以及通过将事件处理程序链接到消息所调用的方法。在本例中,该消息告诉我们 webcontrol 已经完成了站点的加载和显示,当完成任务时,它将调用名为 webpage_documentcomplete() 的方法。这允许我们定义当网页加载完毕时执行的代码。例如,停止动画。
create_a_new_tab() 方法中的最后一行启用计时器:
timer1.enabled = true;
计时器轻松地将小段消息发送到 timer1_tick(),它改变在 picturebox 控件中显示的图像,如下所示:
private void timer1_tick(object sender, eventargs e) { // this method is called by the timer, and we use it to update the // image displayed by the picturebox control to create a simple // animation. image_animation++; if (image_animation > 10) image_animation = 0; switch (image_animation) { case 0: picturebox_busy.image = wbe.properties.resources.anim0; break; case 1: picturebox_busy.image = wbe.properties.resources.anim1; break; case 2: picturebox_busy.image = wbe.properties.resources.anim2; break;… case 7: picturebox_busy.image = wbe.properties.resources.anim7; break; case 8: picturebox_busy.image = wbe.properties.resources.anim8; break; case 9: picturebox_busy.image = wbe.properties.resources.anim9; break; } }
您可以看到,计时器每次激发时,在 picturebox 中就会显示一个不同的图像。使用您将一个图像分配到按钮或 picturebox 控件时显示的对话框,从磁盘加载图像。
程序的其余部分由事件驱动 — 当用户单击按钮或者输入一个 web 地址或搜索字符串时调用特定方法。
例如,web 导航按钮都调用当前 webbrowser 控件。例如,如果您单击 back 按钮,会调用以下方法:
private void button_back_click(object sender, eventargs e) { // go back – if the web control can go back, do it. webbrowser thiswebpage = getcurrentwebbrowser(); if (thiswebpage.cangoback) thiswebpage.goback(); }
当在 address 组合框中输入一个 url 时,我们使用 web 控件的 navigate 方法来获取并显示该页。下面的代码使用了当前显示在组合框中的文本并将其传递到 navigate 方法:
webbrowser thiswebpage = getcurrentwebbrowser(); thiswebpage.navigate(comboboxurl.text);timer1.enabled = true;
有意思的几点
在编写这个项目时,我想到了几个小窍门。不过,可能它们实际上并不能说是窍门,而是一些技术,当您编写自己的代码时可能发现它们是有用的。
使文本和组合框响应 return 键。
address comboboxes 和 search textbox 允许用户输入文本,然后在单击 go 按钮时使用这个文本。使用 text 属性从控件提取文本是很容易的。不过,如果按键盘上的“return”键就可以执行与单击一个按钮同样的操作,这样也很好。我通过从两个文本框检查 keyup 消息来使其奏效。当 keyup 消息到达时,我检查它是否是 return 键。如果它是,就触发了与单击按钮相同的操作。
combobox 而非textbox
web browser express 的第一个版本将一个 textbox用于地址 url 和 search 框。这很奏效,但是在实践中每次都要手工输入 url 十分麻烦。我删除了 combobox 并添加了一个 textbox,用一些 url 填充这一组合框来使用户开始。您可以从 combobox 属性资源管理器添加您自己的 url。
集成搜索
所有流行的 web 浏览器都有一个可以输入搜索词汇的文本框,结果会返回到 web 页中,而不需要首先浏览到搜索引擎。由于 msn 搜索目前有了更新,这看起来是将此功能内置到我自己的 web 浏览器中的最佳理由。
这非常简单。只需查看 internet explorer 中 msn 搜索上的历史记录,看一下搜索字符串需要使用的格式。然后 search 方法将搜索文本追加到 url 并定位到该链接,结果作为一个标准 web 页返回。
动画
从图形化 web 浏览器的早期以来,从 web 请求内容就是有迹可寻的,这样用户就不会以为它们的计算机出了问题,或者以为所有东西都被锁定了。总的来说,让用户知道有些事在发生并且他们需要有耐心总是个好主意。
这是要实现的项目中我最喜欢的部分之一,如果您在艺术上有几分天赋,那么在创建能够想象到的最酷的徽标时,您可以得到不少乐趣。在本例中,我在一个动画程序中创建了一系列大约 12 个帧,并将其作为 bmp 图像导出,加载到 c# express 中。
图 3:添加图形十分简单。为一个按钮或 picturebox 选择图像属性,您可以直接从磁盘导入图像。在开始前确定图像的大小正确。
扩展建议
如果您已经尝试过了 web browser express,并且希望添加自己的功能,那么我这篇文章就做得不错。为了让您保持忙碌,下面还有几个主意,让您可以相对较快地取得进步。
•
历史记录:保留所有曾访问过的 web 站点的记录,这样再访问它们时会比较容易。
•
自动完成:检查 return 键的方法也能够检查以前输入过的 url,并自动将其完成。与 internet explorer 相比,您可以更改这一自动完成的方式,比如可以只有在按 tab 键时才自动完成。
•
收藏:combobox 由 6 个 web 站点填充,您可以从 properties 资源管理器很容易地更改这些站点。然而,将一个新按钮添加到 menustrip 取得当前正在显示的 web 站点并将其添加到 combobox 列表怎么样呢?用这种方法用户可以构建起其收藏站点的列表。当程序退出并重新启动时,您需要一些方法来保存并重新加载这个列表。
•
集成的 rss 阅读器:保持比竞争对手领先一步,尽量将 rss 阅读器内置到您的 web 浏览器中。
小结
用 c# express 创建应用程序的秘密在于:知道哪些控件是可用的,以及用这些控件可以做什么。在本例中,只用了几个控件就构造了一个全功能的 web 浏览器。祝您自己编程时好运。
john kennedy 是 c# 用户教育团队的程序员/作者。您可以通过阅读他的网络日记,在联机帮助编写中了解他的成就,网络日记网址为:http://blogs.msdn.com/johnkenn