前言

好久没有来更新博客了,这次就写一下在实际工作过程中,利用Htmlayout引擎开发自定义图表控件的东西吧。
Htmlayout是一个非常棒非常轻量级的HTML引擎,利用HTML+CSS的搭配完成了静态页面布局的元素。可以通过访问官网来获取最新的版本信息。
Htmlayout提供的标准控件库没有能够满足我需求的图表显示控件,需要自己实现这方面的控件开发工作,于是就有了本文内容。

前期准备

各位看官可以从HtmlayoutSDK去下载最新版本的SDK,然后集成到开发环境中,我这里采用的是Microsoft visual studio 2008。
1.新增控件类型
我在这里不打算使用Htmlayout里面提供的绘图函数,所以直接从htmlayout::event_handler中继承了,这里也可以从htmlayout::canvas中继承。
2.定义响应事件类型
在构造函数中定义需要响应的时间,我这里偷懒了,直接处理了event_handler(HANDLE_ALL)
3.响应绘制函数
一想到绘制函数,大家应该首先想到的是WM_PAINT、HDC之类的东西吧。没错,Htmlayout里面也是一样的,大家可以重载htmlayout::event_handler::on_draw()函数,剩下的就跟一般的窗口绘制函数一样了。
函数原型

virtual BOOL on_draw(HELEMENT he, UINT draw_type, HDC hdc, const RECT& rc);

如果想让系统继续处理,则直接返回FALSE即可。
4.实现创建工厂类对象
在Htmlayout中,其实每一个控件都是一个behavior,这里的自定义控件也不例外。如果直接定义一个behavior的话就需要一个全局函数,这与图表控件的使用明显不合,为了更好的控制每一个图表的控件对象生命周期,需要一个创建工厂实例来控制每一个图表创建的时机。
说了那么多,其实做起来没那么复杂,也就几句代码

chart_control_factory::chart_control_factory()
:behavior(HANDLE_BEHAVIOR_EVENT, "chart_control")
{

}

event_handler* chart_control_factory::attach(HELEMENT h)
{
    return dynamic_cast<event_handler*>(new chart_figure);
}

chart_control_factory chart_control_factory_instance;

其中 "chart_control"指明了使用本图表控件的behavior名称。Htmlayout在解析到behavior的时候会遍历当前所有有效的behavior对象,找到对应的工厂类型后创建出合适的behavior实例。

其他

在本文中,我只是写了behavior里面的一个绘制处理修改,实际上除了绘制还有很多事件可以在behavior中处理,具体的内容可以参考EVENT_GROUPS里面的定义,每一个类型都会对应一个重载函数,可以非常灵活的定制自己的扩展控件库。