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

VC++
几个数字信号处理算法程序
简易软盘镜像工具的实现及操作系统编写初步
教你使用正则表达式
C++ 扩展和嵌入 Python
拷贝构造和赋值操作符,C#和本机 C++ 代码的互用性
精通VC与Matlab联合编程(六)
精通VC与Matlab联合编程(五)
一个排序用的C++函数模板
浅析VC与MATLAB联合编程
C++编译器如何实现异常处理
文件重定义冲突的分析与解决
一步一步实现MFC扩展DLL中导出类和对话框
C宏:智者的利刃,愚者的恶梦!
引用的作用
《UTF-8与GB2312之间的互换》的改进
程序风格的要素-C++风格指南
VC+6.0实现文本串的自由拆分
怎样给串行化类分配版本号(可配置版本模式)
在常规的编程任务中使用新的 <tuple> 库
使用 typedef 抑制劣质代码

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 337 ::
收藏到网摘: 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"存