资源描述
基于VC++的网页浏览器设计
专业综合设计报告
题目 基于VC++的网页浏览器
专 业 名 称 网络工程
班 级 学 号 108207119
学 生 姓 名 沈恺
指 导 教 师 骆兴国
目 录
第1章 前 言 1
1.1 研究背景 1
1.2 国内外研究现状 1
1.3 选题的目的及意义 1
1.4 主要研究内容 2
第2章 互补结构网络技术 3
2.1 互联网中的无尺度现象 3
2.2 双结构互联网 3
2.3 播存结构 4
2.4 UCL统一内容定位 5
2.5 互补结构在本设计中的应用 5
第3章 系统方案设计 6
3.1 浏览器工作原理 6
3.2 基本原理和工作流程 6
3.3 主要功能的实现方法 7
3.3.1 IE功能的实现 7
第4章 互补结构浏览器实现 11
4.1 系统的整体结构 11
4.2 浏览器功能实现过程 12
4.2.1 创建程序主框架 12
4.2.2 显示浏览器功能 14
第5章 程序调试与结果分析 21
结 论 22
参考文献 23
基于VC++的个性浏览器设计
第1章 前 言
1.1 研究背景
作为现代科技革命的杰出代表,网络改变着人的生活,它向人们展示了全球联网的广阔前景,将每个人互相联接起来,将所有计算机设备联结起来,提供了对任何一种可能想象得到的信息的前所未有的、无可比拟的访问能力。自美国政府1993年9月正式启动国家信息基础设施即信息高速公路(网络的比喻式描述)以来,世界各国政府都相继提出了自己的信息高速公路计划,试图在电子信息网络技术这一前景壮观的领域取得优势。有人因而预言:21世纪将是由网络支持的时代。随着人们对互联网使用的日益频繁,网络浏览器数量不断增加,用户上传和共享的信息资源也在逐渐增多。现在,互联网已经成为人们学习、工作和生活所必不可少的信息资源宝库。
1.2 国内外研究现状
目前,绝大多数人使用的浏览工具却是界面单调、功能整齐划一的商用产品,而且大多数网民相对集中的访问少数的热门网站,因此,李幼平院士提出了双结构互联网思想,互联网在保留TCP/IP主体结构的基础上,增添一种“卫星广播和分布存储”的“播存结构”作为次级结构。通过次级结构广泛复制数千个站点的内容,.让主流信息资源以广播的形式直达全国城乡,克服“数字鸿沟”,在某种程度上实现信息的主动服务和个性化服务。在互补结构网络下,浏览器既要支持互联网浏览,又要支持本地数据库浏览。而目前的浏览器都只支持互联网的浏览,而不支持本地数据库网页的浏览。
1.3 选题的目的及意义
互联网使用的日益频繁,使用相对集中的访问少数的热门网站,出现“数字鸿沟”现象。为了缓解和克服现行网络中的这一不足,避免给人们上网带来不便,可以在现有的浏览器的基础上增添本地数据库网页浏览的功能。
本程序是一个简单易用、方便快捷的多页面网页浏览器。您可以通过它快速地链接到全球任何一个可浏览网站,浏览丰富的Web资源。论文先介绍了本设计的理论基础—互补结构网络技术,包括互联网中的无尺度现象,双结构互联网和播存结构的概念以及双结构在本设计中的应用。其次,要访问网页还得输入它的URL(Uniform Resource Locator),即统一资源定位符。对于HTTP协议,URL的一般形式是:http://<主机>:<端口>/<路径>。默认端口80通常省略,URL是统一资源定位。本设计中还用到一种统一内容定位,即UCL。我们用网页分类法去定位一个网页就属于UCL。当我们了解以上内容后,文章就开始介绍围绕程序进行的一系列分析和设计。介绍程序有哪些功能,是如何实现的。使用本软件的时候,用户只需要在地址栏输入网址(URL),敲击回车就可以连接精彩的网络世界了。
用户在浏览网页的时候不仅会更加方便快捷,而且可以根据自己的需求和喜好对浏览器进行设置,使之成为真正适合自己的个性浏览器。本设计主要目标是:软件实现一个多文档浏览器的基本功能。本文中的代码在Windows、Visual C++6.0环境下编译通过,程序运行正常。
1.4 主要研究内容
设计编写一套软件系统,在MFC环境下编写和调试程序,使用CHtmlView函数,实现IE浏览器的基本功能,如前进,后退,刷新,主页等;保存一些网页及其相关信息,在浏览器中浏览本地数据库中的网页。实现IE浏览器的基本功能;用Visual C++操作数据库,获取本地网页地址,浏览数据库中的网页浏览器采用多文档的形式。具有收藏夹的功能。本地网页既可以在地址栏输入网址浏览,又可以通过目录树进行遍历。
该系统对硬件要求较少,只需要一台安装了TCP/IP协议、能够较快运行VC++6.0并能链接到互联网的PC机即可。
本设计将对如何用Visual C++6.0来实现浏览器的基本功能及本地数据库的浏览进行详细介绍。软件部分是系统的核心。分为创建浏览器界面、添加浏览功能、添加本地数据资源、本地数据库的遍历。
第2章 互补结构网络技术
2.1 互联网中的无尺度现象
进入21世纪以来,互联网正在朝着“普适化”(pervasive)方向发展。普适化既深刻影响着人类的文化活动,又使得人类的文化活动渗入互联网的发展过程中,使得互联网的发展脱离了纯粹的技术范畴。也就是说,人类的文化活动随着其与互联网的深入结合又反过来深刻地影响着互联网的发展,包括互联网发展阶段的划分、互联网的主流技术,甚至是互联网的网络结构。
最近几年,美国科学家A.L.Barabasi等人用统计物理学的实验方法发现,文化活动悄悄改变着网络运作的数学模型,由原先正态分布的随机模型转变为幂次分布的无尺度(scale-free)模型。
理论家把庞大复杂的网络,分解为“节点”(node)和“连接”(link)两大要素; 提供内容的网站和接受内容的网民统称为“节点”,而内容在节点间的运动称为“连接”。一个网站的社会作用或文化地位,可以用该网站与外界的连接数来衡量。如果某个网站很长时间也没有人来连接,表明网站的社会影响不大,文化地位不高; 反过来,如果连接频繁,作用就大,地位就高。网络有随机网络和无尺度网络,许多网络包括因特网"人类社会和人体细胞代谢网络等,都是无尺度网络。研究无尺度网络,对于防备黑客攻击、防治流行病和开发新药等,都具有重要的意义。这就是网络“无尺度”含义。
无尺度现象告诉我们,要求所有的人享用所有信息,既不可能,也没有必要。关键问题是,如何“取精”?对绝大多数普通用户而言,什么是他们日常最适当的信息资源?借助幂次定律作为工具,把茫茫无边的信息资源一分为二,把满足广大人民日常需求的主流资源,甄别出来,整合起来。
2.2 双结构互联网
近年来的科学实验发现,万维网网页的连接数服从幂次律分布,互联网也因此成为无尺度(scale-free)网络。普通网民对互联网的访问具有明显的“群聚”特征,大多数网民的访问对象集中于为数不多的网站,因此,只需把数千个热门网站集合起来,就可以形成满足大多数人日常需求的主流资源。在此基础上,提出了双结构互联网思想,互联网在保留TCP/IP主体结构的基础上,增添一种“卫星广播和分布存储”的“播存结构”作为次级结构,通过次级结构广泛复制数千个网站的内容,让每一栋大楼和每一个自然村都拥有主流文化资源。采用4 over 6地址映射,通过IPv6的骨干网互联现有的IPv4站点,支持渐进部署和实施,实现了基于IPv6主干网与现有IPv4网络的互联和过渡。该过渡方案的完成,对完善新一代互联网体系结构,保护用户现有投资具有重要意义。在互联网中,核心路由器好比汽车引擎,直接影响着网络的总体性能。采用可扩展结构的核心路由器是互联网重要的发展方向。吴建平等人提出了基于蜂巢结构的可扩展路由器体系结构,具体包括可扩展路由器分布式软件系统结构、利用蜂巢结构实现的可扩展交换网络模型以及利用蛛网结构实现的多机架扩展模型。从控制平面上提出了负载均衡模型、重启动策略和内存管理方案,从路由平面上设计了分布式多节点BGP协议和OSPF协议模型。该可扩展路由器体系结构除了具有理论上无限的扩展能力外,还具有更好的容错能力和负载平衡能力。为新一代互联网核心设备的研制提供了参考模型。
双结构互联网如图2-1所示。互联网应该增添一种专门用于传播主流资源的次级结构,让主流资源通过卫星广播直达全国城乡,克服数字鸿沟。在主流结构大量分流后,主结构也变得“轻松”。
用户
分布存储
互联网播存网络次结构
透明计算
用户
平移几千个网站
互联网TCP/IP结构
Web网站
双结构中的主结构(primary)可依靠现有互联网技术,而次结构(secondary)则可依靠播存网技术。
卫星广播
双向电信
单向广播
图2-1 双结构互联网
2.3 播存结构
理想的共享希望做到任一资源都有机会为每个资源共享用户提供广泛服务,同时任一用户也有机会得到丰富的资源并行服务。也就是说,我们应该找到一种系统,它的资源品种的丰富程度和资源共享的广泛程度都不设上限,这样,信息共享将进入“各献所知,个形所需”的理想境界。用这个标准来审视互联网和广播网,它们都存在一定的差距。互联网的优势在于资源品种丰富,信息资源的个数不限上限,而短处在于资源共享的广泛程度,即用户数目受到带宽及服务质量的严格限制。广播网正好相反,只要支持信号强度足够,它支持用户数目的自由增长,支持共享服务,但广播不支持信息资源品种的自由增长。对比两网的优缺点,萌生了一种变革信息服务的新思维:先将广播网改造成播存网,再用能够包容海量资源的播存结构去帮助互联结构克服带宽障碍,争取同时获得资源品种的丰富程度和资源共享的广泛程度的双双突破。但是,如果不与存储技术相结合,单向工作的数字广播无法实现按需服务。只有依靠存储器长期积累广播网页,广播用户才能得到一个内容丰富的数据仓库。才有可能对资源进行零距离的双向互动,实现各取所需的理想。广播同存储相结合,实际上也是同计算机和万维网相结合。6历遗传与变异之后进化而成的一种新体系。所谓变异指把信息资源存储于本地,而广播网和互联网都是存货源于远处,需要时才临阵转来。
总之,用播存结构去遍布万维网站的热门网站,将构成一种全新信息网络,它像万维网那样内容丰富、自由选择;像广播网那样成本低廉、易于普及;像印刷书报那样存知识于民间,取用方便。
2.4 UCL统一内容定位
数据广播中内容定位(UCL)的目的是为互联网用户提供个性化的服务。为互联网上海量的信息加上统一的标签,按照信息本身体现内容进行分类,能够更好地被人使用,这也是内容定位的初衷。采用树形结构组织节目信息,并采用独立信道数据管道模式传送。内容定位与搜索引擎不同,搜索引擎本身是URL的补充,是对信息位置的描述。而UCL则是对内容本身的描述。UCL技术能够在信源制作阶段对资源内容按照预先设定的标准进行自动分类并贴上标签,用语言表达对内容的要求,建立以人为本的网络空间信息模型,通过筛选机制(用户访问某类信息的频度或用户的定制自动向用户提供相关的信息内容),从而改变用户查找网页或者文件的信息获取方式,实现个性化的服务,并极大地节省用户用于查找内容的时间。
2.5 互补结构在本设计中的应用
基于互补结构网络的优势和未来的发展前景,我们就希望用各种方式来实现这一结构,将它应用于日常生活中。
在本设计中,我们将双结构和浏览器相结合,用VC++编程实现一种具有互补结构的网络浏览器。所以,这种浏览器继承了普通IE浏览器和互补结构的优点,既能够支持互联网的浏览,又可以支持本地网的浏览。同双结构类似,这种网络浏览器以互联网浏览为主机构,以本地网浏览为此结构,本地网可以从广播网中通过过滤接收的播存结构获得。互补结构里面在空间上把很多网站搜罗在一起,时间上不管这个网站什么时候发布信号,存储器搜罗在一起。靠UCL把其它网站来的同样内容搜罗在一起,是一个三维的聚合。用这样一种办法来实现本地网页库的浏览,达到本设计的目标。
第3章 系统方案设计
3.1 浏览器工作原理
WWW的工作基于客户机/服务器计算模型,由Web浏览器(客户机)和Web服务器(服务器)构成,两者之间采用超文本传送协议(HTTP)进行通信,HTTP协议的作用原理包括四个步骤:连接,请求,应答。根据上述HTTP协议的作用原理,本文实现了GET请求的Web服务器程序的方法,通过创建 TcpListener类对象,监听端口8080;等待、接受客户机连接到端口8080;创建与socket字相关联的输入流和输出流;然后读取客户机的请求信息,若请求类型是GET,则从请求信息中获取所访问的HTML文件名,如果HTML文件存在,则打开HTML文件,把HTTP头信息和 HTML文件内容通过socket传回给Web浏览器,然后关闭文件。否则发送错误信息给Web浏览器。最后,关闭与相应Web浏览器连接的socket 字。
HTTP协议的作用原理:
WWW是以Internet作为传输媒介的一个应用系统,WWW网上最基本的传输单位是 Web网页。WWW的工作基于客户机/服务器计算模型,由Web 浏览器(客户机)和Web服务器(服务器)构成,两者之间采用超文本传送协议(HTTP)进行通信。HTTP协议是基于TCP/IP协议之上的协议,是Web浏览器和Web服务器之间的应用层协议,是通用的、无状态的、面向对象的协议。HTTP协议的作用原理包括四个步骤:连接:Web浏览器与Web服务器建立连接,打开一个称为socket(套接字)的虚拟文件,此文件的建立标志着连接建立成功。请求:Web浏览器通过socket向Web服务器提交请求。HTTP的请求一般是GET或POST命令(POST用于FORM参数的传递)。GET命令的格式为:GET 路径/文件名 HTTP/1.0 文件名指出所访问的文件,HTTP/1.0指出Web浏览器使用的HTTP版本。应答:Web浏览器提交请求后,通过HTTP协议传送给Web服务器。Web服务器接到后,进行事务处理,处理结果又通过HTTP传回给Web浏览器,从而在Web浏览器上显示出所请求的页面。
为了告知 Web浏览器传送内容的类型,Web服务器首先传送一些HTTP头信息,然后传送具体内容(即HTTP体信息),HTTP头信息和HTTP体信息之间用一个空行分开。常用的HTTP头信息有:
(1)HTTP 1.0 200 OK:这是Web服务器应答的第一行,列出服务器正在运行的HTTP版本号和应答代码。代码“200 OK”表示请求完成。
(2)MIME_Version 1.0:它指示MIME类型的版本。
(3)content_type:类型:这个头信息非常重要,它指示HTTP体信息的MIME类型。如:content_type:text/html。指示传送的数据是HTML文档。
(4)content_length长度值:它指示HTTP体信息的长度(字节)。关闭连接:当应答结束后,Web浏览器与Web服务器必须断开,以保证其它Web浏览器。能够与Web服务器建立连接。
本设计用的是把套节字封装进去的类实现的。
3.2基本原理和工作流程
用户浏览的资源有两种:互联网和本地网站库。本设计的系统的整体方案图如图3-1所示。黑色虚线以上表示播存结构,本地数据库中储存的网页应该来自广播网,这是实际应用的方案。但是考虑到时间和工作量的问题,在实际设计实现的时候是直接从互联网上将网页下载下来放到本地数据库中的。也就是图示下方的虚线箭头所示。根据互联网网页内容的不同类别,按照一定的分类方法创建了一个分类数据库,然后将下载到本地的网页进行分类,便于用户使用本地数据库对网页进行浏览。对网页的分类可以自动完成,也可以手动完成。自动分类效率高、速度快,但考虑到实现起来较有难度,而且需要分类的本地数据库信息量也不是很庞大,所以本设计中采用了手动完成。当然,用户也可以直接通过互联网浏览网页信息。
具有互补结构的网络浏览器主要实现Internet网页浏览和本地数据库网页浏览。整个设计大体上可以分为两个部分:IE浏览器功能的实现和本地数据库浏览的实现。IE浏览器功能的实现分为几个步骤:建立一个浏览器框架、添加地址栏、网页的显示 、主页的设置 、将链接改为用程序打开、保存最近浏览的网页地址 、显示多文档 、改变标题 、添加工具栏功能以及添加收藏功能等。
本地
网站库
UCL
分类库
分类匹配
互联网
用户
广播源
过滤接收
广播
图3-1 本设计的系统的整体方案图
3.3 主要功能的实现方法
3.3.1 IE功能的实现
浏览器的IE功能的编程实现主要基于CHtmlView类。一个浏览器通常包括几个部分:HTML解释器、HTML执行器和应用界面控制。如果从单纯的API和Socket开始实现一个浏览器,工作量将非常巨大而且会得不偿失,是不现实的。所以,本设计将利用已有的HTML解释器和HTML执行器,通过包装一层系统相关的API实现Windows下的浏览器。幸运的是,微软提供一个相关的接口,利用这个接口可以很快地开发出一个简易的浏览器。当然,这个浏览器采用的依然是IE内核。随着VC++ 6.0发布的MFC(微软基本类库)中有一个很有用的类CHtmlView,该类在MFC的Document/View环境在封装了WebBrowse控件的功能。利用该类提供的函数,用户可以方便地建立自己的浏览器。这样在自己的程序中就可以实现WWW站点,本地和网络资源。可以说一部分基本的IE(Internet Explorer)的功能,CHtmlView都有。因为WebBrowse控件实际上是基于WebBrowser2接口的。而WebBrowser2接口是由IE实现的一个COM接口。因此,CHtmlView实际上使用的是IE的引擎,故而具有IE的能力。在MFC的单文档界面(SDI)和多文档截面(MDI)下实现空白的IE浏览器的功能极其简单,只要在AppWizard中选择SDI或MDI类型,在第六步中把View的基类选为CHtmlView即可实现浏览器功能。CHtmlView类的Navigate2()成员函数专门用来现实超文本格式的文档。在MFC的“文档/视图/框架体系结构”中,CHtmlView实现了网络浏览器的相关功能。在Windows中,浏览Web站点只是IE的功能之一,它还可以浏览本地的和网络的文件系统。IE支持超级链接(Hyperlinking),统一资源定位(URL)和历史纪录维护。以上这些,CHtmlView都可以轻松实现。用户需要做的就是从CHtmlView中继承一个视图类作为“文档/视图/框架体系结构”的视图部分。
本设计采用了多页面多文档浏览,多数人进行网页的浏览时,喜欢同时打开很多个网页页面,如果使用单页面的浏览器,会给用户造成许多麻烦,比如每次打开网页都需要重新打开一个窗口,而窗口间的切换操作又不是很方便等等。而多页面浏览时,网页都有序的排列在主窗口内,可以方便的在不同的页面间切换,它允许在同一窗口内打开任意多个页面,减少了浏览器对系统资源的占用率。
在浏览网络搜集信息时,一般都是一些专门的网站,在以后再次搜集信息的时候,可能还要用到这些网站,为了快速的访问这些网站,就可以通过一些方法,让计算机记住这些网站。可以利用收藏夹或者历史记录快速访问,又或者运用搜索引擎在网络上搜索相关网站,找到的相关的信息。一般IE的用户都有个习惯,那就是将自己喜欢的网址保存起来,以方便今后快速的登陆。本设计中用保存最近浏览的网页地址和收藏夹来完成这项功能。
将地址栏对话框的类名设置为:CToolDlg,设置其基类为CDialog。对应代码如下:
CToolDlg::CToolDlg(CWnd* pParent /*=NULL*/)
: CDialog(CToolDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CToolDlg)
//}}AFX_DATA_INIT
// GetDlgItem(ID_COM)->SetWindowText("faasdsd");
}
void CToolDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CToolDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CToolDlg, CDialog)
//{{AFX_MSG_MAP(CToolDlg)
ON_BN_CLICKED(IDC_BUTTON, OnButton)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CToolDlg message handlers
//DEL void CToolDlg::OnBu1()
//DEL {
//DEL // TODO: Add your control notification handler code here
//DEL CString str; //定义字符串变量
//DEL GetDlgItem(IDC_COM1)->GetWindowText(str); //获得地址栏输入的字符串
void CToolDlg::OnButton()
{
// TODO: Add your control notification handler code here
CString str;
GetDlgItem(IDC_COM)->GetWindowText(str);
web.Navigate(str,NULL,NULL,NULL,NULL);
}
定义函数MainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct),用于创建CToolDlg类的对象dlg,并将此对象添加到工具栏中。具体代码如下:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndToolBar.CreateEx(this) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1; // 创建失败
}
if (!m_wndDlgBar.Create(this, IDR_MAINFRAME,
CBRS_ALIGN_TOP, AFX_IDW_DIALOGBAR))
{
TRACE0("Failed to create dialogbar\n");
return -1; //创建失败
}
if (!m_wndReBar.Create(this) ||
!m_wndReBar.AddBar(&m_wndToolBar) ||
!m_wndReBar.AddBar(&m_wndDlgBar))
{
TRACE0("Failed to create rebar\n");
return -1; //创建失败
}
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; //创建失败
}
// TODO: Remove this if you don't want tool tips
m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |
CBRS_TOOLTIPS | CBRS_FLYBY);
//if(dlg.m_hWnd!=NULL)
// RECT rect;
//m_wndStatusBar.GetWindowRect(&rect);
// dlg.Create(ID_DILOG,this);
// m_wndReBar.AddBar(&dlg);
//}
this->SetTitle("网页浏览器示例");
//m_wndToolBar.GetDlgItem(ID_COM)->SetWindowText("safsf");
//.SetButtonInfo(8,ID_LIULANJILU,TBBS_BUTTON,0);
//m_wndToolBar.SetButtonText(8,"要不得");
return 0;
}
第4章 互补结构浏览器实现
4.1 系统的整体结构
本设计的主要工作就是做了两个库(即本地网站库和分类库),然后用程序实现对互联网网页和本地数据库的浏览。互联网网页的浏览主要是以CHtmlView类作为基础,向程序框架中添加函数以实现类似于IE浏览器的功能。本地数据库的浏览主要是以CTreeCtrl类为基础,创建一个主题树来显示文件目录结构。用MFC ODBC访问数据库实现本地数据库的浏览,达到双结构浏览器设计的目的。
本设计的系统总设计流程如图4-1所示。
构建
框架
添加IE浏览器功能
创建
数据库
主题树浏览
数据库
添加
主题树
创建
浮动条
图4-1 总设计流程
打开浏览器
本设计浏览网页的过程如图4-2所示:首先,获取网址;其次,将网址赋给全局变量m_lURL;第三,发出一个新建文档的消息;第四,将新建的文档贴在标签栏上;第五,开始导航到该网址;最后,将网址写在标签上。主要流程图如图4-3所示。有了这些思想,我们就可以进行具体编程实现了。
获取网址
m_lURL<- 网址
发送消息
将新文档贴在标签栏上
Navigate2(m_lURL)
将网址贴在标签上
END
图4-2 主要流程图
4.2 浏览器功能实现过程
4.2.1 创建程序主框架
现在开始用Visual C++中的AppWizard向导来完成应用程序主框架的创建工作。
步骤一:打开Visual C++ 6.0,选择[文件]菜单中的[新建]菜单项,在对话框中选择[工程]选项卡,如图4-3所示,在列表中选中MFC AppWizard[exe]选项,并且在[工程]栏中输入工程项目名称,本设计定义为MIE,单击[确定]继续。注意,几乎在所有的工程文件的内部和外部都使用该名字,因此,此处的任何错误在以后都是很难改正的。
步骤二:这一步是选择应用程序的类型。在弹出的MFC AppWizard-step 1对话框中,本设计选择应用程序文件为多重文档,单击[下一个]继续。如图4-4所示。
图4-3
步骤三:在AppWizard的第二步对话框中,选择[否]按钮,单击[下一个]继续。这一步要求指定应用程序所需要的数据库支持种类。选择“标题文件”使AppWizard只添加支持数据库访问的MFC类。选择“查看数据库不使用文件支持”或者“查看数据库使用文件支持”使AppWizard创建一个具有特殊的视图和文档类的简单的数据库编辑器。如果选择“查看数据库不使用文件支持”,AppWizard将不添加标准文件打开命令到应用程序菜单(即:File/New, File/Open等)。从理论上讲,如果只访问一个数据库,无论如何也不需这些命令—当应用程序开始运行时,合适的数据库将被自动打开。
图4-4
步骤四:第三步到第五步对话框都采用默认设置。AppWizard的第三步要求指定应用程序所需要的COM支持,第四步要求选择一些基本的应用程序选项,第五步必须决定是用MFC库静态链接,还是用一个共享的MFC DLL进行链接。静态链接MFC库使应用程序相当庞大,但用户从来不必考虑正确版本的MFC DLL当前是否已经安装在系统上。如果计划用MFC库创建自己的DLL,则必须链接MFC DLL。
步骤五:在第六步对话框中,如图4-5所示,可以在这里改变其类名、基类、头文件名、源代码文件名。本设计中除类名以外不必对这些名称进行修改,类名改为CHtmlView。
图4-5
步骤六:系统弹出新建工程信息对话框,该对话框说明刚才设置的应用程序类型、类创建方式及程序特征。现在已经完成了应用程序的设置工作,单击[确定],VC立刻自动创建文件。
AppWizard即应用程序向导,用它可以创建各种不同类型的程序。AppWizard有一个管理装置,它不是一个单独的应用程序。Custom AppWizard运行于Visual Studio框架之中,它所谓的“管理器”,实际上就是MFCAPWZ.DLL,控制不同的AppWizard执行。在创建新工程的对话框中,“Project”标签是默认的选项,列表框中显示出内建的工程类型。此外,这个列表框中还列出用户定制的AppWizard,这些定制AppWizard文件扩展名为*.awx,它们存放在一个特定的目录中。只要产生了*.awx文件,它就会与标准的Visual C++ AppWizard一起自动显示在这个列表框中。
直接运行以后,结果如图4-6所示:
图4-6
完成主界面的设计后,接下来就开始设计具有互补结构的网络浏览器了。在程序中,基本都是采用C++语言和MFC中常见的指令和函数编写的。
4.2.2 显示浏览器功能
1、创建IE风格工具条
浏览器工具条是由一组工具条按钮或其他功能控件组成的一个特定区域,是和浏览器紧密绑定的网络辅助软件,是浏览器的扩展应用程序,由位于浏览器顶部的连续的一组按钮或其他功能控件组成的一个整体操作区,以帮助用户快速访问网站及提供特定功能。它运行简单、在线时间长、轻便小巧、占用资源低、功能强大。本设计中也在浏览器中加入了工具条的设置。
IE风格界面主要在主框架类的CMainFrame::OnCreate (lpCreateStruct) 函数中实现,CReBar对象用来作为工具条、地址栏的容器,CImageList对象,然后分别装载工具栏上按钮的热点图像和正常状态下显示的图像,并将该对象附给工具条对象,使之建立关联。另外,如果要将某一个工具栏按钮设置为附带有下拉按钮,可以调用SetButtonInfo(),设置按钮的风格为TBSTYLE_DROPDOWN。在CMIEView中加入消息响应函数GoBack()(后退)、GoForward()(前进)、GoHome()(主页)、Refresh()(刷新)、Stop()(停止)以及GoSearch()(搜索),使鼠标点击工具栏的图标后产生相应的操作。在本设计中,这些消息响应函数直接用向导加入。
下面介绍一下用到的主要函数:
OnCreate()的作用是来创建一个windows的子窗口,并且将这个窗口绑定在一个CWnd对象上面。此函数一般返回值应该为0,其中参数lpCreateStruct指向包含CWnd对象被创造信息的CREATESTRUCT结构。这是创建一个窗口首先必须要做的两个步骤的其中一个步骤,他是对虚函数create()的重载。当申请窗口的请求产生的时候,结构调用给这一个函数功能产生或 CreateEx 函数功能。 CWnd 在接收到这一请求之后 , 在它可见之前就生成窗口。
CMDIFrameWnd类提供一个复合文件接口(MDI)的窗口框架的函数功能,连同管理窗口的成员一起。为了给自己的框架窗口建立一个有用的MDI,可以从CMDIFrameWnd获得一个类,把成员变量添加进去来存储你申请的数据特性。可以通过调用CMDIFrameWnd类中的Create 或 LoadFrame成员函数来构建一个MDI窗口。BEGIN_MESSAGE_MAP宏可以用来开始消息响应的定义,参数CMIEView是需要定义的类,CHtmlView是基类。在执行文件夹(.cpp)中为类定义成员函数,用BEGIN_MESSAGE_MAP宏开始消息响应,然后为每个函数的消息句柄添加入口,最后用END_MESSAGE_MAP宏完成消息响应。
CImageList类提供了窗口一般图像列表控制的函数功能,用来管理位图。Bitma表示两个冷热位图。GetToolBarCtrl()把使用提交给下面的一般控制。使用GetToolBarCtrl()有利于窗口工具栏一般控制的函数功能,也有利于提供工具定制。SetButtonWidth()设定了工具按钮的尺寸。调用SetExtendedStyle()可以为一个组合框延伸的控制设置延伸类型。
实现的流程如图4-8所示。
创建好工具条之后,就可以添加工具栏功能了。浏览器工具栏的功能有前进、后退、主页、刷新等。修改主菜单,添加一个“操作”菜单,在“操作”菜单下面包括了“前进”、“后退”、“刷新”、“停止”、“主页”等的子菜单。另外,添加两个位图,用于工具条的ImageList,这两幅位图分别表示了工具栏被激活和被冷藏的状态。如图4-9所示
创建容器
创建组合框
添加消息响应
添加工具栏按钮
将组合框加入容器
图4-8 实现的流程
图4-9 工具栏被激活和被冷藏的状态
网页的显示
浏览器最基本的功能就是显示网页,所以这个设置也是很重要的。地址栏是在IN PROCESS上有一排本机的地址。期间可能出现可以点击的连接,上面写着,“如果这个不是你地址,请点击此连接改变”。
网页的显示通常有两种方式:第一,在地址栏中直接输入网址打开网页,当用户在地址栏上输入网页地址并按下回车键后,浏览器将显示该网页的内容,并将在地址栏中记录下该地址。因为回车键按下后对应的消息ID为IDOK,为此,需要在CmainFrame类中添加消息映射ON_COMMAND(IDOK, OnNewAddressEnter)和消息响应函数afx_msg void OnNewAddressEnter()。同理,还要在CmainFrame类中为地址栏(ID 为AFX_IDW_TOOLBAR + 1)添加消息映射ON_CB
展开阅读全文