当前位置: 首页 > 图文教程 > 开发语言 > VC++ > VC6中使用CHtmlView在对话框控制中显示HTML文件

VC++
如何有效地使用对话框
一个定制CFileDialog对话框的实例
XP风格复活节彩蛋的实现
程序界面多模式显示的实现
改变视图单调的背景
使窗体拥有透明效果的API
《电子尺》V1.02程序开发实例
美化你的应用程序的外观界面
个人考勤软件开发实例
使用VC6.0实现窗口的任意分割
如何让一个打开的文档成为活动文档
创建非矩形窗口的简单方法
轻松实现类VC界面
视图的缩放的完整论述
如何获得另一个应用程序窗口中的文本
如何发送命令到文档对象
动画窗口的实现-VC++实例一则
如何在其他程序的窗口上创建按钮并使之能响应
如何在基于对话框的程序中动态设置鼠标指针
扩展COleDropTarget类来支持任意窗口拖放 - 作者:王加宝

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 336 ::
收藏到网摘: n/a

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="/upload/tech/20091030/20091030015801_0d0871f0806eae32d30983b62252da50.jpg""> 
    此代码假设图像文件"pd.jpg"存