用Chart控件绘制动态图表

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

用Chart控件绘制动态图表

---- 进行程序设计时,选用一个合适的ActiveX控件,有时可大大减少编程工作量。ActiveX 控件(又称OCX)基于COM技术,作为独立的软件模块,它可以在任何程序设计语言中插入使用。本文仅以VC++为例说明Chart控件的使用。

---- Chart控件指Mschart.ocx(5.0版)或Mschrt20.ocx(6.0 版),是Visual Studio自带的ActiveX控件之一,其属性、事件很多,功能非常强大,可实现柱状直方图、曲线走势图、饼状比例图等,甚至可以是混合图表,可以是二维或三维图表,可以带或不带坐标系,可以自由配置各条目的颜色、字体等等。

一安装和使用Chart控件

----在用到Chart控件的项目中安装该控件:从Project->Add to Project ->Components And Controls->Registered Active Xcontrols,选择Chart控件,则ClassWizard会生成相应的C++类,其中类CMSChart是由CWnd派生来的,它是Chart 控件的主要类,其他的类全部是由COleDispatchDriver派生来,控制控件中的相应对象,完成各部分相关功能,如CvcAxis类是实现坐标轴相关功能的源代码。同时在项目的控件工具箱上会出现代表Chart控件的按钮,使用时把Chart控件按钮从工具箱拖到对话框中,调整大小即可。

----Chart控件至少有45个属性、9个方法、49个事件,在这里就不一一列举了。

---- 在设计中,我们可以在主要属性页里修改各属性的属性值:右击对话框窗口中的Chart控件,选择“Properties”菜单项,就会弹出主要属性页对话框,对其中各属性值进行设置。有些属性在主要属性页里没有列出,只能编程修改。另外要动态绘制图表,必须掌握对控件的编程控制。

---- 首先在对话框类中定义控件变量,以便编程时操纵控件。如对话框类定义如下:

class CAbcDlg : public CDialog{

public:

CAbcDlg(CWnd*pParent = NULL);

//{{AFX_DA TA(CAbcDlg)

enum { IDD = IDD_ABC_DIALOG };

CMSChart m_Chart;

//}}AFX_DA TA

......

};

----ActiveX控件的属性和方法在控件内部对应唯一一个整数索引值,编程时可以通过索引来设置或获取控件的属性值,也可以通过调用控件的C++类(在这里就是CMSChart)的成员函数设置或获取控件的属性值及调用控件的方法。例如:

----在CMSChart类实现中有如下代码:

CString CMSChart::GetData(){

CString result;

InvokeHelper(0x9, DISPA TCH_PROPERTYGET,

VT_BSTR, (void*)&result, NULL);

return result;

}

void CMSChart::SetData(LPCTSTR lpszNewV alue){

static BYTE parms[] =VTS_BSTR;

InvokeHelper(0x9, DISPA TCH_PROPERTYPUT,

VT_EMPTY, NULL, parms,lpszNewV alue);

}

void CMSChart::Refresh(){

InvokeHelper(DISPID_REFRESH,

DISPA TCH_METHOD, VT_EMPTY, NULL, NULL);

}

----这段代码表明:属性“Data”索引值为0x9,我们可以调用函数SetData对图表中某点的值进行设置。索引值为DISPID_REFRESH的方法“Refresh”,调用它进行刷新。如:

CString str=“34.5";

m_Chart.SetData(str);

m_Chart.Refresh();

......

----阅读CMSChart类的实现会发现,有些属性的值不是普通的BOOL、CString等数据类型,而是另一个控件驱动类的类变量,如:

CVcPlot CMSChart::GetPlot(){

LPDISPA TCH pDispatch;

InvokeHelper(0x28, DISPA TCH_PROPERTYGET,

VT_DISPA TCH, (void*)&pDispatch, NULL);

return CVcPlot(pDispatch);

}

----在CVcPlot类的实现中有如下代码:

CVc Axis CVcPlot::GetAxis

(long axisID, const V ARIANT&Index){

LPDISPA TCH pDispatch;

static BYTE parms[] =VTS_I4 VTS_V ARIANT;

InvokeHelper(0x1f, DISPA TCH_PROPERTYGET,

VT_DISPA TCH, (void*)&pDispatch, parms, axisID, &Index);

return CVcAxis(pDispatch);

}

----而CVcAxis类的实现中有如下代码:

CVc V alueScale CVcAxis::GetV alueScale(){

LPDISPA TCH pDispatch;

InvokeHelper(0x9, DISPA TCH_PROPERTYGET,

VT_DISPA TCH, (void*)&pDispatch, NULL);

return CVcV alueScale(pDispatch);

}

----而CVcV alueScale类的实现中又有如下代码:

void CVcV alueScale::SetMaximum(double newV alue){

static BYTE parms[] =VTS_R8;

InvokeHelper(0x3, DISPA TCH_PROPERTYPUT,

VT_EMPTY, NULL, parms,newV alue);

}

----这正是Chart控件的灵活性所在,根据上述代码,如下的调用:

V ARIANT var;

m_Chart.GetPlot().GetAxis(1, var).GetV alueScale()

.SetMaximum(50.0);

可实现把纵坐标的最大刻度设为50.0。

----控件触发的事件,如Click、MouseDown等,如果需要处理,可以通过ClassWizard在对话框类中定义相应的处理函数,实现相关的处理功能。

二动态绘制图表实例

---- 在一个温度采集系统中,希望把采集来的各项温度值实时显示,用Chart控件绘制曲线走势图:

各温度项以不同颜色的曲线表示;

横坐标为时间,纵坐标为温度值,均要求滚动显示;

在每次采样完成后,刷新屏幕。

----设计思路

随着时间的推移,采集来的数据不断增加,不一定在一屏中显示,所以系统打开一个实时数据库,存放采集来的实时数据。显示时,需要哪个时间段的数据,就从数据库中读取。在对话框资源编辑时,增加水平滚动条和垂直滚动条,以便配合Chart控件进行滚动显示。

为对话框启动定时器,按采样间隔进行采样,并刷新屏幕显示。

----主要相关代码如下:

相关文档
最新文档