利用 CHtmlView 和 HTML 制作新风格的界面

原创 2002年12月16日 09:37:00
用过 Outlook Express 的很多人都对其第一页的 HTML 界面感到新奇,很明显这是使用 DHTML 技术,加入了一些 Java Script 的一个网页,但它能够和应用程序进行交互操作。其实利用 VC6.0 的新加入的 MFC 类 CHtmlView ,你也可以实现这样一个令人激动的程序界面。这个界面可以利用 HTML ,这是很有意义的,想象一下,你在 HTML 中实现的效果,全部可以放在程序的界面中,而你所做的只是写了一个 HTML 文件和少量的编程。
   CHtmlView 是 MFC 新加入的一个类,如果你看一下 MFC 关于这个类的源代码,就会发现在其内部封装了接口 IWebBrowser2 。这个接口实际上是 IE 的接口。也就是说,你可以通过这个类来调用强大的 IE 来显示 HTML 页面,每个人都可以利用这个类,轻松的写出一个浏览器。 VC 中也带了一个使用这个类写的浏览器的例子 MFCIE ,可以参考。

   利用 CHtmlView 显示页面是很简单的。你只要在资源中加入 HTML 页面资源,程序中加入下面一句语句就可以实现。

   LoadFromResource(ID_XXX);//ID_XXX 是资源的定义

   解决这个问题的核心是如何利用 CHtmlView 把用户对 HTML 页面的操作传送给应用程序。这里看似很神秘,但实际上有一个技巧,可以截获用户的输入。在类 CHtmlView 中有一个事件 OnBeforeNavigate2 ,当浏览器被重新导向之前,会激活这个事件。比如说每当用户按下了 HTML 中的超级链接,或者用户在地址栏输入新的地址,还有程序员调用接口的 Navigate 方法,浏览器要转向新地址的时候,都会激活这个事件。而在这里,当你实现 HTML 界面的时候,用户通过点击页面上的链接来激活命令,所以我们可以在这个事件里做一些处理,这个事件的参数中有两个比较重要, lpszURL 就是在 HTML 页面中 href 指定的地址,你可以给各个链接设置相应的地址,通过这个参数的内容就可以识别用户点击的链接。而 pbCancel 可以指定是否取消导向,只要写入 *pbCancel = TRUE ,导向就被取消,不会发生了, CHtmlView 显示的还是现在的页面。让我们来看一下我写的例子程序 HtmlGUI 。
void CHtmlGUIView::OnBeforeNavigate2(LPCTSTR lpszURL, DWORD nFlags, LPCTSTR lpszTargetFrameName, CByteArray& baPostedData, LPCTSTR lpszHeaders, BOOL* pbCancel)
{
// TODO: Add your specialized code here and/or call the base class

if (ProcessCommand(lpszURL))
{
//URL was processed by the programmer defined code.
//cancel navigation
*pbCancel = TRUE;
}
else
{
CHtmlView::OnBeforeNavigate2(lpszURL, nFlags, lpszTargetFrameName, baPostedData, lpszHeaders, pbCancel);
}

}

BOOL CHtmlGUIView::ProcessCommand(LPCTSTR lpszURL)
{
if ( _tcscmp(lpszURL, _T("app:link1")) == 0 )
{
AfxMessageBox("Link1 was pressed, you can process your command here!");
return TRUE;
}

if ( _tcscmp(lpszURL, _T("app:link2")) == 0 )
{
AfxMessageBox("Link2 was pressed, you can process your command here!");
return TRUE;
}
//NOT processed by me.
if ( _tcscmp(lpszURL, _T("app:about")) == 0 )
{
::SendMessage(AfxGetMainWnd()->GetSafeHwnd(), WM_MAINAPP_ABOUT,0,0);
return TRUE;
}
return FALSE;
}

   这里面我写了一个函数 BOOL CHtmlGUIView::ProcessCommand(LPCTSTR lpszURL) 来处理命令的映射,如果被导向的地址应该映射到程序的命令,则作相应的处理,并返回 TRUE ,表示已经被处理了,取消导向。否则返回 FALSE ,则调用 MFC 父类的函数,进行正常的操作。

   为了不露出破绽,最好屏蔽掉鼠标右键,所以还应该重载 PreTranslateMessage ,并加入如下代码。
BOOL CHtmlGUIView::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
// Do not let View get Right button Message.
if ((pMsg->message == WM_RBUTTONDOWN) ||
(pMsg->message == WM_RBUTTONDBLCLK))
return TRUE;
else
return CHtmlView::PreTranslateMessage(pMsg);
}


   当用户按下右键或者双击右键的时候,返回 TRUE ,这样 CHtmlView 窗口就不会得到这两条消息了。当然你也可以利用页面中的 Script 来实现这个功能。

   另外在写 HTML 页面时有一些东西要注意。微软为了使资源中的 HTML 文件能够得到访问,为 IE 定义了一个可以称为 res 协议的东西。你可以在 IE 的地址栏中输入 res://x:/xxx/htmlgui.exe/gui.htm ( x:/xxx/ 为路径), IE 中应该显示出我的程序的 HTML 文件。其实当你用 IE 访问页面出错的的时候, IE 显示的出错信息也是放在 C:/WINDOWS/SYSTEM/SHDOCLC.DLL 中的。 HTML 中用到的图片,声音等等,显然也要放入程序资源中才比较好。所以这些东西要全部当作 HTML 加入到资源中。而且,最好直接使用文件名用作资源 ID ,在资源文件中按下面格式加入定义。
GUI.HTM HTML DISCARDABLE "res//gui.htm"
PIC1.JPG HTML DISCARDABLE "res//pic1.jpg"
WRITE.GIF HTML DISCARDABLE "res//write.gif"
CHIMES.WAV HTML DISCARDABLE "res//Chimes.wav"

   虽然 VC 的资源编辑器会把他们当作文本来显示,但是不要担心。只要你不要按文本去编辑他们就行了, CHtmlView 在加载页面的时候会正确显示他们的。不过千万不要把他们当作自定义或其他资源来加入,如果你那样做了, CHtmlView 加载时反而会不认识他们。为了确保 HTML 被正确显示,所有的图片和声音能被找到,所以在 HTML 文件中加入下面一行。

   < BASE url="res://HtmlGUI.exe/GUI.HTM">

   CHtmlView 还有一个函数 CHtmlView::GetHtmlDocument 可以得到 Ative Document 对象的 IDispatch 接口,然后你应该可以利用这个接口 QueryInterface 出其他的接口,利用这些接口你可以在程序中动态地控制 HTML 页面的内容。如果有兴趣,好好看看 MSDN 联机帮助,研究一下吧。

   HTML 界面是一种快速,方便,效果独特,容易排错的全新的界面技术,而由于微软封装了 OLE 接口 IWebBrowser2 ,使它的实现的技术细节变得这么简单,让我们来创造更新更酷的界面吧,祝编程愉快!

MFC界面--利用CHtmlView和HTML制作新风格的界面(包括CView和Dialog)

一、文档视图形式,以一个视图cview(chtmlview)作为首页界面 转自:http://liuxiang031130.blog.163.com/blog/static/117666552011...
  • WaitForFree
  • WaitForFree
  • 2013年05月19日 10:41
  • 8640

利用 CHtmlView 和 HTML 制作新风格的界面(有启发性,但还需进一步学习)

利用 CHtmlView 和 HTML 制作新风格的界面 转自 http://dev.21tx.com/2002/12/14/10161.html点击打开链接 其实利用 VC6.0 的...
  • zhongjling
  • zhongjling
  • 2013年05月17日 22:11
  • 674

使用html和CSS进行网页网站设计 -- 简明步骤

网页制作流程: 1. 心中有规划,网站的骨架结构,页面布局layout. 2. 创建一个用于创建模板dwt的html页: main.html 3. 制作main.html: (1) 在ht...
  • sonictl
  • sonictl
  • 2013年09月30日 23:42
  • 2170

使用CHtmlView制作浏览器的简单记录

这几天做了一个简易浏览器,其中碰到了一些问题,在这里记录下来,以供之后查阅。 1、简单的浏览器一些基本功能,例如回到主页、向前、后退、刷新、停止,都可以直接使用CHtmlView中的操作。 例如G...
  • hrxd1270
  • hrxd1270
  • 2014年03月12日 23:18
  • 2615

动态改变网页内容(CHtmlView/CWebBrowser2/IE)

很多时候,我们需要动态的修改网页的内容。早先COM集中营曾有篇文章介绍过,源代码:http://263.csdn.net/FileBBS/files/2001_9/T_642_1.zip其中基本代码如...
  • cyforce
  • cyforce
  • 2011年01月20日 13:15
  • 1355

MFC对话框里利用CHtmlView加载界面(四)————分层窗口设置

在学会了 利用CHtmlView 在MFC对话框上显示网页,并支持JavaScript 和 MFC 之间的互相通信后。 当然就想: 我们为什么不能只用HTML 作为前端界面, 而底层用MFC实现逻辑呢...
  • qq_20828983
  • qq_20828983
  • 2017年05月23日 18:48
  • 338

Servlet实现网站计数器

package com.po; import java.io.IOException; import java.io.PrintWriter; import javax.serv...
  • pangqiandou
  • pangqiandou
  • 2016年10月18日 16:22
  • 789

增强的CHtmlView类,在视图里处理HTML元素事件和交换数据 -[今天转几篇基础桌面技术文章]

前言         伴随着VC7的诞生,载入IE的对话框成为了新的热点,CDHtmlDialog给不熟悉COM编程的程序员注入了丝丝暖风。处理页面元素的响应事件,与其交换数据都被封装到几组宏内。类似...
  • sunwang123456
  • sunwang123456
  • 2005年07月09日 11:00
  • 2533

【win32 app调用html方法】 CHtmlView当前浏览器打开新窗口--我看完之后感觉是 html当中的信息映射的处理方法

在自己编写的浏览器软件中,对于在新窗口打开的页面默认调用系统默认浏览器打开,而不是在当前浏览器中打开,以下在MDI中调用OnNewWindow2实现在自己的浏览器中新窗口打开,原理即是修改OnNewW...
  • pirate97
  • pirate97
  • 2012年03月13日 10:54
  • 1743

如何在CHtmlView中用OnNewWindow2事件生成自己的浏览器窗口,实现类似于多标签页浏览

方式一 void CCustomHtmlView::OnNewWindow2(LPDISPATCH* ppDisp, BOOL* Cancel)  { CWebNavigate *pDlg =  n...
  • zttjhm
  • zttjhm
  • 2012年11月22日 07:59
  • 2250
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用 CHtmlView 和 HTML 制作新风格的界面
举报原因:
原因补充:

(最多只允许输入30个字)