我的Web浏览器设计.docx
《我的Web浏览器设计.docx》由会员分享,可在线阅读,更多相关《我的Web浏览器设计.docx(29页珍藏版)》请在冰豆网上搜索。
我的Web浏览器设计
计算机网络课程设计
题目:
Wet^U览器设计
成员姓名:
班级:
指导教师:
日期:
20012年6月
1、系统分析3
1.1系统需求3
1.2功能要求…3
1.3运行环境3
1.4开发工具3
2、概要设计4
1基本设计概念…4
1软件设计层次图5
3、详细设计6
(1)web浏览器基本功能的实现6
(1)收藏夹功能设计10
(1)历史记录功能设计13
(1)抓图工具设计15
4、系统运行.25
5、设计总结29
参考文献30
1、系统分析
系统需求
浏览器是指可以显示网页服务器或者文件系统的HTMLC件内容,并让用户与这些文件交互的一种软件。
网页浏览器主要通过HTTP>议与网页服务器交互并获取网页,这些网页由URL旨定,文件格式通常为HTML并由MIMEfcHTTPa、议中指明。
一个网页中可以包括多个文档,每个文档都是分别从服务器获取的。
在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,同时也越来越离不开浏览器,人们利用浏览器可以查看很多东西,上淘宝,需要浏览器,上XX搜索东西,需要浏览器,打开网站网址,需要浏览器。
由此浏览器的种类也越来越多,如IE浏览器、谷歌浏览器、360浏览器、遨游浏览器等等。
因此,浏览器对于人们的生活起着举足轻重的作用,浏览器的作用范围将不断扩大,人们的生活将离不开浏览器的使用。
功能要求
使用ChtmlView类来实现一个应用程序,使之具有Web浏览器的功能,包括浏览网页、前进、后退、返回主页、刷新、搜索、收藏夹、历史记录、抓图、删除等功能。
运行环境
本系统基于Windows平台设计,适用于Windows系歹!
J的系统,如流行的WindowsXP、
WindowsVista等。
开发工具:
VC++6.0C程序开发软件;
2、概要设计
基本设计概念
利用已有的HTTP空制、HTM邮释器和HTM映行器,通过MFO供的CHtmlView类实现的一个Windows下的多功能的浏览器。
该浏览器的功能包括:
WEB占点浏览、本地和网络的文件系统的浏览、前进、后退、返回主页、刷新、搜索、历史记录的维护、IE收藏夹功能和设置桌面快捷方式功能等。
2.2软件设计层次图
系统流程图:
当用户登录此简易浏览器时,需要在地址栏输入需要搜索的内容的网址,当输入网址后,该浏览器会链接到相应的URL地址,实现页面的下载,并显示页面,从而实现该简易浏览器连接网络的功
功能结构图:
该程序的设11主要分5部分。
首先是登录界面的实现,其中要创建按钮,创建菜单栏及下拉菜
单的实现;第二部分要实现各按钮的具体的功能包括在其中设置监听器,实现对按钮动作的监听及响
应;第三部分用于对地址栏输入内容格式的设定包括如何处理异常等;第四部分实现页面的下载;第
五部分用于实现页面的显示。
具体的功能结构图如下:
web浏览器
登
功
URL
下
显
录
能
连
载
示
界
按
接
链
链
面
钮
实
接
接
实
实
现
页
页
现
现
面
面
3、详细设计
web浏览器基本功能(前进、后退、停止、刷新、搜索、主页)的实现:
利用MFCAppWizard生成应用程序框架
创建工程名为HtmlView。
第一步,选择工程类型为单文档(SDI),中文语言支持。
第二步和第三步使用默认值,不需要数据库,也不提供对于复合对象的支持;第四步选择InternetExplorerReBars
工具栏的风格,这样就有了用来输入网址的文本框;第五步不做任何修改;第六步选择CHtmlView类作为视图类的基类。
生成工程框架包含4个类。
(1)应用程序类:
CHtmlViewApp对应HtmlView.h和HtmlView.cpp文件。
框架类:
CMainFrame对应MainFrm.h和MainFrm.cpp文件。
文档类:
HtmlViewDoc,对应HtmlViewDoc.h和HtmlViewDoc.cpp文件。
HtmlView类:
CHtmlViewView,对应CHtmlViewView.h和CHtmlViewView.cpp文件。
此时编译运行,程序已经具有基本的WebM览功能,能自动链接到微软公司的网站。
修改菜单
在工作区中选择“ResourceView”选项卡,选择Menu双击菜单控件的名字(IDR_MAINFRAME右边出现程序的菜单。
选择菜单中的“查看”命令,已经有了“工
具栏”和“状态栏”两个条目,双击下面的空框,弹出设置菜单条目属性对话框,按照表添加菜单项:
菜单条目名称(Caption)
ID号
前进
ID_FOWARD
后退
IDBACK
停止
ID_STOP
刷新
ID_REFRESH
主页
ID_HOME
搜索
ID_SEARCH
修改工具栏:
在工作区中选择“ReaourcecView”选项卡,选择ToolBar,双击工具条控件的名字(IDR_MAINFRAME右边出现程序的工具条。
添加如图的新的按钮图样。
他们的ID号与相应的菜单条目相同。
使他们的ID号与相应的菜单条目的ID号相同。
口客屋名跑1O昌督哈可4©
添加控件事件处理函数:
进入类向导,选择“MessageMaps选项卡。
在“ClassName”下拉列表框中选择
CHtmlViewView类,然后按照表为控件添加事件处理函数
对象ID
Messages
MemberFunction
ID_FORWARD「
COMMAND
OnFoward()
ID_BACK
COMMAND
OnBack()
ID_STOP「
COMMAND
OnStop()
ID_REFRESH
COMMAND
OnRefresh()
ID_HOME
COMMAND
OnHome()
ID_SEARCH
COMMAND
OnSearch()
添加事件处理函数代码:
在CHtmlViewView.cpp实现文件中,添加上述6个时间处理函数的代码。
voidCHtmlViewView:
:
OnBack(){GoBack();}〃后退;
voidCHtmlViewView二OnForward(){GoForward();}//前进;
voidCHtmlViewView:
:
OnHome(){GoHome();}//主页;
voidCHtmlViewView:
:
OnStop(){Stop();}//停止;
voidCHtmlViewView:
:
OnRefresh(){Refresh();OnOldlogins();}〃刷新;
voidCHtmlViewView二OnSearch(){GoSearch();}//搜索;
添加URL定位功能:
(1)添加网址输入栏控件。
在工作区中选择“ResourceView”选项卡,选才?
Dialog,双击对话框控件的名字(IDR_MAINFRAME右边出现对话框条。
在上面添加一个“请输入地址”的静态文本,
再添加一个组合框控件,ID号设为IDC_EDIT_ADDRESS乍为地址栏,提供给用户输入要浏览的网站地址。
如图所示。
"WJJ*"-,**■*******「*"「**.**,"****1」*J***J.**JJ1■iiri
i请输入地址:
H3-
■।ti.■1«Jw,」,一■i**・*wj»・**.”■■■■i>wuW-"Ji%w'u.uw$11.w'■■•■W'd'UMwuiwwu«wj
(2)添加控制代码。
当用户输入网址后按回车时,就有一个IDOK的消息发送到主框架类,添加处理这个消
息的控制函数,在该函数中,用指定的网址调用Navigate()和Navigate2()函数,就可
以实现对该网页的浏览。
在MainFrm.h文件中,添加消息处理函数的声明。
public:
voidOnInputAddress();
②在MainFrm.cpp文件中,添加该函数的实现代码。
voidCMainFrame二OnInputAddress()//当用户输入Web®址并且回车
{
CStringsWebAddress;
//从编辑框获取用户输入的We州址
m_wndDlgBar.GetDlgItem(IDC_EDIT_ADDRESS)->GetWindowText(sWebAddress);
//浏览相应的网页
((CHtmlView*)GetActiveView())->Navigate(sWebAddress);
③在MainFrm.cpp的文件中,在消息映射(MESSAGE_MAP中添加自己的消息映射宏。
ON_COMMAND(IDOK,OnInputAddre§s)
解决单击超级链接时地址栏的同步问题:
利用CHtmlView类的事件处理函数,当网页下载完成,会触发OnDocumentComplete()函数,该函数的参数就是所下载网页的URL可以利用此函数对地址栏进行设置,添
加以下代码。
在MainFrm.h文件中,添加处理函数的声明。
public:
voidSetURL(LPCTSTRlpszURL);
在MainFrm.cpp文件中,添加该函数的实现代码。
voidCMainFrame:
:
SetURL(LPCTSTRlpszURL)
{
m_wndDlgBar.GetDlgItem(IDC_EDIT_ADDRESS)->SetWindowText(lpszURL);
m_wndDlgBar.GetDlgItem(IDC_shortcutname)->SetWindowText(lpszURL);
}
使用类向导添加事件处理函数。
用类向导为应用程序的CHtmlViewView类添加OnDocumentComplete(LPCTSTRlpszURL)1件处理函数,并在myWeb16View.cpp文件中添加它的实现代码。
voidCHtmlViewView:
:
OnDocumentComplete(LPCTSTRlpszURL)
{
//每次当前页面改变,更新地址栏的内容和窗口的标题
((CMainFrame*)GetParentFrame())->SetURL(lpszURL);
GetDocument()->SetTitle(lpszURL);
CHtmlView:
:
OnDocumentComplete(lpszURL);
}
收藏夹功能设计:
3.2.1.修改菜单:
在菜单中加入“收藏夹”栏。
宜梏出骈芭看乜।帮助QD收而去।s)控制M历史登录弄即图剧展L.
创建“收藏夹”:
在主框架类的创建函数:
OnCreate(LPCREATESTRUCTIpCreateStruct)实现代码中
添加如下代码(与菜单中“收藏夹”子菜单相对应,同时与IE浏览器的注册表相
连):
〃生成“我的收藏夹”子菜单
TCHARsz[MAX_PATH];//260
TCHARszPath[MAX_PATH];〃260
HKEYhKey;
DWORDdwSize;
CMenu*pMenu;
//开始消去存在的菜单
pMenu=GetMenu()->GetSubMenu(4);
while(pMenu->DeleteMenu(0,MF_BYPOSITION));〃0X00000400L
〃从注册表中找到“我的收藏夹的位置”,然后读写注册表
if(RegOpenKey(HKEY_CURRENT_USER,_T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserShellFolders"),&hKey)!
=ERROR_SUCCESS){
TRACE0("Favoritesfoldernotfound'n");
return0;
}
dwSize=sizeof(sz);
RegQueryValueEx(hKey,_T("Favorites"),NULL,NULL,(LPBYTE)sz,&dwSize);
ExpandEnvironmentStrings(sz,szPath,MAX_PATH);
RegCloseKey(hKey);
〃添加我的收藏菜单项
BuildFavoritesMenu(szPath,0,pMenu);
在主框架类CMainFrame中添力口BuildFavoritesMenu()函数实现收藏夹的收藏功
△'匕
目匕:
a.在MainFrm.h中声明intBuildFavoritesMenu(LPCTSTRpszPath,intnStartPos,CMenu*pMenu)函数实现添加我的收藏菜单项;
b在MainFrm.cpp中实现BuildFavoritesMenu()的功能,具体实现代码如下:
intCMainFrame:
:
BuildFavoritesMenu(LPCTSTRpszPath,intnStartPos,CMenu*pMenu)
{
CStringstrPath(pszPath);CStringstrPath2;CStringstr;WIN32_FIND_DATAwfd;
HANDLEh;intnPos;intnEndPos;
intnNewEndPos;
intnLastDir;
TCHARbuf[2048];
CStringArrayastrFavorites;
CStringArrayastrDirs;
CMenu*pSubMenu;
//确定有'\\'字符
if(strPath[strPath.GetLength()-1]!
=_T('\\'))strPath+=_T('\\');
strPath2=strPath;strPath+="*.*";
//首先扫描.URL然后扫描子目录h=FindFirstFile(strPath,&wfd);
if(h!
=INVALID_HANDLE_VALUE){
nEndPos=nStartPos;
do
{
if((wfd.dwFileAttributes&(FILE_ATTRIBUTE_DIRECTORY|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM))==0)
{
str=wfd.cFileName;
if(str.Right(4)==_T(".url"))
{
//an.URLfileisformattedjustlikean.INIfile,sowecan
//useGetPrivateProfileString()togettheinformationwewant:
:
GetPrivateProfileString(_T("InternetShortcut"),_T("URL"),
_T(""),buf,2048,strPath2+str);
str=str.Left(str.GetLength()-4);
//scanthroughthearrayandperformaninsertionsort
//tomakesurethemenuendsupinalphabeticorder
for(nPos=nStartPos;nPos{
if(str.CompareNoCase(astrFavorites[nPos])<0)break;
)
astrFavorites.InsertAt(nPos,str);
m_astrFavoriteURLs.InsertAt(nPos,buf);++nEndPos;))
}while(FindNextFile(h,&wfd));
FindClose(h);
//Nowaddtheseitemstothemenufor(nPos=nStartPos;nPospMenu->AppendMenu(MF_STRING|MF_ENABLED,0xe00+nPos,astrFavorites[nPos]);}
//nowthatwe'vegotallthe.URLfiles,checkthesubdirectoriesformorenLastDir=0;
h=FindFirstFile(strPath,&wfd);
ASSERT(h!
=INVALID_HANDLE_VALUE);do{
if(wfd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY){
//ignorethecurrentandparentdirectoryentries
if(lstrcmp(wfd.cFileName,_T("."))==0||lstrcmp(wfd.cFileName,_T(".."))==0)continue;
for(nPos=0;nPosif(astrDirs[nPos].CompareNoCase(wfd.cFileName)>0)break;}pSubMenu=newCMenu;
pSubMenu->CreatePopupMenu();
//callthisfunctionrecursively.
nNewEndPos=BuildFavoritesMenu(strPath2+wfd.cFileName,nEndPos,pSubMenu);if(nNewEndPos!
=nEndPos){
//onlyintertasubmenuifthereareinfact.URLfilesinthesubdirectorynEndPos=nNewEndPos;
pMenu->InsertMenu(nPos,MF_BYPOSITION|MF_POPUP|MF_STRING,(UINT)pSubMenu->m_hMenu,wfd.cFileName);
pSubMenu->Detach();
astrDirs.InsertAt(nPos,wfd.cFileName);
++nLastDir;
deletepSubMenu;
)
}while(FindNextFile(h,&wfd));
FindClose(h);
}
returnnEndPos;
}
在MainFrm.h中声明函数voidOnFavorite(UINTnID)实现当在收藏夹中单击相
应的网址时,将该网址在浏览器中显示;
a在MainFrm.cpp中的消息映射表中添加ON_COMMAND_RANGE(0xe00,0xfff,OnFavorite)消息响应;
b.在MainFrm.cpp中实现OnFavorite(UINTnID)的功能,具体代码如下:
voidCMainFrame:
:
OnFavorite(UINTnID){
((CHtmlViewView*)GetActiveView())->Navigate2(m_astrFavoriteURLs[nID-0xe00],0,NULL);
}
.历史记录功能设计:
.修改菜单,在菜单中加入“历史记录”栏,将ID号设为:
ID_OLDLOGINS。
文性田洛事国查看如用的回收♦夹t5】按胤闻而史酹制京m图他於匚二]
MenuItemProperties叵
中号GtheralExlendedStyles|
(□:
[ID_OLDLOGINS三]plion;厮史.录
SeparatorPup-uploaclNe旦re占k:
fKlone.
CheckedgrayedHelp
Pmnipt:
登录记录
.在HtmlViewView.h中添加历史记录处理函数afx_msgvoidOnOldlogins(),并在
HtmlViewView.cpp中实现该功能,代码如下:
voidCHtmlViewView:
:
OnOldlogins()〃历史记录{
((CMainFrame*)GetParentFrame())->HistoryScan();}
⑶.在CMainFrame类中添加函数HistoryScan()实现将最近登录网址添加到“历史记录”子菜单中。
具体代码如下:
intCMainFrame:
:
HistoryScan(){
charbuffer[256];
〃定义一个流式文件;
ifstreamcfile("History.txt");
if(!
cfile.is_open())
(AfxMessageBox(_T("文件打开失败!
"));
)
//得到“历史记录”子菜单的句柄;
pMenu1=GetMenu()->GetSubMenu(6);
while(pMenu1->DeleteMenu(0,MF_BYPOSITION));〃0X00000400Lwhile(!
cfile.eof())
(
//获取一个历史记录网址;
cfile.getline(buffer,100);
if(buffer==NULL)(
continue;
)
〃将获取的网址添加到历史记录链表中;
m_astrHistoryURLs.InsertAt(m_number,buffer);
〃将网址添加到历史记录子菜单内;
pMenu1->AppendMenu(MF_STRING|MF_ENABLED,0x001+m_number++,buffer);
)
return1;
)
.在CMainFrame类中添加函数HistoryScanSave(),实现将历史记录保存到History.txt文件中;具
体代码如下:
voidCMainFrame:
:
HistoryScanSave()
(
if(file.Open(_T("History.txt"),CFile:
:
modeCreate|CFile:
:
modeWrite))(
〃由文件末尾开始写;
file.SeekToEnd();
file.Write(addr.GetBuffer(addr.GetLength()+1),addr.GetLength()+1);
addr.ReleaseBuffer();
file.Close();
)
elseAfxMessageBox(_T("文件打开失败!
"));
)
.在MainFrm.h中声明函数voidOnHistory(UINTnID)实现当在历史记录菜单中单击相应的网址时,将该网址在浏览器中显示;
a.在MainFrm.cpp中的消息映射表中添加ON_COMMAND_RANGE(0x001,0xdfe,OnHistory)消息响应;
b.在MainFrm.cpp中实现OnHistory(UINTnID)的功能,具体代码如下:
voidCMainFrame:
:
OnHistory(UINTnID)
〃当单击历史记录内某一网址时,将该网址在浏览器中显示;
((CHtmlViewView*)GetActiveView())->Navigate2(m_astrHistoryURLs[nID-0x001],0,NULL);)
.在MainFrm.cpp中的SetURL()函数中添加代码实现将当前网址添加到历史记录菜单中,具体代
码如下:
〃将地址栏内的地址存起来,作为历史记录;
addr+=lpszURL;
addr+="\r'n";
HistoryScanSave();
3.4抓图工具的实现:
在以设计好的WebM览器中的菜单栏