在MFC应用中深入定制WebBrowser控件

来源:互联网 发布:hy p580手写板软件 编辑:程序博客网 时间:2024/06/06 05:55
正如VC ++ 6.0的演示程序MFCIE所示,用应用程序向导创建一个具有Web导航能力的MFC应用可谓轻而易举。本文在此基础上,进一步讨论两个问题:资源自包含的实现,上下文菜单以及快捷键的完全控制。

步骤/方法

  1. 资源自包含及res协议
      所谓的资源自包含,指的是在最终产品中HTML文档(包括相关资源如脚本、图片)成为执行文件的一部分,就象其它资源(如应用程序图标)一样,而不是以独立文件形式分发。
      资源自包含不仅使产品分发更为方便,而且在最终用户面前隐藏了更多的实现细节,具有一定的现实意义。
      MFC类CHtmlView不仅把WebBrowser控件的所有功能(如导航,用户接口配置等)重新整理成为C++方法和MFC事件映射,还提供了许多“原创”的功能。其中之一便是从包含它的应用程序中读取Web页面的能力。完成这个任务的主要方法为CHtmlView::LoadFromResource(),其原型如下:

  2.   BOOL LoadFromResource( LPCTSTR lpszResource ); //用字符串指定资源ID
      BOOL LoadFromResource( UINT nRes ); //用数字指定资源ID
      LoadFromResource()依赖于res://协议(IE在找不到URL指定的服务器时,所显示的错误提示页面即使用res协议引出。)res协议的URL和常见的http或ftp协议所用URL格式不同,它的完整语法为:

  3.   res://resource_file[/resource_type]/resource_id
      其中resource_file为包含目标资源的执行文件名字。resource_type为资源类型,它可能用数字表示,也可能用字符串表示。当资源为定制或不直接支持类型时用字符串指出资源类型(如GIF,JPEG等,可在.RC文件中定义);当资源为已知类型时该值往往用数字表示(如位图为2,HTML为23)。已知资源类型的完整列表可以参见winuser.h,它是一组RT_常量。
      CHtmlView::LoadFromResource()总是假定目标资源所在的执行文件为当前模块。但在实际应用中,我们往往要把资源分类放在不同文件中。为解决此问题,可以定义一个派生类CHtmlViewEx覆盖此方法,只需要对原方法略作修改引入模块参数即可:

  4. 清单
      BOOL CHtmlViewEx::LoadFromResource(LPCTSTR lpszModule, LPCTSTR lpszResource)
      {
      CString strResourceURL;
      strResourceURL.Format(_T(" res://%s/%s" ), lpszModule, lpszResource);
      Navigate(strResourceURL, 0, 0, 0);
      return TRUE;
      }