我的Web浏览器设计说明
- 格式:doc
- 大小:808.50 KB
- 文档页数:32
计算机网络课程设计
题目:Web浏览器设计
成员:
班级:
指导教师:
日期:20012年6月
目录
1、系统分析............................................................... (3)
1.1 系统需求............................................................... .. (3)
1.2 功能要求................................................................ (3)
1.3 运行环境............................................................... .. (3)
1.4 开发工具............................................................... .. (3)
2、概要设计............................................................... (4)
2.1 基本设计概
念................................................................ . (4)
2.2 软件设计层次图............................................................... .. (5)
3、详细设计............................................................... (6)
3.1 web浏览器基本功能的实现 (6)
3.2 收藏夹功能设计............................................................... .. (10)
3.3 历史记录功能设计............................................................... .. (13)
3.4 抓图工具设计................................................................... .. (15)
4、系统运行 (25)
5、设计总结...............................................................
(29)
参考文献............................................................... (30)
1、系统分析
1.1系统需求
浏览器是指可以显示网页服务器或者文件系统的HTML文件容,并让用户与这些文件交互的一种软件。
网页浏览器主要通过HTTP协议与网页服务器交互并获取网页,这些网页由URL指定,文件格式通常为HTML,并由MIME在HTTP协议中指明。
一个网页中可以包括多个文档,每个文档都是分别从服务器获取的。
在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,同时也越来越离不开浏览器,人们利用浏览器可以查看很多东西,上淘宝,需要浏览器,上百度搜索东西,需要浏览器,打开网址,需要浏览器。
由此浏览器的种类也越来越多,如IE浏览器、谷歌浏览器、360浏览器、遨游浏览器等等。
因此,浏览器对于人们的生活起着举足轻重的作用,浏览器的作用围将不断扩大,人们的生活将离不开浏览器的使用。
1.2 功能要求
使用ChtmlView类来实现一个应用程序,使之具有Web浏览器的功能,包括浏览网页、前进、后退、返回主页、刷新、搜索、收藏夹、历史记录、抓图、删除等功能。
1.3 运行环境
本系统基于Windows平台设计,适用于Windows系列的系统,如流行的Windows XP、Windows Vista等。
1.4 开发工具:
VC++6.0C程序开发软件;
2、概要设计
2.1 基本设计概念
利用已有的HTTP控制、HTML解释器和HTML执行器,通过MFC提供的CHtmlView类实现的一个Windows下的多功能的浏览器。
该浏览器的功能包括:WEB站点浏览、本地和网络的文件系统的浏览、前进、后退、返回主页、刷新、搜索、历史记录的维护、IE收藏夹功能和设置桌面快捷方式功能等。
2.2 软件设计层次图
2.2.1 系统流程图:
当用户登录此简易浏览器时,需要在地址栏输入需要搜索的容的网址,当输入网址后,该浏览器会到相应的URL地址,实现页面的下载,并显示页面,从而实现该简易浏览器连接网络的功能。
2.2.2 功能结构图:
该程序的设计主要分5部分。
首先是登录界面的实现,其中要创建按钮,创建菜单栏及下拉菜单的实现;第二部分要实现各按钮的具体的功能包括在其中设置监听器,实现对按钮动作的监听及响应;第三部分用于对地址栏输入容格式的设定包括如何处理异常等;第四部分实现页面的下载;第五部分用于实现页面的显示。
具体的功能结构图如下:
3、详细设计
3.1 web浏览器基本功能(前进、后退、停止、刷新、搜索、主页)
的实现:
3.1.1 .利用MFC AppWizard生成应用程序框架
创建工程名为HtmlView。
第一步,选择工程类型为单文档(SDI),中文语言支持。
第二步和第三步使用默认值,不需要数据库,也不提供对于复合对象的支持;第四步选择Internet Explorer ReBars 工具栏的风格,这样就有了用来输入网址的文本框;第五步不做任何修改;第六步选择CHtmlView类作为视图类的基类。
生成工程框架包含4个类。
(1)应用程序类:CHtmlViewApp,对应HtmlView.h和HtmlView.cpp文件。
(2)框架类:CMainFrame,对应MainFrm.h和MainFrm.cpp文件。
(3)文档类:HtmlViewDoc,对应HtmlViewDoc.h和HtmlViewDoc.cpp文件。
(4)HtmlView类:CHtmlViewView,对应CHtmlViewView.h和CHtmlViewView.cpp文件。
此时编译运行,程序已经具有基本的Web浏览功能,能自动到微软公司的。
3.1.2修改菜单
在工作区中选择“ResourceView”选项卡,选择Menu,双击菜单控件的名字
(IDR_MAINFRAME),右边出现程序的菜单。
选择菜单中的“查看”命令,已经有了“工具栏”和“状态栏”两个条目,双击下面的空框,弹出设置菜单条目属性对话框,按照表添加菜单项:
菜单条目名称(Caption)ID号
前进ID_FOWARD
后退ID_BACK
停止ID_STOP
刷新ID_REFRESH
主页 ID_HOME
搜索ID_SEARCH
3.1.3修改工具栏:
在工作区中选择“ReaourcecView”选项卡,选择ToolBar,双击工具条控件的名字(IDR_MAINFRAME),右边出现程序的工具条。
添加如图的新的按钮图样。
他们的ID号与相应的菜单条目相同。
使他们的ID号与相应的菜单条目的ID号相同。
3.1.4添加控件事件处理函数:
进入类向导,选择“Message Maps”选项卡。
在“Class Name”下拉列表框中选择
CHtmlViewView类,然后按照表为控件添加事件处理函数。
对象ID Messages Member Function
ID_FORWARD COMMAND OnFoward()
ID_BACK COMMAND OnBack()
ID_STOP COMMAND OnStop()
ID_REFRESH COMMAND OnRefresh()
ID_HOME COMMAND OnHome()
ID_SEARCH COMMAND OnSearch()
3.1.5添加事件处理函数代码:
在CHtmlViewView.cpp实现文件中,添加上述6个时间处理函数的代码。
void CHtmlViewView::OnBack() { GoBack(); }//后退;
void CHtmlViewView::OnForward() { GoForward();}//前进;
void CHtmlViewView::OnHome() { GoHome();}//主页;
void CHtmlViewView::OnStop() { Stop();}//停止;
void CHtmlViewView::OnRefresh() { Refresh();OnOldlogins();}//刷新;
void CHtmlViewView::OnSearch() { GoSearch( );}//搜索;
3.1.6添加URL定位功能:
(1)添加网址输入栏控件。
在工作区中选择“Resource View”选项卡,选择Dialog,双击对话框控件的名字(IDR_MAINFRAME),右边出现对话框条。
在上面添加一个“请输入地址”的静态文本,再添加一个组合框控件,ID号设为IDC_EDIT_ADDRESS,作为地址栏,提供给用户输入要浏览的地址。
如图所示。
(2)添加控制代码。
当用户输入网址后按回车时,就有一个IDOK的消息发送到主框架类,添加处理这个消息的控制函数,在该函数中,用指定的网址调用Navigate()和Navigate2()函数 ,就可以实现对该网页的浏览。
① 在MainFrm.h文件中,添加消息处理函数的声明。
public:void OnInputAddress();
②在MainFrm.cpp文件中,添加该函数的实现代码。
void CMainFrame::OnInputAddress() // 当用户输入Web地址并且回车
{
CString sWebAddress ;
// 从编辑框获取用户输入的Web地址
m_wndDlgBar.GetDlgItem(IDC_EDIT_ADDRESS)->GetWindowText(sWebAddress);
// 浏览相应的网页
((CHtmlView *)GetActiveView())->Navigate(sWebAddress);
}
③在MainFrm.cpp的文件中,在消息映射(MESSAGE_MAP)段中添加自己的消息映射宏。
ON_COMMAND(IDOK,OnInputAddress);
3.1.7解决单击超级时地址栏的同步问题:
利用CHtmlView类的事件处理函数,当网页下载完成,会触发OnDocumentComplete ()函数,该函数的参数就是所下载网页的URL,可以利用此函数对地址栏进行设置,添加以下代码。
①在MainFrm.h文件中,添加处理函数的声明。
public:void SetURL(LPCTSTR lpszURL);
②在MainFrm.cpp文件中,添加该函数的实现代码。
void CMainFrame::SetURL(LPCTSTR lpszURL)
{
m_wndDlgBar.GetDlgItem(IDC_EDIT_ADDRESS)->SetWindowText(lpszURL);
m_wndDlgBar.GetDlgItem(IDC_shortcutname)->SetWindowText(lpszURL);
}
③使用类向导添加事件处理函数。
用类向导为应用程序的CHtmlViewView类添加
OnDocumentComplete(LPCTSTR lpszURL)事件处理函数,并在myWeb16View.cpp文件中添加它的实现代码。
void CHtmlViewView::OnDocumentComplete(LPCTSTR lpszURL)
{
// 每次当前页面改变,更新地址栏的容和窗口的标题
((CMainFrame *)GetParentFrame())->SetURL(lpszURL);
GetDocument()->SetTitle(lpszURL);
CHtmlView::OnDocumentComplete(lpszURL);
}
3.2 收藏夹功能设计:
3.2.1.修改菜单:
在菜单中加入“收藏夹”栏。
3.2.2.创建“收藏夹”:
在主框架类的创建函数:OnCreate(LPCREATESTRUCT lpCreateStruct)实现代码中添加如下代码(与菜单中“收藏夹”子菜单相对应,同时与IE浏览器的注册表相连):
//生成“我的收藏夹”子菜单
TCHAR sz[MAX_PATH]; //260
TCHAR szPath[MAX_PATH]; //260
HKEY hKey;
DWORD dwSize;
CMenu* pMenu;
// 开始消去存在的菜单
pMenu = GetMenu()->GetSubMenu(4);
while(pMenu->DeleteMenu(0, MF_BYPOSITION));//0X00000400L
//从注册表中找到“我的收藏夹的位置”,然后读写注册表
if(RegOpenKey(HKEY_CURRENT_USER,
_T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders"), &hKey) != ERROR_SUCCESS)
{
TRACE0("Favorites folder not found\n");
return 0;
}
dwSize = sizeof(sz);
RegQueryValueEx(hKey, _T("Favorites"), NULL, NULL, (LPBYTE)sz, &dwSize);
ExpandEnvironmentStrings(sz, szPath, MAX_PATH);
RegCloseKey(hKey);
//添加我的收藏菜单项
BuildFavoritesMenu(szPath, 0, pMenu);
3.2.3.在主框架类CMainFrame中添加BuildFavoritesMenu()函数实现收藏夹的收藏功
能:
a.在MainFrm.h中声明int BuildFavoritesMenu(LPCTSTR pszPath, int nStartPos, CMenu
*pMenu)函数实现添加我的收藏菜单项;
b.在MainFrm.cpp中实现BuildFavoritesMenu()的功能,具体实现代码如下:
int CMainFrame::BuildFavoritesMenu(LPCTSTR pszPath, int nStartPos, CMenu *pMenu) {
CString strPath(pszPath);CString strPath2;CString str; WIN32_FIND_DATA wfd;
HANDLE h; int nPos; int nEndPos;
int nNewEndPos;
int nLastDir;
TCHAR buf[2048];
CStringArray astrFavorites;
CStringArray astrDirs;
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_ATT
RIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM))==0)
{
str = wfd.cFileName;
if(str.Right(4) == _T(".url"))
{
// an .URL file is formatted just like an .INI file, so we can
// use GetPrivateProfileString() to get the information we want
::GetPrivateProfileString(_T("InternetShortcut"),
_T("URL"),
_T(""), buf, 2048, strPath2 + str);
str = str.Left(str.GetLength() - 4);
// scan through the array and perform an insertion sort
// to make sure the menu ends up in alphabetic order
for(nPos = nStartPos ; nPos < nEndPos ; ++nPos)
{
if(pareNoCase(astrFavorites[nPos]) < 0)
break;
}
astrFavorites.InsertAt(nPos, str);
m_astrFavoriteURLs.InsertAt(nPos, buf);
++nEndPos;
}
}
} while(FindNextFile(h, &wfd));
FindClose(h);
// Now add these items to the menu
for(nPos = nStartPos ; nPos < nEndPos ; ++nPos)
{
pMenu->AppendMenu(MF_STRING | MF_ENABLED, 0xe00 + nPos, astrFavorites[nPos]);
}
// now that we've got all the .URL files, check the subdirectories for more nLastDir = 0;
h = FindFirstFile(strPath, &wfd);
ASSERT(h != INVALID_HANDLE_VALUE);
do
{
if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
// ignore the current and parent directory entries
if(lstrcmp(wfd.cFileName, _T(".")) == 0 || lstrcmp(wfd.cFileName, _T("..")) == 0)
continue;
for(nPos = 0 ; nPos < nLastDir ; ++nPos)
{
if(astrDirs[nPos].CompareNoCase(wfd.cFileName) > 0)
break;
}
pSubMenu = new CMenu;
pSubMenu->CreatePopupMenu();
// call this function recursively.
nNewEndPos = BuildFavoritesMenu(strPath2 + wfd.cFileName, nEndPos,
pSubMenu);
if(nNewEndPos != nEndPos)
{
// only intert a submenu if there are in fact .URL files in the subdirectory
nEndPos = nNewEndPos;
pMenu->InsertMenu(nPos, MF_BYPOSITION | MF_POPUP | MF_STRING,
(UINT)pSubMenu->m_hMenu, wfd.cFileName);
pSubMenu->Detach();
astrDirs.InsertAt(nPos, wfd.cFileName);
++nLastDir;
}
delete pSubMenu;
}
} while(FindNextFile(h, &wfd));
FindClose(h);
}
return nEndPos;
}
3.2.
4.在MainFrm.h中声明函数void OnFavorite(UINT nID)实现当在收藏夹中单击相
应的网址时,将该网址在浏览器中显示;
a.在MainFrm.cpp 中的消息映射表中添加ON_COMMAND_RANGE(0xe00, 0xfff, OnFavorite)消息
响应;
b.在MainFrm.cpp中实现OnFavorite(UINT nID)的功能,具体代码如下:
void CMainFrame::OnFavorite(UINT nID)
{
((CHtmlViewView*)GetActiveView())->Navigate2(m_astrFavoriteURLs[nID-0xe00], 0, NULL);
}
3.3.历史记录功能设计:
(1). 修改菜单,在菜单中加入“历史记录”栏,将ID号设为:ID_OLDLOGINS。
(2). 在HtmlViewView.h中添加历史记录处理函数afx_msg void OnOldlogins(),并在
HtmlViewView.cpp中实现该功能,代码如下:
void CHtmlViewView::OnOldlogins() //历史记录
{
((CMainFrame *)GetParentFrame())->HistoryScan();
}
(3).在CMainFrame类中添加函数HistoryScan()实现将最近登录网址添加到“历史记录”子菜单中。
具体代码如下:
int CMainFrame::HistoryScan()
{
char buffer[256];
//定义一个流式文件;
ifstream cfile("History.txt");
if (!cfile.is_open())
{
AfxMessageBox(_T("文件打开失败!"));
}
// 得到“历史记录”子菜单的句柄;
pMenu1 = GetMenu()->GetSubMenu(6);
while(pMenu1->DeleteMenu(0, MF_BYPOSITION));//0X00000400L
while(!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);
}
return 1;
}
(4).在CMainFrame类中添加函数HistoryScanSave(),实现将历史记录保存到History.txt文件
中;具体代码如下:
void CMainFrame::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();
}
else
AfxMessageBox(_T("文件打开失败!"));
}
(5). 在MainFrm.h中声明函数void OnHistory(UINT nID)实现当在历史记录菜单中单击相应的网
址时,将该网址在浏览器中显示;
a.在MainFrm.cpp 中的消息映射表中添加ON_COMMAND_RANGE(0x001, 0xdfe, OnHistory)消息
响应;
b.在MainFrm.cpp中实现OnHistory(UINT nID)的功能,具体代码如下:
void CMainFrame::OnHistory(UINT nID)
{
//当单击历史记录某一网址时,将该网址在浏览器中显示;
((CHtmlViewView*)GetActiveView())->Navigate2(m_astrHistoryURLs[nID-0x001],0, NULL);
}
(6). 在MainFrm.cpp中的SetURL()函数中添加代码实现将当前网址添加到历史记录菜单中,具体
代码如下:
//将地址栏的地址存起来,作为历史记录;
addr += lpszURL;
addr += "\r\n";
HistoryScanSave();
3.4 抓图工具的实现:
3.4.1 在以设计好的Web浏览器中的菜单栏里添加一个“屏幕截图”,下设一个截图功能。
3.4.2 为它添加消息响应函数
void CHtmlViewView::OnScreensnap()
{
// TODO: Add your command handler code here
//屏幕截图消息响应函数*******************
SetCapture(); //启动全屏捕捉
m_bStartSnapWindow = TRUE;
//m_Description.SetWindowText("正在进行抓图……");
ShowWindow(SW_MINIMIZE);
m_nTimerID = SetTimer(1,300,NULL);//启动定时器,开始抓取图像}
3.4.3 注册系统热键,用来抓图:
RegisterHotKey(GetSafeHwnd(),WM_SNAPHOTKEY,NULL,VK_F3); 3.4.4 在HtmlViewView类中添加函数 toClipboard 实现将指定窗口复制到系统剪
切板,当中用到了双缓冲技术:
void CHtmlViewView::toClipboard(CWnd *wnd, BOOL FullWnd) {
CDC *dc;
if(FullWnd){dc = new CWindowDC(wnd);//抓取整个窗口}
else{dc = new CClientDC(wnd);//抓取客户区域}
CDC memDC;
memDC.CreateCompatibleDC(dc);
CBitmap bm;
CRect r;
if(FullWnd){wnd->GetWindowRect(&r);}
else
wnd->GetClientRect(&r);
CString s;
wnd->GetWindowText(s);
CSize sz(r.Width(),r.Height());
bm.CreateCompatibleBitmap(dc,sz.cx,sz.cy);
CBitmap * oldbm = memDC.SelectObject(&bm);
memDC.BitBlt(0,0,sz.cx,sz.cy,dc,0,0,SRCCOPY);
//直接调用 OpenClipboard(),而不用
wnd->CetParent()->OpenClipboard();
wnd->OpenClipboard();
::EmptyClipboard();
::SetClipboardData(CF_BITMAP,bm.m_hObject);
CloseClipboard();
//回复原始环境
memDC.SelectObject(oldbm);
bm.Detach();
delete dc;
}
3.4.5在HtmlViewView类中添加函数CaptureWindowToClipboard 实现抓取图像到
系统剪切板:
bool CHtmlViewView::CaptureWindowToClipboard(HWNDhwndToCapture) {
bool bRet = FALSE;
//如果“hwndToCapture”是有效窗口的话,将其复制到系统剪切板中
if((hwndToCapture)&&(::IsWindow(hwndToCapture)))
{
bRet = TRUE;
toClipboard((CWnd *)CWnd::FromHandle(hwndToCapture),TRUE);
}
return bRet;
}
3.4.6在HtmlViewView类中添加函数HighlightFoundWindow 实现高度显示选中的
图像窗口:
long CHtmlViewView::HighlightFoundWindow(HWND hwndFoundWindow){ HDC hWindowDC = NULL;
HGDIOBJ hPrevPen = NULL;
HGDIOBJ hPrevBrush = NULL;
RECT rect;
long IRet = 0;
HPEN hRectanglePen = CreatePen(PS_SOLID,3,RGB(255,0,0));
::GetWindowRect(hwndFoundWindow,&rect);
//获取选中窗口的DC
hWindowDC = ::GetWindowDC(hwndFoundWindow);
if(hWindowDC){
//选取自定义的高亮矩形画笔
hPrevPen = SelectObject(hWindowDC,hRectanglePen);
//选取自定义的高亮画刷
hPrevBrush =
SelectObject(hWindowDC,GetStockObject(HOLLOW_BRUSH));
//再选中的图像窗口四周绘制高亮矩形
Rectangle(hWindowDC,0,0,rect.right-rect.left,rect.bottom-rect.
top);
//恢复原始画笔画刷
SelectObject(hWindowDC,hPrevPen);
SelectObject(hWindowDC,hPrevBrush);
//释放DC
::ReleaseDC(hwndFoundWindow,hWindowDC);
}//删除创建的矩形画笔
if(hRectanglePen){
DeleteObject(hRectanglePen);}
return IRet;
}
3.4.7在HtmlViewView类中添加函数RefreshWindow 实现刷新选中的图像窗口,
消除高度显示:
long CHtmlViewView::RefreshWindow(HWND hwndWindow){
long IRet = 0;
::InvalidateRect(hwndWindow,NULL,TRUE);
::UpdateWindow(hwndWindow);
::RedrawWindow(hwndWindow,NULL,NULL,RDW_FRAME|RDW_INVALIDATE|R
DW_UPDATENOW|RDW_ALLCHILDREN);
return IRet;
}
3.4.8 在HtmlViewView类中添加函数CheckWindowValidity 实现检验选中窗口的
有效性:
bool CHtmlViewView::CheckWindowValidity(HWND hwndToCheck){ HWND hwndTemp = NULL;
bool bRet = TRUE;
//不能为空
if(hwndToCheck == NULL){
bRet = FALSE; return bRet;
}
//必须是一个有效窗口
if(IsWindow(hwndToCheck) == FALSE){
bRet = FALSE; return bRet;
}
//确定他不是先前选中的窗口
if(hwndToCheck == m_hwndFoundWindow){
bRet = FALSE; return bRet;
}
//不能是程序主窗口
if(hwndToCheck == this->m_hWnd){
bRet = FALSE; return bRet;
}
//不能是程序中的子窗口
hwndTemp =::GetParent(hwndToCheck);
if(hwndTemp == this->m_hWnd){
bRet = FALSE; return bRet;
}
return bRet;
}
3.4.9 添加热键消息处理函数 OnHotKey,先在 .h文件的消息映射区手动添加一
个消息处理函数声明:
afx_msg LRESULT OnHotKey(WPARAM wParam,LPARAM IParam);如图:
3.4.10 然后添加消息函数实现:
3.4.11 在ClassWizard 中为 CScreenSnapDlag 添加OnTimer 事件处理函数,然
后添加实现。
void CHtmlViewView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if (m_bStartSnapWindow)//当正在抓取操作时
{
POINT CursorPoint;
HWND hwndFoundWindow = NULL;
GetCursorPos(&CursorPoint);
//从当前鼠标所在点位置获取器窗口句柄
hwndFoundWindow = ::WindowFromPoint(CursorPoint);
//检验选中窗口的有效性
if(CheckWindowValidity(hwndFoundWindow))
{
//如果先前有选中的窗口,则刷新它,以消除他的高亮显示
if(m_hwndFoundWindow)
{
RefreshWindow(m_hwndFoundWindow);
}
//得到选中窗口的句柄
m_hwndFoundWindow = hwndFoundWindow;
//高亮宣誓选中窗口
HighlightFoundWindow(m_hwndFoundWindow);
}
}
CHtmlView::OnTimer(nIDEvent);
}
3.4.12 对程序作最后的处理OnDestroy 函数实现:
void CHtmlViewView::OnDestroy() {
if(m_bStartSnapWindow) //当正在抓取操作时
{
ReleaseCapture(); //释放全屏捕捉
m_bStartSnapWindow = FALSE; //重置抓取操作为假
KillTimer(m_nTimerID); //消除抓取定时器操作
if(m_hwndFoundWindow) //如果已有选中窗口的话,则刷
新它
{
RefreshWindow(m_hwndFoundWindow);
}
}
RegisterHotKey(GetSafeHwnd(),WM_SNAPHOTKEY,NULL,VK_F3);
CHtmlView::OnDestroy();
// TODO: Add your message handler code here
}
3.5.删除功能设计:
3.5.1.添加“删除”菜单:在工作区中选择“ResourceView”选项卡,选择Menu,双击菜
单控件的名字(IDR_MAINFRAME),右边出现程序的菜单。
在菜单中加入“删除”栏,分
别添加“清空历史记录”、“清空收藏夹”、“删除文档历史记录”、“清除Cookies”、“清
除Internet临时文件”和“清除密码历史记录”6个菜单条目及其属性。
菜单名称ID号
清空历史记录ID_DelHistoryAddress
清空收藏夹ID_DELETEFAVORITE
删除文档历史记录ID_DelHistory
清除Cookie ID_DelCookies
清除Internet临时文件ID_DelIntenetTempFile
清除密码历史记录ID_DelHistoryPassword
3.5.2. 添加事件处理函数:
进入类向导,选择“Message Maps”选项卡。
在“Class Name”下拉列表框中选择CMyWeb16View
类,然后按照表2.4为上述删除的六个控件添加事件处理函数。
3.5.3. 函数实现:
(1)实现文档历史记录的清除
void CMyWeb16View::OnDelHistory() //清除文档历史记录
{
TCHAR szPath[MAX_PATH];
if(SHGetSpecialFolderPath(NULL,szPath,CSIDL_RECENT,FALSE))
{
EmptyDirectory(szPath);
}
SHDeleteKey(HKEY_CURRENT_USER,_T("Software\\Microsoft\\CurrentVersion\\Expl
orer\\RecentDocs"));
}
(2)清除Cookie
void CMyWeb16View::OnDelCookies() //清除Cookies
{
TCHAR szPath[MAX_PATH];
DeleteUrlCache(Cookie); //删除URL的Cache if (SHGetSpecialFolderPath(NULL,szPath,CSIDL_COOKIES,FALSE))
{
EmptyDirectory(szPath);
}
}
(3) 清除Internet的临时文件
void CMyWeb16View::OnDelIntenetTempFile() //清空Internet临时文件
{
TCHAR szPath[MAX_PATH];
DeleteUrlCache(File); //删除URL的Cache
if (SHGetSpecialFolderPath(NULL,szPath,CSIDL_INTERNET_CACHE,FALSE)) { //得到临时目录并清空它
EmptyDirectory(szPath);
}
}
(4)清空历史记录
void CMyWeb16View::OnDelHistoryAddress()
{
CMainFrame* pMainFrame = (CMainFrame*)GetActiveWindow();
pMainFrame->OndeleteHistory();;
}
(5)清除密码历史纪录
void CMyWeb16View::OnDelHistoryPassword()
{ //清除密码历史记录
SHDeleteKey(HKEY_CURRENT_USER,_T("Software\\Microsoft\\Internet
Explorer\\IntelliForms"));
}
(6)清空收藏夹:
void CHtmlViewView::OnDeletefavorite()
{
SHDeleteKey(HKEY_CURRENT_USER,_T("Software\\Microsoft\\Windows\\CurrentVersion\\ Explorer\\User Shell Folders"));
}
3.6.桌面快捷方式设计:
3.6.1. 添加按钮:修改对话框控件(IDR_MAINFRAME),添加按钮“创建快捷方式”与编辑框,编
辑框ID号为:IDC_shortcutname;按钮ID号为:IDC_SHORTCUT,对应函数为:OnShortcut();
3.6.2. 实现代码:
void CMainFrame::OnShortcut()
{
CString pp; //获得用户在地址栏中输入的URL
m_wndDlgBar.GetDlgItem(IDC_EDIT_ADDRESS)->GetWindowText(pp);
CString pp1; //获得用户在地址栏中输入的URL
m_wndDlgBar.GetDlgItem(IDC_shortcutname)->GetWindowText(pp1);
IShellLink *MyLink;//IShellLink 接口指针
IPersistFile *ppf; //另一个接口指针
char DesktopLocate[MAX_PATH];//存储快捷方式在桌面保存的位置
//桌面的位置
SHGetSpecialFolderPath(NULL,DesktopLocate,CSIDL_DESKTOP,0);
//以下设定快捷方式在桌面保存位置
strcat(DesktopLocate,"\\");
strcat(DesktopLocate,pp1);
strcat(DesktopLocate,".LNK");
CoInitialize(NULL);//初始化COM
int re=CoCreateInstance(CLSID_ShellLink,NULL,CLSCTX_ALL,
IID_IShellLink,(void **)&MyLink);
if(re<0)
{
AfxMessageBox("创建COM对象失败!");
return;
}
MyLink->SetPath(pp); //设置快捷方式实际文件位置
MyLink->SetDescription(pp1);//设置快捷方式描述(即名称)
re=MyLink->QueryInterface(IID_IPersistFile, (void **)&ppf);
if(re<0)
{
AfxMessageBox("无法创建快捷方式!");
MyLink->Release();
return;
}
WCHAR wsz[MAX_PATH];
MultiByteToWideChar( CP_ACP,0,DesktopLocate,-1,wsz,MAX_PATH);//转换为
unicode
ppf->Save(wsz,true);//在桌面创建快捷方式
ppf->Release();
MyLink->Release();
AfxMessageBox("快捷方式创建成功!");
}
4、系统运行4.1 系统使用说明
4.1.1 web浏览器起始界面:
4.4.2收藏夹功能设计结果
a.添加收藏夹:
b.收藏夹容显示:
4.4.3 .历史记录功能设计结果:
4.4.5 快捷方式设计结果:
4.4.5 抓图工具设计结果:
a.点击抓图按钮:
b.自动获取选择窗口:
b.所抓取图片显示:
5、设计总结
这次课程设计的题目是WEB浏览器的设计,是一个与我们的生活很切近的实例。
在这次课程设计的过程中使我们小组从中学到了不少知识同时也使我们学到了一些做人方面的道理。
总之,通过这次实验使我们受益匪浅。
参考文献
[1]汪翔,袁辉.Visual C++实践与提高—网络编程篇 [M].北京:中国铁道,2001.318-322
[2]坚,伟等. Visual C++网络高级编程 [M].北京:人民邮电,2001.254-272
[3]汪晓平,韬. Visual C++6.0开发网络典型应用实例导航[M]. 北京:人民邮电,2005.234-299
[4]黄维通,瑞霞. Visual C++程序设计教程[M]. 北京:机械工业,2001.7
[5]胡志坤. Visual C++通信编程工程实例精解[M]. 北京:机械工业,2007.68-69
[6]四维科技,曹衍龙,海英. VC++网络通信编程实用案例精选. 人民邮电,2006.5
[7]叶树华.《网络编程实用教程》第2版.北京人民邮电.2010
[8]曹衍龙海英.《Visual C++网络通信编程实用案例精选》.北京人民邮电.2006。