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

ATL 图表控件

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.83/5 (9投票s)

2007 年 3 月 20 日

CPOL

4分钟阅读

viewsIcon

50386

downloadIcon

3165

基于使用 ATL 的图表控件的文章

Screenshot - ATLChartControl_Demo.jpg

引言

在我之前的项目中需要实现一个图表,用于以图形化视图显示实时的以太网数据包传输状态。我尝试寻找有趣的材料和图表显示示例应用程序。我发现一些图表看起来已经像图形了 - 即使是那些旨在显示完整数据记录的图表。我找不到一篇好的文章来显示运行时中的动态数据。之后,我计划创建一个具有更多功能的独立图表控件,使其尽可能灵活和有用。

概述

实际上,我是 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 组件的基本编码风格。但是,这个组件是不完整的。有很多方法可以改进这个组件的各个方面,但我们拥有的东西满足了用户的基本需求。

© . All rights reserved.