软件实验的测试,用VC做一个浏览器,话说学了一个月VC,MFC还是晕晕的,把控件拖来脱去,让人感觉编程变得虚无缥缈。照着教程步骤很容易实现,不过要是没了教程,估计寸步难行。
下面是这次测试,网上有很多教程,我再来润色一下下…
MFC实现简单浏览器
题目:
测试题4、设计一个浏览器,实现Web浏览功能。设计思想:MFC提供了一个CHtmlView类,它派生自文档/视图结构,实现了Web浏览功能。其中,最重要的方法就是Navigate函数,通过给它指定参数就可以浏览指定的Web页。
一、 背景资料
1、实验背景
网页浏览器是互联网时代必不可少的工具,是人们获取网络信息的主要工具。本实验利用VC,实现一个可以浏览网页的简单浏览器。
2、实验资料
关于CHtmlView类
在标准框架应用中(基于SDI或MDI),视图对象通常由指定的系列的类派生。这些类都由CView派生,提供高于CView提供的指定功能。
基于CHtmlView的应用视图类用WebBrowser控件提供视图。这使此应用成为一个网络浏览器。创建网络浏览器的更好方法是使用MFC AppWizard,并将CHtmlView指定为视图类。CHtmlView的功能是为访问网络(和/或HTML文件)的应用而设计的。下列CHtmlView成员函数只适用于Internet Explorer应用。这些函数可以替代WebBrowser控件,但它们无可见的效果。
GetAddressBar
·GetFullName
·GetStatusBar
·SetAddressBar
·SetFullScreen
·SetMenuBar
·SetStatusBar
·SetToolBar
CHtmlView 类的成员函数
获取和设置属性(Attributes)的成员函数
(1)CString GetType( ) const;
(2)long GetLeft( ) const;
void SetLeft( long nNewValue );
(3)long GetTop( ) const;
void SetTop( long nNewValue );
(4)long GetHeight( ) const;
void SetHeight( long nNewValue );
(5)BOOL GetVisible( ) const;
void SetVisible( BOOL bNewValue );
void GoBack( ); 导航到历史列表的前一个条目
void GoForward( ); 导航到历史列表的下一个条目。
void GoHome( ); 导航到主页,该主页在IE的属性中设置。
void GoSearch( ); 导航到当前搜索页。该页在IE的属性中设置。
void Refresh( );重新装入浏览器当前正在显示的URL或者文件,即刷新。
void Stop( ); 撤销任何未完成的导航或下载,并且停止任何动态的页面元素,例如背景音乐和动画。
Navigate 导航到由URL指定的资源。
Navigate2 导航到由URL指定的资源或者由全路径指定的文件。
PutProperty 设置与所给定的对象相关的属性的当前值。
GetProperty 返回与所给定的对象相关的属性的当前值。
ExecWB 执行一个命令。
LoadFromResource 在WebBrowser控件中装入一个资源。
二、 功能设计
1、 在地址栏输入URL,转到该URL。
2、 地址栏要实时显示正在浏览网页的URL。
3、 该浏览器可以实现前进、后退、刷新、停止、转到主页、搜索功能。
三、 实现步骤
利用MFC AppWizard生成应用程序框架。工程名为 MyExplorer,类型为单文本(SDI),向导第二、第三步保持默认,第四部选择Internet Explorer ReBars工具栏的风格,这样会有地址栏。第五步默认;第六步,选择CHtmlView类作为视图类的基类
1、 界面设计
A. 为要实现的功能设计菜单。
Resource View ->Menu下设置
按照下表添加菜单:
菜单条目名称(Caption) | ID号 |
前进 | ID_FOWARD |
后退 | ID_BACK |
停止 | ID_STOP |
刷新 | ID_UPDATE |
主页 | ID_HOMEPAGE |
搜索 | ID_SEARCH |
B. 添加工具栏图标,ID号同上表。
Resource View ->ToolBar下设置。
C. 在Resource View ->Dialog中给对话框IDR_MAINFRAME添加一个Caption 为“地址”静态文本,再添加一个文本编辑框控件,ID号是IDC_URL,作为地址栏,提供给用户输入要浏览的网站地址。
2、 功能实现
A. 实现 前进、后退、刷新、停止、转到主页等功能
利用类向导,添加以上功能的消息处理函数如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
//前进到一个网页 void CMyExplorerView::OnFoward() { GoForward(); } //后退到一个网页 void CMyExplorerView::OnBack() { GoBack(); } //停止加载网页 void CMyExplorerView::OnStop() { Stop(); } //刷新网页 void CMyExplorerView::OnUpdate() { Refresh(); } //转到主页 void CMyExplorerView::OnHomepage() { GoHome(); } //进行搜索 void CMyExplorerView::OnSearch() { GoSearch(); } |
B. 实现URL定位功能
用户在文本框中按下回车键后,会有一个IDOK的消息发送到主框架类,可以添加处理这个消息的控制函数,在该函数中,用指定的网址调用Navigate()或者Navigate2()函数,就可以实现对该网页的浏览。
在MainFrm.h文件中,添加消息处理函数的声明:
1 2 |
public: void OnNew(); |
在MainFrm.cpp文件中,添加该函数的实现代码:
1 2 3 4 5 6 7 |
//URL定位 void CMainFrame::OnNew() { CString site_url; //用户在地址栏中输入的URL m_wndDlgBar.GetDlgItem(IDC_URL)->GetWindowText(site_url); //浏览指定的网页 ((CMyExplorerView*)GetActiveView())->Navigate(site_url); } |
在Mainfrm.cpp文件中,在消息映射端中添加自己的消息映射的宏。
1 2 3 4 5 6 7 8 |
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) //{{AFX_MSG_MAP(CMainFrame) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code ! ON_WM_CREATE() //}}AFX_MSG_MAP ON_COMMAND(IDOK, OnNew) //自己的消息映射宏 END_MESSAGE_MAP() |
在myWebView.h文件的类定义前面添加包含语句
1 |
#include "MyExplorerDoc.h" |
C. 实现点击超链接时地址栏的同步
.在MainFrm.h文件中,添加处理函数的声明
1 2 3 |
public: void OnNew(); //输入URL浏览指定页 void SetPage(LPCTSTR lpszURL); //同步地址栏 |
在MainFrm.cpp文件中,添加该函数的实现代码:
1 2 3 4 5 |
//同步地址栏 void CMainFrame::SetPage(LPCTSTR lpszURL) { m_wndDlgBar.GetDlgItem(IDC_URL)->SetWindowText(lpszURL); } |
用类向导为应用程序CMyExplorerView类添加OnDocumentComplete()事件处理函数
1 2 3 4 5 6 |
//同步地址栏 void CMyExplorerView::OnDocumentComplete(LPCTSTR lpszURL) { ((CMainFrame*)GetParentFrame())->SetPage(lpszURL); CHtmlView::OnDocumentComplete(lpszURL); } |
在MainFrm.cpp文件前面添加包含语句
1 |
#include "MyExplorerView.h" |
在myWebView.cpp文件前面添加包含语句
1 |
#include"MainFrm.h" |
3、 细节改进
为地址栏添加“Go”按钮,输入URL之后不仅可以回车浏览,还可以点击“Go”按钮浏览网页。
如上图,在Resource View -> Dialog下,为IDR_MAINFRAME在地址栏右侧添加一个按钮,Caption为 “Go”,ID为IDC_GO。
在MainFrm.cpp中,添加Go按钮的消息映射宏,添加完成后代码如下:
1 2 3 4 5 6 7 8 9 |
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) //{{AFX_MSG_MAP(CMainFrame) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code ! ON_WM_CREATE() //}}AFX_MSG_MAP ON_COMMAND(IDOK, OnNew) //自己的消息映射宏 ON_COMMAND(IDC_GO,OnNew) //Go按钮的消息映射宏 END_MESSAGE_MAP() |
四、 运行测试
1、URL测试
2、 地址栏同步测试
3、 本地html文件测试
4、 搜索
5、 主页
发表回复