65.9K
CodeProject 正在变化。 阅读更多。
Home

WTL 集成轻量级 HTML 布局和渲染引擎

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.67/5 (32投票s)

2003年9月5日

4分钟阅读

viewsIcon

270732

downloadIcon

4933

WTL 集成轻量级 HTML 布局和渲染引擎

Sample Image - screenshot.jpg

引言

在互联网时代,越来越多的应用程序开始拥有“Web 风格”的 HTML 类用户界面,这似乎是很自然的。HTML 图形化 UI 吸引用户,并给他们留下完成软件任务的轻巧和简便的印象。

让我们将 HTML 不仅视为描述带有活动(超链接)区域和嵌入式资源的屏幕布局的方式,而是将其视为一种现代的应用程序设计和管理方法。

使用提出的轻量级可嵌入 HTML 布局引擎,可以非常方便地实现以下任务:

  • 创建具有“Web 风格”用户界面的应用程序。
  • 在复杂应用程序中将表示层与用户交互逻辑分离。
  • 创建“可换肤”的用户界面。
  • 设计支持多种 UI 语言的应用程序。通常,每种语言(或区域设置)对屏幕布局都有自己的要求,因为相同的短语(例如,输入字段的标题)在不同语言中的长度可能不同。使用不同语言的不同 HTML 资源可以帮助您管理国际化问题。
  • 创建可调整大小的屏幕布局并管理复杂的输入表单。HTML 引擎可以充当最终的布局管理器,因为它具备 java.awt.*Layout 类中的所有功能。
  • 设计数据库驱动的应用程序,其中可视化对象所需的所有资源都作为 HTML 存储在同一个数据库中。
  • 创建嵌入式帮助系统等。

本文介绍了如何在 WTL 项目中使用 HtmLayout 引擎。

HtmLayout

Terra Informatica HtmLayout 引擎是一个本地 Windows™ 窗口类,驻留在 HtmLayout.DLL (约 400K) 中。本地(Native)意味着它只使用纯 Windows API 调用,而不使用 COM/ActiveX 或 .NET 等其他集成技术。

HtmLayout 引擎通过 WM_NOTIFY 消息与宿主应用程序进行交互。

HtmLayout 嵌入

您可以将 HtmLayout 窗口视为一个智能容器,它执行两项主要任务:

  • 渲染加载的 HTML
  • 布局子控件(由 HTML 的 <INPUT> 标签定义)。

HtmLayout<INPUT><TEXTAREA> 和其他“输入”元素视为应用程序提供的子控件和视图的“占位符”定义。在解析这些标签时,HtmLayout 会生成 WM_NOTIFY/HLN_CREATE_CONTROL “事件”。应用程序本身可以创建子窗口,解释 HtmLayout 提供的标签属性值集合和可选的 <PARAM>。因此,可以定义任何您选择的自定义控件的 HTML。

<P>Name to search:<INPUT id=32103 
    name=TextToSearch type=text width=100% minwidth=40>
or select item from here:</P>
<WIDGET id=32104 name=ItemToPick type=treeview haslines linesatroot 
                  hasbuttons width=100% height=100% minheight=40>
    <PARAM name=fruits value=0>
    <PARAM name=fruits/apples value=1>
    <PARAM name=fruits/oranges value=2>
    <PARAM name=fruits/cherries value=3>
    <PARAM name=vegetables value=0>
    ...
</WIDGET>

(标签 WIDGETHtmLayout 中相当于 HTML 中 APPLET 标签的元素。)

HtmLayout 事件(通知消息)

在加载 HTML 文本时,HtmLayout 会引发两种类型的事件 -(以 WM_NOTIFY 形式发送通知消息):

  • HLN_CREATE_CONTROL - 请求宿主创建控件。
  • HLN_LOAD_DATA - 请求宿主加载 HTML 文本中引用的图像。应用程序可以从资源或其他存储(如数据库)加载图片。HtmLayout 也可以从本地文件系统或互联网加载数据。

如果源 HTML 包含超链接,当鼠标光标进入、离开或单击超链接区域时,HtmLayout 将发送 HLN_HYPERLINK 通知。

处理响应 WM_NOTIFY/HLN_CREATE_CONTROL 通知创建控件的代码可能如下所示:

   // CREATE_CONTROL parameters structure
  struct NMHL_CREATE_CONTROL 
  { 
      NMHDR hdr; 
      //zero terminated string, type attribute value, 
      //e.g. "text","textarea","checkbox" 
      LPCWSTR   type; 
      //zero terminated string, name attribute value 
      LPCWSTR   name;
      //zero  terminated string, id attribute value  
      LPCWSTR   id;   
      // 0-input, 1-textarea, 2-select, 3-widget 
      int            tagType;   

      //vector of pointers to attribute names (char strings) 
      LPCSTR*   attributeNames; 
      // vector of pointers to attribute values (wchar_t strings) 
      LPCWSTR*  attributeValues; 
      //<SELECT> and <WIDGET> 
      //collection of <OPTION>'s or <PARAM>'s 
      int       attributeCount; 

      // vector of pointers to param names (wchar_t strings) 
      LPCWSTR*  optionNames; 
      // vector of pointers to param values (wchar_t strings) 
      LPCWSTR*  optionValues; 
      int       optionCount; 
              
      HWND      outControlHwnd; // output, HWND of created window 
  } 
  
inline LRESULT 
    CHtmLayoutWindowEx::OnCreateControl
    (LPNMHL_CREATE_CONTROL pnmCreateCtl) 
{
    int style = WS_CHILD | WS_TABSTOP | WS_VISIBLE;
      
    if(pnmCreateCtl->type == 0 || pnmCreateCtl->type[0] == 0)
    return 0; // no type attribute in this tag

    LPCTSTR clsname = 0;
    // ... 
    if(wcsicmp(pnmCreateCtl->type,L"treeview") == 0)  
    {
        clsname = WC_TREEVIEW; 
        style | = WS_VSCROLL;
        if(IsAttributeExists(pnmCreateCtl,"haslines"))
           style | = TVS_HASLINES;
        if(IsAttributeExists(pnmCreateCtl,"linesatroot"))
          style |= TVS_LINESATROOT;
        if(IsAttributeExists(pnmCreateCtl,"hasbuttons"))
          style |= TVS_HASBUTTONS;
        if(IsAttributeExists(pnmCreateCtl,"editlabels"))
          style |= TVS_EDITLABELS;
        //etc... 
    }
    // ... 
    HWND hWndCtl= 
         CreateWindowEx(WS_EX_CLIENTEDGE,
                  clsname,0,style,0,0,0,0,m_hWnd,0,0,0); 
          
    // return to HtmLayout HWND of the control. 
    pnmCreateCtl->outControlHwnd = hWndCtl;  
        
    return 0; 
}

HtmLayout 方法(消息)

宿主应用程序可以使用 WP_HL_ACTION_LOAD_HTML(从文本缓冲区)或 WP_HL_ACTION_OPEN_FILE(从文件)“方法”将 HTML 文本加载到 HtmLayout 窗口中。

WP_HL_ACTION_GET_MIN_DOCUMENT_WIDTHWP_HL_ACTION_GET_MIN_DOCUMENT_HEIGHT(给定宽度)方法允许应用程序获取有关加载文档尺寸的信息。

所有这些“方法”都可以通过简单的调用来激活:

::SendMessage(hWnd, WM_HL_ACTION, WPARAM(WP_HL_ACTION_action_code), LPARAM(action_params))

或通过调用 HtmLayout SDK 提供的 WTL 包装器类的 SetTextOpenFileGetDocumentMinWidthGetDocumentMinHeight 函数。

有关 HtmLayout 嵌入原理的更多详细信息,请访问:HtmLayout API 和嵌入原理

WTL 包装器和演示应用程序的源代码位于 HtmLayout SDK 发行版samples/WTL 目录中。

HtmLayout 标记风格

HtmLayout 标记语言非常接近 HTML 3.2。它进行了扩展,使其更适合受视图宽度和高度限制的屏幕布局。此外,还进行了一些增强以支持“可展开”和渐变填充的背景。

HtmLayout 支持 GIF、JPEG 和带 alpha 通道的 PNG(透明度)。

有关 HtmLayout 标记的更多详细信息,请访问:HtmLayout 标记语言

支持的平台

HtmLayout.DLL 可用于所有现有的 Windows 平台,包括 Windows Mobile,并且可以在免费应用程序(即免费分发且不以任何形式盈利的应用程序)中免费使用。

除了 WTL 包装器之外,HtmLayout SDK 还包含 MFC、.NET (C#) 和 ActiveX (VB) 包装器的源代码。

有关详细信息和最新更新,请访问 HtmLayout 主页

© . All rights reserved.