C++实验报告WEB浏览器.docx
- 文档编号:10771297
- 上传时间:2023-02-22
- 格式:DOCX
- 页数:22
- 大小:434.29KB
C++实验报告WEB浏览器.docx
《C++实验报告WEB浏览器.docx》由会员分享,可在线阅读,更多相关《C++实验报告WEB浏览器.docx(22页珍藏版)》请在冰豆网上搜索。
C++实验报告WEB浏览器
C++实验报告
基于IE的WEB浏览器
姓名:
***
学号:
*********
班级:
*********
2012/12/13
一、实验目的
目的:
通过一个学期的学习,编写一个项目型的功能软件,综合应用专业所学习的多门课程知识,并把本学期所学的编程知识运用到实际编程中,熟练编程规范,训练编程思维,为学生适应合作开发规模稍大项目打下基础。
二、实验设备(环境)及要求
1)使用VC++平台实现该程序
2)要求用户操作时,要给出清晰,明确的提示信息。
3)所有文件、函数、变量的名称应尽量做到“见其名知其意”。
三、实验设计
由于技术原因本软件直接调用IE内核,该软件的具体功能如上图,除了具有普通浏览器的功能外又加了个特殊的功能“文本文档记录浏览过所有网页的地址”随着上网的浏览网页是项目过多,有时候需要记录网页,但是浏览记录大多又太复杂,上面的项目太多,而且大多都不是自己需要的,为了解决这个问题,本软件专门设置了个记录所有浏览过网页地址的文本文档,这个很实用但又很简单的功能。
四、软件的具体实现过程
(一)实现WEB站点浏览,初步完成浏览器的模块的建立以及实现工具栏的各个功能(如:
前进.后退,刷新,主页,停止以及搜索等功能)。
1.利用MFCAppWizard生成应用程序框架
工程名为myWeb16。
第一步,选择工程类型为单文档(SDI),中文语言支持。
第二步和第三步使用默认值,不需要数据库,也不提供对于复合对象的支持;第四步选择InternetExplorerReBars工具栏的风格,这样就有了用来输入网址的文本框;第五步不做任何修改;第六步选择CHtmlView类作为视图类的基类。
生成工程框架包含4个类。
1.应用程序类:
CMyWeb16App,对应myWeb16.h和myWeb16.cpp文件。
2.框架类:
CMainFrame,对应MainFrm.h和MainFrm.cpp文件。
3.文档类:
CMyWeb16Doc,对应myWeb16Doc.h和myWeb16Doc.cpp文件。
4.HtmlView类:
CMyWeb16View,对应myWeb16View.h和myWeb16View.cpp文件。
此时编译运行,程序已经具有基本的Web浏览功能,能自动链接到微软公司的网站。
2.修改菜单
在工作区中选择“ResourceView”选项卡,选择Menu,双击菜单控件的名字(IDR_MAINFRAME),右边出现程序的菜单。
选择菜单中的“查看”命令,已经有了“工具栏”和“状态栏”两个条目,双击下面的空框,弹出设置菜单条目属性对话框,如图1.1所示,按照表1.2添加6个菜单条目
菜单条目名称(Caption)
ID号
前进
ID_FOWARD
后退
ID_BACK
停止
ID_STOP
刷新
ID_UPDATE
主页
ID_HOMEPAGE
搜索
ID_SEARCH
图1.2
3.修改工具栏
在工具栏上增加新的按钮,以便快速执行所需的功能。
在工作区中选择“ReaourcecView”选项卡,选择ToolBar,双击工具条控件的名字(IDR_MAINFRAME),右边出现程序的工具条。
双击其中的安秀,可以看到他们的属性。
其中有一个空的按钮,双击它可以添加新的安秀的属性,如图1.3所示,利用右边的图形绘制工具,可以自己设计新的按钮图样。
如图1.4所示。
如图添加6个按钮,他们的ID号与相应的菜单条目相同。
拖动按钮,可以改变按钮之间的相对位置。
4.为控件添加时间处理函数
当用户单击菜单条目,或者单击相应的快捷键时,应能引起程序的反映,这就需要给这些控件添加时间处理函数。
进入类向导,选择“MessageMaps”选项卡。
在“ClassName”下拉列表框中选择CMyWeb16View类,然后按照表1.5为前述的六个控件添加事件处理函数。
对象ID
Messages
MemberFunction
ID_FORWARD
COMMAND
OnFoward()
ID_BACK
COMMAND
OnBack()
ID_STOP
COMMAND
OnStop()
ID_UPDATE
COMMAND
OnUpdate()
ID_HOMEPAGE
COMMAND
OnHomepage()
ID_SEARCH
COMMAND
OnSearch()
图1.5
5.添加事件处理函数的代码
在MyWeb16View.cpp实现文件中,添加上述6个时间处理函数的代码。
//前进到下一个网页
voidCMyWeb16View:
:
OnFoward(){GoForward();}
//退到下一个网页
voidCMyWeb16View:
:
OnBack(){GoBack();}
//停止网页的下载
voidCMyWeb16View:
:
OnStop(){Stop();}
//刷新当前的网页
voidCMyWeb16View:
:
OnUpdate(){Refresh();}
//回到主页
voidCMyWeb16View:
:
OnHomepage(){GoHome();}
//进行搜索
voidCMyWeb16View:
:
OnSearch(){GoSearch();}
此时可以再进行编译运行。
6.为应用程序添加URL定位功能
(1)添加网址输入栏控件。
在工作区中选择“ResourceView”选项卡,选择Dialog,双击对话框控件的名字(IDR_MAINFRAME),右边出现对话框条。
在上面添加一个“地址”的静态文本,再添加一个文本编辑框控件,ID号时IDC_ADDR,作为地址栏,提供给用户输入要浏览的网站地址。
如图1.6所示。
(2)添加控制代码。
当用户输入网址后按回车时,就有一个IDOK的消息发送到主框架类,添加处理这个消息的控制函数,在该函数中,用指定的网址调用Navigate()和Navigate2()函数,就可以实现对该网页的浏览。
①在MainFrm.h文件中,添加消息处理函数的声明。
public:
voidOnNew();
②在MainFrm.cpp文件中,添加该函数的实现代码。
voidCMainFrame:
:
OnNew()
{
CStringpp;//获得用户在地址栏中输入的URL
m_wndDlgBar.GetDlgItem(IDC_ADDR)->GetWindowText(pp);//浏览指定的网页
((CMyWeb16View*)GetActiveView())->Navigate(pp);
}
***********③建立事件处理函数与消息的映射
在MainFrm.cpp的文件中,在消息映射(MESSAGE_MAP)段中添加自己的消息映射宏。
用ON_COMMAND命令建立IDOK消息和处理函数OnNew的映射关系。
BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
//}}AFX_MSG_MAP
ON_COMMAND(IDOK,OnNew)//自己的消息映射宏
END_MESSAGE_MAP()
④在myWeb16View.h文件的类定义前面添加包含语句
#include"myWeb16Doc.h"
7.解决单击超级链接时地址栏的同步问题
利用CHtmlView类的事件处理函数,当网页下载完成,会触发OnDocumentComplete()函数,该函数的参数就是所下载网页的URL,可以利用此函数对地址栏进行设置,添加以下代码。
1在MainFrm.h文件中,添加处理函数的声明。
public:
voidSetPage(LPCTSTRlpazURL);
②在MainFrm.cpp文件中,添加该函数的实现代码。
voidCMainFrame:
:
SetPage(LPCTSTRlpszURL)
{
m_wndDlgBar.GetDlgItem(IDC_ADDR)->SetWindowText(lpszURL);
}
③使用类向导添加事件处理函数。
用类向导为应用程序的CMyWeb16View类添加OnDocumentComplete()事件处理函数,并在myWeb16View.cpp文件中添加它的实现代码。
voidCMyWeb16View:
:
OnDocumentComplete(LPCTSTRlpszURL)
{
((CMainFrame*)GetParentFrame())->SetPage(lpszURL);
}
④添加包含语句。
在MainFrm.cpp文件前面添加包含语句。
#include"myWeb16View.h"
在myWeb16View.cpp文件前面添加包含语句。
#include"MainFrm.h"
8.修改首页地址,以及主页地址和搜索页面。
①在myWeb16View.cpp的文件中,找到OnInitialUpdate()函数,修改首页地址。
Navigate2(_T(""),NULL,NULL);
②在开始菜单的运行中输入regedit,回车。
在目录菜单下:
HKEY_CURRENT_USER/Software/Microsoft/InternetExplorer/Main找到StartPage(主页)和SearchPage(搜索页),并修改其数值数据。
StartPage(主页):
SearchPage(搜索页):
.hk
(二)加入删除IE相关历史记录的功能(包括删除文档历史纪录,清除cookies,清除Internet临时文件,清除地址栏中的历史任务,清除密码历史纪录和清除收藏夹)。
1.添加“删除”菜单
(1)修改菜单,在工作区中选择“ResourceView”选项卡,选择Menu,双击菜单控件的名字(IDR_MAINFRAME),右边出现程序的菜单。
在菜单中加入“删除”栏,分别添加“删除文档历史记录”、“清除Cookies”、“清除Internet临时文件”、“清除地址栏中的历史地址”、“清除密码历史记录”和“清除收藏夹”6个菜单条目及其属性。
如图2.1、2.2、2.3示。
菜单条目名称(Caption)
ID号
删除文档历史记录
ID_DelHistory
清除Cookie
ID_DelCookies
清除Internet临时文件
ID_DelIntenetTempFile
清除地址栏中历史地址
ID_DelHistoryAddress
清除密码历史记录
ID_DelHistoryPassword
图2.2
2.为控件添加事件处理函数
进入类向导,选择“MessageMaps”选项卡。
在“ClassName”下拉列表框中选择CMyWeb16View类,然后按照表2.4为上述删除的六个控件添加事件处理函数。
对象ID
Messages
MemberFunction
ID_DelHistory
COMMAND
OnDelHistory()
ID_DelCookies
COMMAND
OnDelCookies()
ID_DelIntenetTempFile
COMMAND
OnDelIntenetTempFile()
ID_DelHistoryAddress
COMMAND
OnDelHistoryAddress()
ID_DelHistoryPassword
COMMAND
OnDelHistoryPassword()
图2.4
3.添加事件处理函数的代码
在myWeb16View.cpp中,添加如下代码。
(1)实现文档历史记录的清除
voidCMyWeb16View:
:
OnDelHistory()//清除文档历史记录
{
TCHARszPath[MAX_PATH];
if(SHGetSpecialFolderPath(NULL,szPath,CSIDL_RECENT,FALSE))
{
EmptyDirectory(szPath);
}
SHDeleteKey(HKEY_CURRENT_USER,_T("Software\\Microsoft\\CurrentVersion\\Explorer\\RecentDocs"));
}
(2)清除Cookie
voidCMyWeb16View:
:
OnDelCookies()//清除Cookies
{
TCHARszPath[MAX_PATH];
DeleteUrlCache(Cookie);//删除URL的Cache
if(SHGetSpecialFolderPath(NULL,szPath,CSIDL_COOKIES,FALSE))
{
EmptyDirectory(szPath);
}
}
(3)清除Internet的临时文件
voidCMyWeb16View:
:
OnDelIntenetTempFile()//清空Internet临时文件
{
TCHARszPath[MAX_PATH];
DeleteUrlCache(File);//删除URL的Cache
if(SHGetSpecialFolderPath(NULL,szPath,CSIDL_INTERNET_CACHE,FALSE))
{//得到临时目录并清空它
EmptyDirectory(szPath);
}
}
(4)清除地址栏中的历史任务
voidCMyWeb16View:
:
OnDelHistoryAddress()
{//浏览器地址栏历史记录的清除
SHDeleteKey(HKEY_CURRENT_USER,_T("Software\\Microsoft\\InternetExplorer\\TypedURLs"));
}
(5)清除密码历史纪录
voidCMyWeb16View:
:
OnDelHistoryPassword()
{//清除密码历史记录
SHDeleteKey(HKEY_CURRENT_USER,_T("Software\\Microsoft\\InternetExplorer\\IntelliForms"));
}
(6)实现目录的删除
在OnDelIntenetTempFile、OnDelCookies和OnDelHistory这三个函数中都用到了函数EmptyDirectory()。
删除目录是一个基本操作,因为有些历史记录是以文件形式保存在某个特定目录下的而且目录下还可能有子目录,所以可以采用递归方法删除整个目录。
EmptyDirectory函数负责清空整个目录。
①在myWeb16View.cpp文件的类定义前面添加包含语句。
#include"shlwapi.h"
在StdAfc.h文件的类定义前面添加包含语句。
#include"atlbase.h"
在myWeb16View.h的文件中,添加处理函数的声明。
public:
BOOLEmptyDirectory(LPCTSTRszPath,BOOLbDeleteDesktopIni=FALSE,BOOLbWipeIndexDat=FALSE);//清空一个目录
③在myWeb16View.cpp的文件中,添加该函数的实现代码。
BOOLCMyWeb16View:
:
EmptyDirectory(LPCTSTRszPath,BOOLbDeleteDesktopIni,BOOLbWipeIndexDat)
{
WIN32_FIND_DATAwfd;
HANDLEhFind;//文件句柄
CStringsFullPath;
CStringsFindFilter;
DWORDdwAttributes=0;
sFindFilter=szPath;//路径名
sFindFilter+=_T("\\*.*");//表示所有文件都要删除
//找到第一个文件
if((hFind=FindFirstFile(sFindFilter,&wfd))==INVALID_HANDLE_VALUE)
{
returnFALSE;
}
do
{
if(_tcscmp(wfd.cFileName,_T("."))==0||
_tcscmp(wfd.cFileName,_T(".."))==0||
(bDeleteDesktopIni==FALSE&&_tcscmp(wfd.cFileName,_T("desktop.ini"))==0))
{
continue;
}
sFullPath=szPath;
sFullPath+=_T('\\');
sFullPath+=wfd.cFileName;//文件完整的路径和名称
//如果文件含有只读属性,那么应该去掉该属性再删除
dwAttributes=GetFileAttributes(sFullPath);//得到文件属性
if(dwAttributes&FILE_ATTRIBUTE_READONLY)//判断是否只读
{
dwAttributes&=~FILE_ATTRIBUTE_READONLY;//删除只读属性
SetFileAttributes(sFullPath,dwAttributes);//重新删除
}
//判断该文件是否是一个目录,如果是目录则递归调用清空子目录
if(wfd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
{
EmptyDirectory(sFullPath,bDeleteDesktopIni,bWipeIndexDat);
RemoveDirectory(sFullPath);
}
else//这是一个文件
{
DeleteFile(sFullPath);//删除该文件
}
}
while(FindNextFile(hFind,&wfd));//查找下一个文件
FindClose(hFind);//关闭文件句柄
returnTRUE;
}
(7)关于Cache
在OnDelCookies函数和OnDelIntenetTempFile()函数中都用到了函数DeleteUrlCache()。
在实际的网络中,任何从网络上流入的数据都会在本地的硬盘上缓存起来,Cookies和Internet临时文件也不例外,所以还需要清除他们的Cache,而不仅仅是文件本身。
1①在myWeb16View.h文件的类定义前面添加包含语句
#include"wininet.h"
#include"UrlHist.h"
#defineSWEEP_BUFFER_SIZE10000
2在myWeb16View.h中添加如下枚举类型,以及处理函数的声明。
public:
enumDEL_CACHE_TYPE
{
File,//表示Internet临时文件
Cookie//表示Cookie
};
BOOLDeleteUrlCache(DEL_CACHE_TYPEtype);
③在myWeb16View.cpp的文件中添加如下代码。
BOOLCMyWeb16View:
:
DeleteUrlCache(DEL_CACHE_TYPEtype)
{
BOOLbRet=FALSE;
HANDLEhEntry;
LPINTERNET_CACHE_ENTRY_INFOlpCacheEntry=NULL;//Cache入口指针
DWORDdwEntrySize;
dwEntrySize=0;
hEntry=FindFirstUrlCacheEntry(NULL,NULL,&dwEntrySize);//找到第一个URLCache入口
lpCacheEntry=(LPINTERNET_CACHE_ENTRY_INFO)newchar[dwEntrySize];//分配空间
hEntry=FindFirstUrlCacheEntry(NULL,lpCacheEntry,&dwEntrySize);
if(!
hEntry)
{
gotocleanup;
}
do
{
if(type==File&&!
(lpCacheEntry->CacheEntryType&COOKIE_CACHE_ENTRY))
{
DeleteUrlCacheEntry(lpCacheEntry->lpszSourceUrlName);
}
elseif(type==Cookie&&(lpCacheEntry->CacheEntryType&COOKIE_CACHE_ENTRY))
{
DeleteUrlCacheEntry(lpCacheEntry->lpszSourceUrlName);
}
dwEntrySize=0;
FindNextUrlCacheEntry(hEntry,NULL,&dwEntrySize);
delete[]lpCacheEntry;
lpCacheEntry=(LPINTERNET_CACHE_ENTRY_INFO)newchar[dwEntrySize];
}
while(FindNextUrlCacheEntry(hEntry,lpCacheEntry,&dwEntrySize));
bRet=TRUE;
cleanup:
if(lpCacheEntry)
{
delete[]lpCacheEntry;
}
returnbRet;
}
缺少2个连接加上
#pragmacomment(lib,"wininet.lib")
#pragmacomment(lib,"Shlwapi.lib")
(8)实现桌面快捷方式
①添加按钮“创建快捷方式”
修改对话框控件(IDR_MAINFRAME),添加按钮“创建快捷方式”与编辑框,如下图所示。
对话框条目名称(Caption)
ID号
创建快捷方式
IDC_SHORTCUT
编辑框
IDC_shortcutname
对象ID
Messages
MemberFunction
IDC_SHORTCUT
COMMAND
OnShortcut()
②添加代码如下:
voidCMainFrame:
:
OnShortcut()
{
CStringpp;//获得用户在地址栏中输入的URL
m_wndDlgBar.GetDlgItem(IDC_ADDR)->GetWindowText(pp);
CStringpp1;//获得用
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 实验 报告 WEB 浏览器
![提示](https://static.bdocx.com/images/bang_tan.gif)