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"存
|
0
顶一下

发表评论
告诉好友