C++实验报告WEB浏览器文档格式.docx
《C++实验报告WEB浏览器文档格式.docx》由会员分享,可在线阅读,更多相关《C++实验报告WEB浏览器文档格式.docx(22页珍藏版)》请在冰点文库上搜索。
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()
OnBack()
OnStop()
OnUpdate()
OnHomepage()
OnSearch()
图1.5
5.添加事件处理函数的代码
在MyWeb16View.cpp实现文件中,添加上述6个时间处理函数的代码。
//前进到下一个网页
voidCMyWeb16View:
:
OnFoward(){GoForward();
}
//退到下一个网页
OnBack(){GoBack();
//停止网页的下载
OnStop(){Stop();
//刷新当前的网页
OnUpdate(){Refresh();
//回到主页
OnHomepage(){GoHome();
//进行搜索
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文件中,添加处理函数的声明。
voidSetPage(LPCTSTRlpazURL);
SetPage(LPCTSTRlpszURL)
SetWindowText(lpszURL);
③使用类向导添加事件处理函数。
用类向导为应用程序的CMyWeb16View类添加OnDocumentComplete()事件处理函数,并在myWeb16View.cpp文件中添加它的实现代码。
OnDocumentComplete(LPCTSTRlpszURL)
((CMainFrame*)GetParentFrame())->
SetPage(lpszURL);
④添加包含语句。
在MainFrm.cpp文件前面添加包含语句。
#include"
myWeb16View.h"
在myWeb16View.cpp文件前面添加包含语句。
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示。
删除文档历史记录
ID_DelHistory
清除Cookie
ID_DelCookies
清除Internet临时文件
ID_DelIntenetTempFile
清除地址栏中历史地址
ID_DelHistoryAddress
清除密码历史记录
ID_DelHistoryPassword
图2.2
2.为控件添加事件处理函数
在“ClassName”下拉列表框中选择CMyWeb16View类,然后按照表2.4为上述删除的六个控件添加事件处理函数。
OnDelHistory()
OnDelCookies()
OnDelIntenetTempFile()
OnDelHistoryAddress()
OnDelHistoryPassword()
图2.4
3.添加事件处理函数的代码
在myWeb16View.cpp中,添加如下代码。
(1)实现文档历史记录的清除
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
OnDelCookies()//清除Cookies
DeleteUrlCache(Cookie);
//删除URL的Cache
if(SHGetSpecialFolderPath(NULL,szPath,CSIDL_COOKIES,FALSE))
(3)清除Internet的临时文件
OnDelIntenetTempFile()//清空Internet临时文件
DeleteUrlCache(File);
if(SHGetSpecialFolderPath(NULL,szPath,CSIDL_INTERNET_CACHE,FALSE))
{//得到临时目录并清空它
(4)清除地址栏中的历史任务
{//浏览器地址栏历史记录的清除
Software\\Microsoft\\InternetExplorer\\TypedURLs"
(5)清除密码历史纪录
OnDelHistoryPassword()
{//清除密码历史记录
Software\\Microsoft\\InternetExplorer\\IntelliForms"
(6)实现目录的删除
在OnDelIntenetTempFile、OnDelCookies和OnDelHistory这三个函数中都用到了函数EmptyDirectory()。
删除目录是一个基本操作,因为有些历史记录是以文件形式保存在某个特定目录下的而且目录下还可能有子目录,所以可以采用递归方法删除整个目录。
EmptyDirectory函数负责清空整个目录。
①在myWeb16View.cpp文件的类定义前面添加包含语句。
#include"
shlwapi.h"
在StdAfc.h文件的类定义前面添加包含语句。
atlbase.h"
在myWeb16View.h的文件中,添加处理函数的声明。
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("
.."
(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文件的类定义前面添加包含语句
wininet.h"
UrlHist.h"
#defineSWEEP_BUFFER_SIZE10000
2在myWeb16View.h中添加如下枚举类型,以及处理函数的声明。
enumDEL_CACHE_TYPE
File,//表示Internet临时文件
Cookie//表示Cookie
};
BOOLDeleteUrlCache(DEL_CACHE_TYPEtype);
③在myWeb16View.cpp的文件中添加如下代码。
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,&
if(!
hEntry)
gotocleanup;
do
if(type==File&
!
(lpCacheEntry->
CacheEntryType&
COOKIE_CACHE_ENTRY))
DeleteUrlCacheEntry(lpCacheEntry->
lpszSourceUrlName);
elseif(type==Cookie&
dwEntrySize=0;
FindNextUrlCacheEntry(hEntry,NULL,&
delete[]lpCacheEntry;
lpCacheEntry=(LPINTERNET_CACHE_ENTRY_INFO)newchar[dwEntrySize];
}
while(FindNextUrlCacheEntry(hEntry,lpCacheEntry,&
dwEntrySize));
bRet=TRUE;
cleanup:
if(lpCacheEntry)
returnbRet;
缺少2个连接加上
#pragmacomment(lib,"
wininet.lib"
)
Shlwapi.lib"
(8)实现桌面快捷方式
①添加按钮“创建快捷方式”
修改对话框控件(IDR_MAINFRAME),添加按钮“创建快捷方式”与编辑框,如下图所示。
对话框条目名称(Caption)
创建快捷方式
IDC_SHORTCUT
编辑框
IDC_shortcutname
IDC_SHORTCUT
OnShortcut()
②添加代码如下:
OnShortcut()
CStringpp1;
//获得用