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






3.67/5 (32投票s)
2003年9月5日
4分钟阅读

270732

4933
WTL 集成轻量级 HTML 布局和渲染引擎
引言
在互联网时代,越来越多的应用程序开始拥有“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>
(标签 WIDGET
是 HtmLayout
中相当于 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_WIDTH
和 WP_HL_ACTION_GET_MIN_DOCUMENT_HEIGHT
(给定宽度)方法允许应用程序获取有关加载文档尺寸的信息。
所有这些“方法”都可以通过简单的调用来激活:
::SendMessage(hWnd, WM_HL_ACTION, WPARAM(WP_HL_ACTION_action_code), LPARAM(action_params))
或通过调用 HtmLayout SDK 提供的 WTL 包装器类的 SetText
、OpenFile
、GetDocumentMinWidth
和 GetDocumentMinHeight
函数。
有关 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 主页。