ATL 图表控件






3.83/5 (9投票s)
基于使用 ATL 的图表控件的文章
引言
在我之前的项目中需要实现一个图表,用于以图形化视图显示实时的以太网数据包传输状态。我尝试寻找有趣的材料和图表显示示例应用程序。我发现一些图表看起来已经像图形了 - 即使是那些旨在显示完整数据记录的图表。我找不到一篇好的文章来显示运行时中的动态数据。之后,我计划创建一个具有更多功能的独立图表控件,使其尽可能灵活和有用。
概述
实际上,我是 ATL 组件的初学者。这是我为了学习 ATL 组件并实现独立图表控件而开发的第一个 ATL 应用程序。我试图找到一些指导,可以帮助我了解 ATL 以及如何创建 ATL 组件,但找不到任何关于如何创建 ATL 控件的清晰文档。然后,我开始使用 MSDN 创建一个。
特点
这些 ATL 图表控件具有一些主要和重要的功能,例如
- 自动缩放。
- 动态自定义显示(颜色、样式、刷新速度等)。
- 动画图表视图。(用于同步显示的内置定时器)。
- 叠加图表条(单或双图表条)
代码描述
ATLChart 控件初始化
将图表控件与您的应用程序链接非常容易。只需通过键入来注册 dll 文件 (ChartATL.dll)
regsvr32 chartATL.dll
在命令提示符中或使用 Visual Studio 开始菜单中的“ActiveX 控件测试容器”工具并编译您的项目。现在从工具箱中选择“chart atl”控件并将其拖到您的对话框或任何控件上。您可以在设计器的“属性”面板中编辑控件的所有属性。
属性方法
这些属性方法用于在运行时动态自定义图表显示。然后,用户需要进行一些修改。这可以通过为放置在对话框上的 ATLChart 控件创建一个成员变量来实现。并通过使用点 (.) 运算符以及成员变量,它将列出该对象 (ATLChart) 的所有方法和变量。您可以调用任何具有有效参数值的相应方法来在运行时更新图表。根据修改,图表将被更新并动态显示(颜色、样式、刷新速度等)。
STDMETHOD(get_BackColor)(OLE_COLOR* pVal);
STDMETHOD(put_BackColor)(OLE_COLOR newVal);
STDMETHOD(get_VerticalLineStyle)(PenStyle* pVal);
STDMETHOD(put_VerticalLineStyle)(PenStyle newVal);
STDMETHOD(get_HorizontalLineStyle)(PenStyle* pVal);
STDMETHOD(put_HorizontalLineStyle)(PenStyle newVal);
STDMETHOD(get_VerticalLineColor)(OLE_COLOR* pVal);
STDMETHOD(put_VerticalLineColor)(OLE_COLOR newVal);
STDMETHOD(get_HorizontalLineColor)(OLE_COLOR* pVal);
STDMETHOD(put_HorizontalLineColor)(OLE_COLOR newVal);
STDMETHOD(get_ChartColor_1)(OLE_COLOR* pVal);
STDMETHOD(put_ChartColor_1)(OLE_COLOR newVal);
STDMETHOD(get_ChartColor_2)(OLE_COLOR* pVal);
STDMETHOD(put_ChartColor_2)(OLE_COLOR newVal);
STDMETHOD(get_ChartFillStyle_1)(BrushStyle* pVal);
STDMETHOD(put_ChartFillStyle_1)(BrushStyle newVal);
STDMETHOD(get_ChartFillStyle_2)(BrushStyle* pVal);
STDMETHOD(put_ChartFillStyle_2)(BrushStyle newVal);
STDMETHOD(put_RefreshSpeed)(USHORT newVal);
STDMETHOD(get_RefreshSpeed)(USHORT* pVal);
动态图表值更新
只有一个公共方法可用于更新图表值:UpdateChart
。在任何时候,如果您从任何地方获取一个值(由来自定期例程等获得的事件释放),使用 UpdateChart
方法将其添加到 ATLChart 控件。无需担心数据准备或显示同步。此方法包含两个参数
UpdateChart(USHORT ChartValue1, USHORT ChartValue2);
USHORT ChartValue1 - Specifies the value to be modified the first bar
of the chart.
USHORT ChartValue2 - Specifies the value to be modified the second bar
of the chart.
全局 typedef 定义
全局 typedef 定义用于指定线条和填充颜色属性的样式。
PenStyle
:typedef 描述图表背景中垂直和水平线的样式。BrushStyle
:typedef 描述两种不同颜色条的条填充颜色样式。
//Line Fill Style
typedef enum
{
L_SOLID = 0,
L_DASH = 1,
L_DOT = 2,
L_DASHDOT = 3,
L_DASHDOTDOT = 4,
L_EMPTY = 5,
L_INSIDEFRAME= 6,
L_USERSTYLE = 7,
}PenStyle;
//Brush Fill Style
typedef enum
{
B_SOLID = 0,
B_EMPTY = 1,
B_HOLLOW = 2,
B_HATCHED = 3,
B_PATTERN = 4,
B_INDEXED = 5,
B_DIBPATTERN = 6,
B_DIBPATTERNPT = 7,
B_PATTERN8X8 = 8,
B_DIBPATTERN8X8 = 9,
B_MONOPATTERN = 10
}BrushStyle;
图表绘制方法
绘制图表是此项目最简单的部分之一。在这里,我将简单地获取对话框上控件的边界,并将它们水平和垂直地分成相等的部分。
实际上,有两种方法用于绘制图表。DrawChartBackground
方法将绘制图表的背景,并通过将垂直线从右向左移动来赋予背景动画形式。 RedrawChart
方法将通过检查传递的最大值来执行自动缩放并绘制双图表条。
VOID CChartDlg::RedrawChart(HDC hdc, RECT Rect)
VOID CChartDlg::DrawChartBackground(HDC hdc, RECT Rect)
演示应用程序执行程序
从上面的链接下载源文件并将其保存到文件夹中。现在通过命令提示符 "regsvr32 ChartATL.dll" 注册 ChartATL.dll,或使用 Visual Studio 开始菜单中的 "ActiveX 控件测试容器" 工具选项进行注册。
进一步改进
我们仍然可以改进这个组件。
- 向图表添加更多属性。(如线条宽度和网格大小)。
- 运行时底层条的数量(用户可以在运行时更改要在图表上绘制的条的数量)
- 显示负值。目前仅适用于正值
- ... 以及更多功能。
结论
这个 ATL 图表控件有很多好处:更好地理解使用 ATL 创建基本的自定义绘制用户控件,以及改进学习 ATL 组件的基本编码风格。但是,这个组件是不完整的。有很多方法可以改进这个组件的各个方面,但我们拥有的东西满足了用户的基本需求。