0
顶一下

VC6中使用CHtmlView在对话框控制中显示HTML文件

2007-03-27 10:18:51  作者:   来源:   浏览次数:611   评论

VC6中使用CHtmlView在对话框控制中显示HTML文件


编译/赵湘宁



本文的例子程序


   在Visual Studio 6.0中出现了一个新类CHtmlView,利用这个类,我们可以实现在对话框的控制中显示HTML文件。 要想使用CHtmlView类,对它的定义和实现就必须有全面深入的理解。我们不妨拿CHtmlView和CListView做一个比较,通过比较这两个类,我们会发现一些有趣的差别。首先,MFC中CListView有一个对应的CListCtrl类,而CHtmlView却没有一个CHtmlCtrl类与之对应;其次,CListView的使用依赖于MFC的文档/视结构,而CHtmlView的实现是基于COM的。通过IWebBrowser2接口来实现,而且IWebBrowser2与MFC文档/视图结构之间没有任何关系。
为了实现在对话框的控制中显示HTML文件,我们也可以为CHtmlView创建一个对应的类CHtmlCtrl。以下是类CHtmlCtrl程序源代码:
创建一个静态控制(也可以是其他控制),这个控制的ID及大小位置与界面上的控制相同。
BOOL CHtmlCtrl::CreateFromStatic(UINT nID, CWnd* pParent){    CStatic wndStatic;	    if (!wndStatic.SubclassDlgItem(nID, pParent))		    return FALSE;	    // 获取静态控制的矩形区域并转换为父窗口的客户区坐标	    CRect rc;	    wndStatic.GetWindowRect(&rc);	    pParent->ScreenToClient(&rc);	    wndStatic.DestroyWindow();    // 创建 HTML 控制 (CHtmlView)	    return     Create(NULL,		                    // 类名        	NULL,		                    // 标题	        	(WS_CHILD | WS_VISIBLE ),		 // 风格	        	rc,				 // 矩形区域		        	pParent,			          // /父窗口		        	nID,				  // 控制 ID        	NULL);			          ///框架/文档}
   为了避免主控程序将CHtmlView对象看作是文档/视图框架,需要重载,CView::OnMouseActivate和CView::OnDestroy。此外,当用户在控制中单击时,OnMouseActivate要负责响应(WM_MOUSEACTIVATE)。
int CHtmlCtrl::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT msg){		//旁路 CView 文档/框架		return CWnd::OnMouseActivate(pDesktopWnd, nHitTest, msg);}void CHtmlCtrl::OnDestroy(){		if (m_pBrowserApp) 	{	     m_pBrowserApp->Release();  	     m_pBrowserApp = NULL;		}		CWnd::OnDestroy(); // 旁路 CView 文档/框架}
通常,CHtmlView是在virtual void PostNcDestroy()中释放空间,但对话框中的控制常常是作为堆栈对象实现的,所以,在PostNcDestroy()中不必在做什么。
     virtual void PostNcDestroy() {  }     
为了实现“app:” 伪协议,重载导航处理器OnBeforeNavigate2()。传递“app:”链接到一个虚拟协议处理器。因为app:是假协议,所以在浏览起重要取消掉这个导航。
     void CHtmlCtrl::OnBeforeNavigate2( LPCTSTR lpszURL,    		DWORD nFlags, 	    	LPCTSTR lpszTargetFrameName, 	    	CByteArray& baPostedData, 	    	LPCTSTR lpszHeaders, 	    	BOOL* pbCancel ){     	  const char APP_PROTOCOL[] = "app:";      	  int len = _tcslen(APP_PROTOCOL);      	  if (_tcsnicmp(lpszURL, APP_PROTOCOL, len)==0)      	  {          		OnAppCmd(lpszURL + len);          		*pbCancel = TRUE;      	  }}       
    重载OnAppCmd(),处理app:命令,当浏览器准备导航到“app:foo”时,这个函数被调用,参数lpszWhere的值为“foo”。
void CHtmlCtrl::OnAppCmd(LPCTSTR lpszWhere){ // default: do nothing}
    重载OnMouseActivate, OnDestroy, 和 PostNcDestroy以后,CHtrmlCtrl在对话框中就可以象个控制一样工作。详细的使用方法请参见例子程序:AboutHtml。 运行AboutHtml.exe,并打开About对话框……音乐多么美妙!更有趣的是程序所用到的HTML源文件、图像、声音等文件都作为资源存储在EXE文件中:
// in AboutHtml.rc ABOUT.HTM  HTML DISCARDABLE "res\\about.htm" PD.JPG     HTML DISCARDABLE "res\\pd.jpg" OKUP.GIF   HTML DISCARDABLE "res\\okup.gif" OKDN.GIF   HTML DISCARDABLE "res\\okdn.gif" MOZART.WAV HTML DISCARDABLE "res\\mozart.wav"        
    注意:用文件的实际名字作为资源名很重要,以便浏览器能够找到他们。在一个普通的Web页面中,我们使用图像是用下列语法:
 <IMG src="http://www.jcwcn.com/Files01/BeyondPic/2007-3/27/073271018514131.jpg"">     
    此代码假设图像文件"pd.jpg"存
〖责任编辑:发表评论 告诉好友     
与 相关的教程