梅芳-网络编程实用教程-第8章.ppt

上传人:牧羊曲112 文档编号:6052152 上传时间:2023-09-18 格式:PPT 页数:67 大小:477.50KB
返回 下载 相关 举报
梅芳-网络编程实用教程-第8章.ppt_第1页
第1页 / 共67页
梅芳-网络编程实用教程-第8章.ppt_第2页
第2页 / 共67页
梅芳-网络编程实用教程-第8章.ppt_第3页
第3页 / 共67页
梅芳-网络编程实用教程-第8章.ppt_第4页
第4页 / 共67页
梅芳-网络编程实用教程-第8章.ppt_第5页
第5页 / 共67页
点击查看更多>>
资源描述

《梅芳-网络编程实用教程-第8章.ppt》由会员分享,可在线阅读,更多相关《梅芳-网络编程实用教程-第8章.ppt(67页珍藏版)》请在三一办公上搜索。

1、第8章 HTTP协议及高级编程 简要介绍HTTP协议。介绍MFC中的CHtmlView类。使用CHtmlView类,创建一个Web浏览器型的应用程序。,8.1 HTTP协议 HTTP是超文本传输协议(Hypertext Transfer Protocol)的简称,HTTP协议也是基于TCP/IP的客户/服务器协议。1990年,在万维网应用的开发中,为了解决HTML文档在网上的传输问题,诞生了HTTP协议。至今已有了三个版本,HTTP0.9,HTTP1.0以及HTTP1.1。为了适应下一代的因特网,还出现了HTTPng。事实证明,HTTP比以前的任何一种协议都简单有效,能将信息很好地组织起来,让

2、人们方便地、直接地从Internet上检索和获取所需的信息。,8.1.1 HTTP的基本概念 RFC2068是HTTP1.1的最新的详细描述,本节介绍HTTP的基本概念。,图8.1 HTTP的会话过程,HTTP的会话周期由连接、请求、响应和断开4个阶段组成:(1)建立TCP/IP连接(TCP/IP connection)(2)Web客户向服务器发送HTTP请求(HTTP request)(3)服务器向客户回送HTTP响应(HTTP response)(4)断开TCP/IP连接(disconnection),HTTP协议就是规定了Web客户和服务器之间的信息交换规程,以及HTTP请求和HTTP响

3、应消息的内容和格式。HTTP协议应在Web浏览器和Web服务器中实现。换句话说,Web浏览器和Web服务器应按照HTTP协议交换信息。,8.1.2 HTTP协议的应用 HTTP协议对编程有什么用?能够实现什么样实用的程序?这些问题使我们不得不回到HTTP的本质。超文本传输协议,主要是用于传输文件的协议。虽然RFC2068对HTTP协议描述早就超出了文件传输的范围。但是传输文件的作用还是最主要的。在这里我们提出几个问题,这些问题都可以使用HTTP协议编程实现。比如:,基于HTTP的文件断点续传的程序使用代理服务器下载的程序 Web服务器程序能够通过身份认证而下载文件的程序 接受浏览器网页上载文件

4、的程序 这些功能的实现都要求用户对HTTP比较了解。,8.2 利用CHtmlView类创建Web浏览器型的应用程序8.2.1 CHtmlView类与WebBrowser控件 CHtmlView类在afxhtml.h包含文件中定义,是从CView派生的,如图8.2所示。在标准的MFC框架应用程序中,无论是基于SDI或MDI的,所有从CView派生的类,都提供了由CView提供的功能。,图8.2 CHtmlView类的继承关系,CHtmlView类的主要功能是访问Web网站和HTML文档。这是由于CHtmlView类在MFC的文档/视图结构(MFCs document/view architect

5、ure)环境中,进一步提供了WebBrowser控件的功能,可以说CHtmlView类是对WebBrowser控件的封装。WebBrowser控件支持通过超链接和统一资源定位器URL导航的Web浏览。CHtmlView提供的WebBrowser 使得应用程序成了一个Web浏览器(web browser)。要创建一个Web浏览器型的应用程序,可以使用CHtmlView类。通过MFC应用程序向导实现。,8.2.2 CHtmlView 类的成员函数1获取和设置属性(Attributes)的成员函数(1)CString GetType()const;返回浏览器包含的文档类型名字符串(2)long Ge

6、tLeft()const;返回浏览器左边界据屏幕左边缘的象素值 void SetLeft(long nNewValue);设置浏览器左边界的象素值(3)long GetTop()const;返回浏览器上边界据屏幕上边缘的象素值 void SetTop(long nNewValue);设置浏览器上边界的象素值,(4)long GetHeight()const;返回浏览器高度的象素值 void SetHeight(long nNewValue);设置IE窗口的象素值(5)BOOL GetVisible()const;获取对象是否可见,0表示隐藏,非0可见 void SetVisible(BOOL

7、bNewValue);设置对象是否可见(6)BOOL GetOffline()const;返回浏览器的操作是离线还是在线 void SetOffline(BOOL bNewValue);设置浏览器的离线或在线的操作方式,(7)CString GetLocationName()const;返回浏览器中显示的资源的名字(8)BOOL GetSilent()const;获取在浏览器中是否显示对话框,返回0表示显示 void SetSilent(BOOL bNewValue);设置在浏览器中是否显示对话框,默认为0(9)BOOL GetTopLevelContainer()const;获当前取对象是否

8、为顶级容器,非0为顶级 BOOL GetLocationURL()const;获取当前浏览器中的资源的URL串 其它的函数就不一一列举了,2主要的操作(Operations)成员函数这些成员函数非常有用,常常用在应用程序中。void GoBack();导航到历史列表的前一个条目(previous item)。void GoForward();导航到历史列表的下一个条目。void GoHome();导航到主页,该主页在IE的属性中设置。void GoSearch();导航到当前搜索页。该页在IE的属性中设置。void Refresh();重新装入浏览器当前正在显示的URL或者文件,即刷新。voi

9、d Stop();撤销任何未完成的导航或下载,并且停止任何动态的页面元素,例如背景音乐和动画。,Navigate 导航到由URL指定的资源。Navigate2 导航到由URL指定的资源或者由全路径指定的文件。PutProperty 设置与所给定的对象相关属性的当前值GetProperty 返回与所给定的对象相关属性的当前值ExecWB 执行一个命令。LoadFromResource 在WebBrowser控件中装入一个资源。后面的六个函数的调用格式比较复杂,下面分别叙述,(1)第一种格式的导航函数调用这个成员函数,导航到由URL指定的资源,或者由一个完全的路径指定的文件。void Naviga

10、te(LPCTSTR URL,DWORD dwFlags=0,LPCTSTR lpszTargetFrameName=NULL,LPCTSTR lpszHeaders=NULL,LPVOID lpvPostData=NULL,DWORD dwPostDataLen=0);,(2)第二种格式的导航函数Navigate2 导航到由URL指定的资源,或者由一个完全的路径指定的文件。函数通过支持特定文件夹的浏览,诸如,Desktop 和 My Computer,扩展了Navigate成员函数的功能,它们由参数pIDL指定。函数有三种重载的形式,参数有所不同。void Navigate2(LPITEMI

11、DLIST pIDL,DWORD dwFlags=0,LPCTSTR lpszTargetFrameName=NULL);,void Navigate2(LPCTSTR lpszURL,DWORD dwFlags=0,LPCTSTR lpszTargetFrameName=NULL,LPCTSTR lpszHeaders=NULL,LPVOID lpvPostData=NULL,DWORD dwPostDataLen=0);,void Navigate2(LPCTSTR lpszURL,DWORD dwFlags,CByteArray,(3)设置属性的成员函数设置一个给定对象相关的属性。有多种

12、重载的形式,参数不同。void PutProperty(LPCTSTR lpszProperty,const VARIANT,(4)获得属性得到与控件相关的属性值,有两种重载的形式。BOOL GetProperty(LPCTSTR lpszProperty,CString 前者返回非零,表示成功完成,否则返回0,后者返回COleVariant对象。,(5)执行命令ExecWB 调用这个成员函数来在浏览器控件中或IE中执行一个命令。void ExecWB(OLECMDID cmdID,OLECMDEXECOPT cmdexecopt,VARIANT*pvaIn,VARIANT*pvaOut);,

13、(6)装入资源 调用此成员函数来将指定的资源装入浏览器控件,有两种形式。BOOL LoadFromResource(LPCTSTR lpszResource);BOOL LoadFromResource(UINT nRes);,3事件(Events)处理函数 为了利用Windows的消息驱动机制,CHtmlView 类定义了许多可重载的事件处理函数,当一定的事件发生时,MFC框架会自动调用相应的事件处理函数。用户可以重载这些函数,添加自己的代码,实现应用程序特定的功能。下面列举了一些,详细的资料可查阅MSDN文档。OnNavigateComplete2 对于一个窗口或显示框架,完成到一个超链接

14、的导航后,调用此函数 OnBeforeNavigate2 对于一个窗口或显示框架,在给定的Web浏览器中,一个导航出现之前,调用此函数,virtual void OnStatusTextChange(LPCTSTR lpszText);当与WebBrowser 控件相关的状态栏的文本改变时,调用此函数,参数lpszText包含新的状态栏文本的字符串。virtual void OnVisible(BOOL bVisible);当WebBrowser 的窗口应当被显示或隐藏时,框架调用此函数,bVisible表示了窗口的状态,:如果为非零,对象可见;为零,对象不可见。,virtual void O

15、nToolBar(BOOL bToolBar);当 ToolBar 属性已经改变时,调用此函数,bToolBar为非零,IE的工具栏是可见的;否则相反。virtual void OnMenuBar(BOOL bMenuBar);当 MenuBar 属性已改变时,调用此函数。bMenuBar为非零,菜单栏可见;否则相反。,8.2.3 创建一个Web浏览器型的应用程序的一般步骤1利用MFC AppWizard创建SDI或MDI应用程序 前几章创建的都是基于对话框的程序,Web浏览器型的应用程序一般是单文档或多文档的程序。利用MFC应用程序向导创建SDI或MDI应用程序需要经过6步,你可以回到前一步

16、或进到后一步来改变你已经选择过的选项。在每一步,对每一个选项都可以得到帮助,右击控件,可以得到关于每个选项控件的信息。,在VC+集成开发环境中点菜单File/New.,出现新工程对话框,如图8.3。,图8.3 创建新工程的对话框,选择MFC AppWizard.exe类型的工程,输入工程的名字,决定工程文件存放的位置,然后点击OK按钮,出现第一步对话框。如图8.4。(1)第一步:选择应用程序结构,图8.4 第一步:选择应用程序结构,为应用程序选择三种结构之一,单文档(Single Document SDI),多文档(Multiple Document MDI),基于对话框(Dialog Bas

17、ed)。Web浏览器型的应用程序一般选择SDI类型,以下的操作都假定选择了SDI类型。决定应用程序是否要支持MFC的文档/视图结构(document/view architecture),实际你必须选择支持,因为不支持文档/视图结构的应用程序不能打开磁盘文件和从CWnd类继承的窗口区,并且后面的步骤都是无效的。选择资源中的文本所使用的语言,应选择“中文中国”。,作完这三件事以后,点击Next按钮,出现第二步对话框。如图8.5。(2)第二步:选择应用程序支持的数据库,图8.5 第二步:选择应用程序支持的数据库,为程序选择一种数据库支持,有四个选项。没有(None),头文件支持(Header fi

18、le support),带有文件支持的数据库视图(Database View with file support)或没有文件支持的数据库视图(Database View without file support)。如果选择了数据库支持,点击数据源(Data Source),在外部ODBC数据库、DAO数据库和OLE DB数据库中选择一个,然后选择相应的数据源和数据库表选项。点击Next按钮,出现第三步对话框,如图8.6。,(3)第三步:选择应用程序支持的复合文档,图8.6 选择应用程序支持的复合文档,选择应用程序支持的复合文档(compound document)类型。有五个选项:None:不

19、支持复合文档Container:容器,一个OLE 2.0风格的文档容器。Mini-server:最小服务器,一个OLE服务器,但不能作为一个独立的程序来运行。Full-server:完全服务器,一个OLE服务器,可以作为独立程序运行。Both container and server:容器和服务器两者。也可以选择选项来启用标准的ActiveX资源,增加额外的自动命令到应用程序的菜单条中。点击Next按钮,出现第四步对话框,如图8.7。,(4)第四步:选择应用程序的接口特性,图8.7 第四步:选择应用程序的接口特性,为程序选择基本的用户接口特性。如快捷的工具条、初始状态栏、打印和打印预览、内容敏

20、感的帮助、3D控件、Windows套接字等,都是复选框。要使用的工具条形式,IE4.0 ReBars或者MFC常规的工具条。最近打开的文件列表数目,默认值是4。如果想要修改程序的名字和扩展名,或者为你的程序调整用户接口窗口框架风格,点击Advanced。如图8.8。,图8.8 设置工程的高级属性,点击Next,出现第五步对话框。如图8.9所示。(5)第5步:决定三个问题,图8.9 第5步:决定三个问题,选择工程风格:Windows Explorer:左边是一个树形视图,右边是一个列表视图。MFC Standard:为文件视图提供一个区域。选择是否希望应用程序向导在源文件中产生注释,以便指导你编

21、写程序。选择使用MFC库的选项 As a shared DLL:库作为共享的DLLAs a statically linked library:库作为静态链节的DLL注意,静态链接到MFC的库仅仅在VC+的专业版和企业版中支持(Professional and Enterprise Editions)。,点击Next,出现MFC AppWizard Step 6 of 6对话框。如图8.10。(6)第6步:决定类名和基类,图8.10 第6步:决定类名和基类,如果想要改变默认的由应用程序向导提供的类名,基类,头文件,或者实现文件的名字,输入新的名字,要改变基类,选择你的程序的视图类。点击Fini

22、sh按钮,出现New Project Information对话框。如图8.11。说明了应用程序的类型,创建的类、应用程序的特性和工程的目录。点击OK按钮,工程创建成功,进入VC+集成的开发环境。,图8.11 新工程的信息,2创建一个Web浏览器型的应用程序使用MFC AppWizard可以创建一个Web浏览器型的应用程序。遵照使用MFC应用程序向导创建SDI或MDI的.exe程序的六个步骤。应用程序必须是基于 MFC 的文档/视图结构的,要注意的是,在第六步,使用Base class下拉列表框,必须选择CHtmlView类作为视图类的基类。其他步骤根据应用程序的需要来决定,大部分使用默认值就

23、可以了。CHtmlView类扮演一个Web浏览器控件的封装器,给你的应用程序一个视图来显示Web或HTML页面。向导在该视图类中对OnInitialUpdate函数创建了一个重载。,providing a navigational link to the Microsoft Visual C+Web site:void CWebView:OnInitialUpdate()CHtmlView:OnInitialUpdate();/TODO:This code navigates to a popular spot on the web./change the code to go where y

24、oud like.Navigate2(_T(http:/,可以用一个自己的站点代替Navigate2函数中的站点,或者使用LoadFromResource函数,来打开一个HTML页面,它在工程的资源脚本内,作为默认的要观察的内容,例如:void CWebView:OnInitialUpdate()CHtmlView:OnInitialUpdate();/TODO:This code navigates to a popular spot on the web./change the code to go where youd like.LoadFromResource(IDR_HTML1);,

25、需要说明,当你使用MFC应用程序向导创建程序时,如果在第一步为应用程序选择的结构是基于对话框的,则后面的步骤与前面介绍的6个步骤不太一样,只需要4步就够了。(1)为基于对话框的程序完成第1步为应用程序选择三种结构之一,这里选择基于对话框(Dialog Based)。决定应用程序是否要支持MFC的文档/视图结构(document/view architecture),你必须选择支持。为文本选择一种语言,然后点击Next(2)为基于对话框的程序完成第2步为程序选择基本的用户界面特性和套接字支持。点击Next。,(3)为基于对话框的程序完成第3步如果需要源文件中的注释,它会提示需要在哪里添加你自己的

26、代码。选择想要如何使用MFC库,作为共享的DLL。还是静态链接的DLL。(4)为基于对话框的程序完成第4步如果想要改变应用程序向导提供的默认的类名,头文件名或实现文件名,输入新的名字。点击Finish。,8.3 Web浏览器应用程序实例8.3.1 程序实现的目标 使用CHtmlView类来实现一个应用程序,使之具有Web浏览器的功能,包括浏览网页、前进、后退、返回主页和搜索功能。通过实例,重点掌握利用CHtmlView类开发Web客户端程序的方法。实现的程序界面如图8.12。,图8.12 myWeb应用程序的界面,8.3.2 创建实例程序1利用MFC AppWizard生成应用程序框架 工程名

27、为myWeb,第一步,工程类型为单文档(SDI),中文语言支持。第二步和第三步使用默认值,不需要数据库,也不提供对于复合对象的支持。第四步选择Internet Explorer ReBars工具栏的风格,这样就有了用来输入网址的文本框。第五步不作任何修改,第六步应选择CHtmlView类作为视图类的基类。生成的工程框架包含四个类:,应用程序类,CMyWebApp,对应myWeb.h和myWeb.cpp文件。框架类,CMainFrame,对应MainFrm.h和MainFrm.cpp文件。文档类,CMyWebDoc,对应myWebDoc.h和myWebDoc.cpp文件。HtmlView类,CM

28、yWebView,对应myWebView.h和myWebView.cpp文件。此时编译运行,程序已经具有了基本的Web浏览功能,能自动连到微软的网站。,2修改菜单 修改菜单,添加用户需要的功能条目。在工作区中选择ResourceView卡,选择Menu,双击菜单控件的名字(IDR_MAINFRAME),右边出现程序的菜单。点击菜单中的“查看”项,已经有了“工具栏”和“状态栏”两个条目,双击下面的空框,弹出设置菜单条目属性对话框,如图8.13所示,按照表8.1添加六个菜单条目。,图8.13 设置菜单条目属性的对话框表8.1 要添加的菜单条目,3修改工具栏 在工具栏上增加新的按钮,以便快速执行所需

29、的功能。在工作区中选择ResourceView卡,选择ToolBar,双击工具条控件的名字(IDR_MAINFRAME),右边出现程序的工具条。双击其中的按钮,可以看到它们的属性。其中有一个空的按钮,双击它可以添加新的按钮的属性,如图8.14,利用右边的图形绘制工具,可以自己设计新按钮的图样。,按照表8.1添加六个按钮,它们的ID号与相应的菜单条目相同。拖动按钮,可以改变按钮之间的相对位置。,4为控件添加事件处理函数 当用户点击菜单条目,或者点击相应的快捷按钮时,应能引起程序的反映,这就需要给这些控件添加事件处理函数。进入类向导,选择“Message Maps”卡。在“Class Name”下

30、拉框中选择CMyWebView类,然后按照表8.2,为前述的六个控件添加事件处理函数。,表8.2 六个控件对应的事件处理函数,5添加事件处理函数的代码在myWebView.cpp实现文件中,添加上述六个事件处理函数的代码。/前进到下一个网页void CMyWebView:OnFoward()GoForward();/退到前一个网页void CMyWebView:OnBack()GoBack();/停止网页的下载void CMyWebView:OnStop()Stop();,/刷新当前的网页void CMyWebView:OnUpdate()Refresh();/回到主页void CMyWebV

31、iew:OnHomepage()GoHome();/进行搜索void CMyWebView:OnSearch()GoSearch();此时可以再编译运行,应当没有问题。,6为应用程序添加URL定位功能至此,应用程序还无法浏览用户想要的网页,还没有URL定位功能。通过以下步骤来添加这个功能。(1)添加网址输入栏控件在建立应用程序框架时,曾选择了Internet Explorer ReBars的工具条风格,这就自动在程序的资源中添加了一个对话框条,可以将它变为一个网址的输入栏。在工作区中选择ResourceView卡,选择Dialog,双击对话框控件的名字(IDR_MAINFRAME),右边出现这

32、个对话框条。在上面添加一个“地址:”的静态文本,再添加一个文本编辑框控件,ID号是IDC_ADDR,作为地址栏,提供给用户输入要浏览的网站地址。,(2)添加控制代码设想当用户在地址栏中输入网址后,打回车键时,浏览器应用程序就下载并显示指定的新网页,为了实现这个功能,考虑到用户在文本编辑框中按下回车键后,会有一个IDOK的消息发送到主框架类,可以添加处理这个消息的控制函数,在该函数中,用指定的网址调用Navigate()或者Navigate2()函数,就可以实现对该网页的浏览。在MainFrm.h文件中,添加消息处理函数的声明:public:void OnNew();,在MainFrm.cpp文

33、件中,添加该函数的实现代吗:void CMainFrame:OnNew()CString pp;/获得用户在地址栏中输入的URLm_wndDlgBar.GetDlgItem(IDC_ADDR)-GetWindowText(pp);/浏览指定的网页(CMyWebView*)GetActiveView()-Navigate(pp);,其中m_wndDlgBar是代表地址栏文本框所在的对话框条控件的成员变量,是在生成应用程序框架的时候自动创建的,利用它的GetDlgItem方法取得地址栏控件的ID,再利用地址栏控件的GetWindowText方法获得用户输入的网址。另外,由GetActiveView

34、()函数返回的是一个CView类的指针,必须将它强制转换成本应用程序视图类的指针,才能调用Navigate()函数。,建立事件处理函数与消息的映射在MainFrm.cpp文件中,再消息映射(MESSAGE_MAP)段中添加自己的消息映射的宏。用ON_COMMAND命令建立IDOK消息和处理函数OnNew的映射关系。BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)/AFX_MSG_MAP(CMainFrame)ON_WM_CREATE()/AFX_MSG_MAPON_COMMAND(IDOK,OnNew)/自己的消息映射宏END_MESSAGE_MAP(),要注意,

35、自己添加的消息映射宏要放在类向导自动生成的代码之外,一般放在AFX_MSG_MAP宏的后面。在myWebView.h文件的类定义前面添加包含语句#include myWebDoc.h经过上述处理,应用程序就可以自由地浏览网页了,7解决点击超链接时地址栏的同步问题当用户点击网页中的超链接来浏览其他网页时,地址栏中应显示该链接的网址,以便用户能了解自己所在的位置,解决这个问题可以利用CHtmlView类的事件处理函数。当网页下载完成后,会触发OnDocumentComplete()函数,该函数的参数就是所下载网页的URL,可以利用此函数对地址栏进行设置。添加以下代码:在MainFrm.h文件中,添

36、加处理函数的声明:public:void SetPage(LPCTSTR lpszURL);,在MainFrm.cpp文件中,添加该函数的实现代吗:void CMainFrame:SetPage(LPCTSTR lpszURL)m_wndDlgBar.GetDlgItem(IDC_ADDR)-SetWindowText(lpszURL);该函数页使用了地址栏所在的对话框条控件对应的成员变量,将指定的URL显示在地址栏中。,使用类向导添加事件处理函数用类向导为应用程序的CMyWebView类添加OnDocumentComplete()事件处理函数。并在myWebView.cpp文件中添加它的实现

37、代码void CMyWebView:OnDocumentComplete(LPCTSTR lpszURL)/TODO:Add your specialized code here and/or call the base class(CMainFrame*)GetParentFrame()-SetPage(lpszURL);/CHtmlView:OnDocumentComplete(lpszURL);,添加包含语句在MainFrm.cpp文件前面添加包含语句#include myWebView.h在myWebView.cpp文件前面添加包含语句。#include MainFrm.h 至此,编译运行程序,应能很好地运行了。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号