2022年我的Web浏览器设计宣贯 .pdf
1 计 算 机 网 络 课 程 设 计题目 :Web 浏览器设计成员姓名:班级:指导教师:日期: 20012 年 6 月名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 30 页 - - - - - - - - - 2 目录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 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 30 页 - - - - - - - - - 3 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程序开发软件;名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 30 页 - - - - - - - - - 4 2、概要设计2.1 基本设计概念利用已有的 HTTP 控制、 HTML 解释器和 HTML 执行器,通过 MFC 提供的 CHtmlView类实现的一个 Windows下的多功能的浏览器。该浏览器的功能包括: WEB 站点浏览、本地和网络的文件系统的浏览、前进、后退、返回主页、刷新、搜索、历史记录的维护、IE 收藏夹功能和设置桌面快捷方式功能等。22 软件设计层次图2.2.1 系统流程图:当用户登录此简易浏览器时,需要在地址栏输入需要搜索的内容的网址,当输入网址后,该浏览器会链接到相应的URL 地址,实现页面的下载,并显示页面,从而实现该简易浏览器连接网络的功能。输入网址下载页面显示页面返回前进名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 30 页 - - - - - - - - - 5 2.2.2 功能结构图:该程序的设计主要分5 部分。首先是登录界面的实现,其中要创建按钮,创建菜单栏及下拉菜单的实现; 第二部分要实现各按钮的具体的功能包括在其中设置监听器,实现对按钮动作的监听及响应;第三部分用于对地址栏输入内容格式的设定包括如何处理异常等;第四部分实现页面的下载;第五部分用于实现页面的显示。具体的功能结构图如下:登录界面实现功能按钮实现URL 连接实现下载链接页面显示链接页面web 浏览器名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 30 页 - - - - - - - - - 6 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 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 30 页 - - - - - - - - - 7 停止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( );/搜索;名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 30 页 - - - - - - - - - 8 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); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 30 页 - - - - - - - - - 9 在 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); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 30 页 - - - - - - - - - 10 3.2 收藏夹功能设计:3.2.1. 修改菜单:在菜单中加入“收藏夹”栏。3.2.2. 创建“收藏夹”:在主框架类的创建函数: OnCreate(LPCREATESTRUCT lpCreateStruct)实现代码中添加如下代码 (与菜单中“收藏夹”子菜单相对应,同时与IE 浏览器的注册表相连):/生成“我的收藏夹”子菜单TCHAR szMAX_PATH; /260 TCHAR szPathMAX_PATH; /260 HKEYhKey; DWORD dwSize; CMenu* pMenu; / 开始消去存在的菜单pMenu = GetMenu()-GetSubMenu(4); while(pMenu-DeleteMenu(0, MF_BYPOSITION);/0X00000400L /从注册表中找到“我的收藏夹的位置”,然后读写注册表if(RegOpenKey(HKEY_CURRENT_USER, _T(SoftwareMicrosoftWindowsCurrentVersionExplorerUser Shell Folders), &hKey) != ERROR_SUCCESS) TRACE0(Favorites folder not foundn); return 0; dwSize = sizeof(sz); RegQueryValueEx(hKey, _T(Favorites), NULL, NULL, (LPBYTE)sz, &dwSize); ExpandEnvironmentStrings(sz, szPath, MAX_PA TH); RegCloseKey(hKey); /添加我的收藏菜单项BuildFavoritesMenu(szPath, 0, pMenu); 3.2.3. 在主框架类CMainFrame中添加 BuildFavoritesMenu()函数实现收藏夹的收藏功名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 30 页 - - - - - - - - - 11 能: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_DA TA wfd; HANDLE h; int nPos; int nEndPos; int nNewEndPos; int nLastDir; TCHAR buf2048; CStringArray astrFavorites; CStringArray astrDirs; CMenu* pSubMenu; / 确定有 字符if(strPathstrPath.GetLength() - 1 != _T() strPath += _T(); strPath2 = strPath; strPath += *.*; / 首先扫描.URL 然后扫描子目录h = FindFirstFile(strPath, &wfd); if(h != INV ALID_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 .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) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 30 页 - - - - - - - - - 12 if(str.CompareNoCase(astrFavoritesnPos) 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 AppendMenu(MF_STRING | MF_ENABLED, 0 xe00 + nPos, astrFavoritesnPos); / now that weve got all the .URL files, check the subdirectories for more nLastDir = 0; h = FindFirstFile(strPath, &wfd); ASSERT(h != INV ALID_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 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; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 30 页 - - - - - - - - - 13 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(0 xe00, 0 xfff, OnFavorite) 消息响应;b.在 MainFrm.cpp 中实现 OnFavorite(UINT nID) 的功能,具体代码如下:void CMainFrame:OnFavorite(UINT nID) (CHtmlViewView*)GetActiveView()-Navigate2(m_astrFavoriteURLsnID-0 xe00, 0, NULL); 3.3. 历史记录功能设计:(1). 修改菜单,在菜单中加入“历史记录”栏,将ID 号设为: ID_OLDLOGINS 。(2). 在 HtmlViewView.h中添加历史记录处理函数afx_msg void OnOldlogins(),并在HtmlView View.cpp 中实现该功能,代码如下:void CHtmlViewView:OnOldlogins() /历史记录 (CMainFrame *)GetParentFrame()-HistoryScan(); (3).在 CMainFrame 类中添加函数HistoryScan() 实现将最近登录网址添加到“历史记录”子菜单中。具体代码如下:int CMainFrame:HistoryScan() char buffer256; /定义一个流式文件;ifstream cfile(History.txt); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 30 页 - - - - - - - - - 14 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, 0 x001+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(0 x001, 0 xdfe, OnHistory)消息响应;b.在 MainFrm.cpp 中实现 OnHistory(UINT nID)的功能,具体代码如下:void CMainFrame:OnHistory(UINT nID) /当单击历史记录内某一网址时,将该网址在浏览器中显示;名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 30 页 - - - - - - - - - 15 (CHtmlViewView*)GetActiveView()-Navigate2(m_astrHistoryURLsnID-0 x001,0, NULL); (6). 在 MainFrm.cpp 中的 SetURL()函数中添加代码实现将当前网址添加到历史记录菜单中,具体代码如下:/将地址栏内的地址存起来,作为历史记录;addr += lpszURL; addr += rn; 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);/启动定时器,开始抓取图像 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 30 页 - - - - - - - - - 16 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);/抓取整个窗口 elsedc = 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”是有效窗口的话,将其复制到系统剪切板中名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 30 页 - - - - - - - - - 17 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) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 17 页,共 30 页 - - - - - - - - - 18 long IRet = 0; :InvalidateRect(hwndWindow,NULL,TRUE); :UpdateWindow(hwndWindow); :RedrawWindow(hwndWindow,NULL,NULL,RDW_FRAME|RDW_INVALIDATE|RDW_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);如图:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 18 页,共 30 页 - - - - - - - - - 19 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(&