HTML是一个简单的WINDOWS动态链接库,这意味着不需要任何组件技术就可以应用到你的程序中。扩展接口和HTMLayout嵌入原则在Windows通用控件实用性上是相似的。
要创建一个HTMALayout的实例你只要调用 ::CreateWindo[Ex] 的Windows API。要加载html文本你只要调用 ::HTMLayoutLoadHtml 从内存加载或调用 ::HTMLayoutLoadFile 从本地硬盘或互联网。要获得HTMLayout窗口的窗口类名可以调用 HTMLayoutClassName() 的函数。
HTMLayout使用标准的 WM_NOTIFY 消息机制来回调主程序。
HTMLayout产生回调事件类型:
- 创建控件:HLN_CREATE_CONTROL,HLN_CONTROL_CREATED 和HLN_DESTROY_CONTROL。 主程序可以通过响应这些事件来创建相应输入元素的子控件,例如以下元素:<INPUT>,<TEXTAREA>,<SELECT>,<IFRAME>或<OBJECT>。
- 资源加载:HLN_LOAD_DATA,HLN_DATA_LOADED 和 HLN_DOCUMENT_COMPLETE。 主程序通过响应这些事件去加载HTML以提供HTMLayout引用的资源。例如:主程序可能把它的图片和风格表单存在它程序的资源段,那么资源加载就要从那加载。
- 行为创建:HLN_ATTACH_BEHAVIOR 主程序可以通过创建一个特定行为处理器来继承和重写HTML 元素的标准行为。HTML内容的编写者可以使用behavior CSS属性来分配一些行为。例如:<div systle=”behavior:menu”>
HTMLayout SDK包含了许多行为的实现:超链接,命令,折叠等。
主程序会动态地改变当前的文档布局通过操作DOM元素:显示/隐藏和插入/移除 DOM树的节点。
1.为存在的窗口附上HTMLayout函数
除了使用调用CreateWindow该标准方法创建HTMLayout外,HTMLayout还支持“功能混入”风格的集成——它可以被附在任何已经存在的窗口类。
这样做的目的是:一些组件系统,比如ActiveX或.net容器,做许多事“驱动”管理着容器或子容器的关系。这种环境下你可以选择指定HTMLayout现有类的功能,而不是重新设计整个基础设施。
使用这种模式很容易从你的窗口类的窗口过程中调用HTMLayout函数。这个函数是按标准微软WINDOWS窗口过程的消息处理声明的,且增加一个报告“是否处理过”的状态。
LRESULT HTMLayoutProcND(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, BOOL* pbHandled);
如果HTMLayoutProcND报告所给的消息已经被处理你就不需要再调用你的容器的默认的窗口过程。
class MyClass: CWnd //or any other CWnd derived class { typedef CWnd super; // our superclass we derived from … virtual LRESULT WindowProc(UINT message,WPARAM wParam,LPARAM lParam ); { BOOL handled = FALSE; LRESULT lr = HTMLayoutProcND( m_hWnd, message, wParam, lParam, &handled ); if( handled ) return lr; // HTMLayout processed the message return super::WindowProc(message,wParam,lParam ); // call superclass window proc } … }
2.将自定义控件嵌到HTML中
HTMLayout中允许定义HTML且管理任何基于HWND控件的自定义控件的类型的布局。
定义你选择的控件你可以使用 <INPUT type="mycontroltype"> or <WIDGET type="mycontroltype"> … </WIDGET>的标记。
解析HTMLayout文档后会产生HLN_CREATE_CONTROL的消息通知主程序处理控件控件创建。程序可以响应这些消息并用type属性的值作为类标识创建窗口(HWND)。主程序也许无法创建新的控件,但会返回已存在的HWND。这完全取决于你的设计。
2.1.<INPUT>和<WIDGET>
在标准的HTML中,所有的控件都是内置控件——<input>、<select>和<textarea>都是内置元素。
为了能处理更 HTMLayout引进了新元素——<widget>。<widget>这个HTML元素标签定义如下:
-
- <widget>必须用<widget … />的形式或</widget>标记关闭。
- 在布局中<widget>类似于<div>
- <widget>也可以用来定义内置控件。例如:定义一个块级别的textarea元素不值得用<widget type=textarea> …文本… </widget>。
有许多类被定义成块元素的UI控件,例如TreeView和ListView通用控件并没有设计成内置控件。
作为一个块元素,<widget>允许用提供的 % 和 %% 单位处理更自然的高度。记住以下的标记:
<div><input …/></div>
解析时会被转换成:
<div>
<anonymous-text-container><input …/></anonymous-text-container>
<div>
这是HTML的规范要求。您可能发现,在这种情况下,用%或%% 的单位作为内置元素的高度计算量是含糊的——它不明确哪个元素作为%计算的基础。
<widget>元素解决了这个问题,因为它不需要一个文本容器。
2.3 自定义控件,尺寸,字体和颜色
产生HLN_CREATE_CONTROL的通知之后,如果NMHL_CREATE_CONTROL.outControlHwnd 被程序设置成一个有效的窗口句柄(程序指定的自定义控件)。HTMLayout做以下事情:
1、发送 WM_SETFONT 消息,参数是从风格属性得到的字体句柄。
2、调用API函数::GetWindowRect获得它的尺寸。这个尺寸成为“最小自身控件尺寸”。HTMLayout使用这些值来设置元素默认的宽高。
3、运行时,HTMLayout使用这个“最小自身控件尺寸”和标准CSS属性:宽度、最小宽度,高度,最小高度和最大高度来计算实际控件的高度。
如果需要,您的控件可以在交付调用标准WM_CTLCOLORS 或者 WM_CTLCOLOREDIT 消息来获得背景颜色刷和文本颜色。
引文来源