COleDateTime对象可以从不同的时间格式构造(检查COleDateTime类的MSDN文档,以了解从哪种格式可以构造它)。
填充数据后,可以配置轴以显示所需的内容。 与日期/时间轴相关的几个功能可用:
void SetDateTimeIncrement(TimeInterval Interval, int Multiplier)
void SetDateTimeFormat(bool bAutomatic, const TChartString& strFormat) void SetReferenceTick(COleDateTime referenceTick)
第一个允许您指定轴上显示的两个节拍之间的间隔。两个节拍之间的间隔将遵守正确的时间,这意味着如果指定1个月的节拍增量
(Interval=CChartAxis::tiMonth and Multiplier=1),则两个节拍之间的间隔将是不规则的(28,30或31天)。第二个函数允许您指定刻度标
签的格式。控件根据刻度间隔自动格式化刻度标签,但您可以通过调用此函数覆盖它。检查MSDN上的COleDateTime :: Format函数的文档以获
取更多信息。最后,SetReferenceTick(COleDateTime referenceTick)函数允许您为轴指定一个参考标记。参考标记是用作绘制标记的参考
的日期:在该日期总是存在标记。当您在SetDateTimeIncrement函数中指定的multiplier 不是1时,这很有用。例如,假设您指定了3个月的单
位增量,并且您希望在2月(因此,5月,8月,?)有一个单位,那么您可以调用此函数将2月1日设置为参考单位。默认设置为2000年1月1日。
下面是一个简单的代码片段,它创建一个日期/时间轴,并显示不同函数的用法:
void CMyClass::Init() {
// Sets the axis min value to January 1st 2006 and the axis // max value to December 31st 2007.
COleDateTime minValue(2006,1,1,0,0,0); COleDateTime maxValue(2007,12,31,0,0,0);
pBottomAxis->SetMinMax(CChartCtrl::DateToValue(minValue), CChartCtrl::DateToValue(maxValue));
// Sets the tick increment to 4 months (disable automatic tick increment) pBottomAxis->SetTickIncrement(false, CChartDateTimeAxis::tiMonth, 4); // Sets the tick label format for instance \
pBottomAxis->SetTickLabelFormat(false, _T(\}
自定义外观
控件的外观方面可以根据不同的应用场景做出更改,比如控件的不同部分(图例,标
题,背景,?)都可以修改。 所有与这些对象的交互是通过CChartCtrl类来实现:一些将根据需要创建(例如axes或series),一些在创建控件时创建(legend,titles,?)。 一般来说,你永远不会自己创建这些对象,而是将该任务委派给CChartCtrl类。 唯一的例外是当您要使用自定义轴或自定义系列(请参阅“扩展功能”部分)。 例如,下面是一个代码段,设置渐变背景,并将图例放在控件的底部:
void CMyClass::Init() {
// SNIP
// Disable the refresh of the control m_ChartCtrl.EnableRefresh(false); // Set the gradient for the background
m_ChartCtrl.SetBackGradient(RGB(255,255,255),RGB(125,125,255),gtVertical); // Dock the legend at the bottom
m_ChartCtrl.GetLegend()->DockLegend(CChartLegend::dsDockBottom); // Specifies that the legend entries are horizontally stacked m_ChartCtrl.GetLegend()->SetHorizontalMode(true); // Re-enable the refresh of the control m_ChartCtrl.EnableRefresh(true); }
重要:从版本1.4的控件,每次调用控件上的一个属性将导致控件的完全刷新(即使像改变一些文本的字体或对象的颜色)。 为了避免在没有必要时刷新控件(例如,当您同时更改多个属性时),应首先禁用刷新,更改属性,然后重新启用刷新,如上面的代码段所示 。
自从1.5版的控件开始支持UNICODE。 所有出现的std :: string对象已被TChartString对象替换,这只是一个typedef,如果未启用UNICODE,则解析为std :: string,并在启用UNICODE时解析为std :: wstring。
响应鼠标事件
有时,应用程序需要响应用户鼠标操作。 例如,如果用户点击点,则程序可以显示关于被点击的点的信息,这一节将解释如何做到。
虽然原理是有点不同,但是无论你想听在图表上的一般鼠标事件本身(点击轴,图例,?)或你是否对特定系列的鼠标事件感兴趣。 这两种情况都很容易实现。
响应图表上的鼠标事件
你必须实现CChartMouseListener接口,覆盖你感兴趣的方法,并通过调用CChartCtrl :: RegisterMouseListener(CChartMouseListener * pMouseListener)将该类的实例注册到图表控件。 根据鼠标事件发生在控件的哪个部分:标题,图例,轴或绘图区,调用该接口上的不同函数。 对于所有这些函数,总是传递两个参数:MouseEvent,它是列出鼠标事件类型(鼠标移动,左键单击,?)的枚举,以及一个CPoint对象,它包含的发生事件的点的屏幕坐
标。 对于某些函数,需要时传递一些其他参数。 例如,当单击一个轴时,指向该轴的指针被传递给该函数。
下面是CChartMouseListener的实现,它对轴的点击作出反应,并显示一个消息框:
class CCustomMouseListener : public CChartMouseListener {
public:
void OnMouseEventAxis(MouseEvent mouseEvent, CPoint point, CChartAxis* pAxisClicked) {
if (mouseEvent == CChartMouseListener::LButtonDoubleClick) {
MessageBox(_T(\ } } };
然后你必须创建一个这个类的实例并注册它:
m_pMouseListener = new CCustomMouseListener(); m_ChartCtrl.RegisterMouseListener(m_pMouseListener);
这里也需要自己删除指针。
响应系列上的鼠标事件
响应系列上的事件与响应一般事件非常相似,只是监听器是CChartSeriesMouseListener的一个实例,它是一个模板类,模板参数是系列的点类型。 这是需要的,以避免当您要检索点的特定值时不必要的转型。 另一个区别是,您必须在系列本身上注册监听器,而不是在图表控件上注册。
下面是CChartSeriesMouseListener的实现,它对系列的点击做出反应,如果点击发生在点上,它将显示一个带有点的Y值的消息框:
class CCustomMouseListener : public CChartSeriesMouseListener
public:
void OnMouseEventSeries(MouseEvent mouseEvent, CPoint point,
CChartSerieBase
if (mouseEvent == CChartMouseListener::LButtonDoubleClick && uPointIndex != INVALID_POINT) {
TChartStringStream ssText;
SChartXYPoint Point = pSeries->GetPoint(uPointIndex); ssText << _T(\ << Point.Y; TChartString strText = ssText.str();
MessageBox(NULL,strText.c_str(), _T(\ } } };
注意:当用户不点击一个点时,OnMouseEventSeries函数也可以被调用。 例如当用户在两个点之间但仍然在该系列上点击时情况。 在这种情况下,为uPointIndex参数传递INVALID_POINT。
然后,您必须创建此类的实例并将其注册到系列中:
m_pMouseListener = new CCustomMouseListener(); m_pSeries.RegisterMouseListener(m_pMouseListener);
注意:只有当系列操作SChartXYPoint类型的点(点,线,面或者柱状图系列)时,这才会起作用。 如果不是这样,您的代码将生成编译错误。
出于性能原因,禁止检测系列上的鼠标移动事件。 要启用它,请参阅doxygen文档中的CChartSerie :: EnableMouseNotifications函数。
使用光标
您还可以向控件添加光标。 支持两种类型的光标:“十字线”光标和“拉线”光标。 第一个是在鼠标移动的绘图区域上显示的简单十字,第二个是与特定轴关联的水平或垂直线,您可以通过单击它并使用鼠标移动来拖动。 对于每个光标,您可以注册一个侦听器,以便在移动光标时通知它。 这里是一段代码,用于创建与底部和左侧轴相关联的“十字准线”光标以及与底部轴相关联的“拉线”光标:
// Creates a cross-hair cursor associated with the two primary axes. CChartCrossHairCursor* pCrossHair = m_ChartCtrl.CreateCrossHairCursor();
// Creates a dragline cursor associated with the bottom axis. CChartDragLineCursor* pDragLine =
m_ChartCtrl.CreateDragLineCursor(CChartCtrl::BottomAxis); // Hides the mouse when it is over the plotting area. m_ChartCtrl.ShowMouseCursor(false);
注意到对CChartCtrl :: ShowMouseCursor的调用结束。 默认情况下,鼠标总是可见的,但是当您使用十字光标时,当它在绘图区域时隐藏有时是需要的。
如果希望在光标位置更改时收到通知,则必须实现CChartCursorListener接口,创建其实例并使用光标注册它:
class CCustomCursorListener : public CChartCursorListener {
public:
void OnCursorMoved(CChartCursor *pCursor, double xValue, double yValue) {
TChartStringStream ssText;
ssText << _T(\
// Do something with the string... } };
CCustomCursorListener* pCursorListener = new CCustomCursorListener; pDragLine->RegisterListener(pCursorListener);
OnCursorMoved函数接收一个X和Y值,但对于拖动光标,只使用这些值中的一个:如果光标与水平轴相关联,则使用X值,否则使用Y值。
使用平移和缩放功能
在版本1.1的控件中,缩放和平移功能已被添加到控件。 使用鼠标左键控制缩放,用鼠标右键控制平移。 要缩放图表的特定部分,只需左键单击图表(这将是缩放矩形的左上角),然后拖动到右下角。 将出现一个矩形。 一旦松开鼠标按钮,四个轴将自动调整到您选择的区域。 默认情况下启用缩放,但您可以通过调用CChartCtrl :: SetZoomEnabled(bool bEnabled)来禁用缩放。 您还可以通过调用CChartAxis :: SetZoomLimit(double dLimit)为每个轴指定缩放限制。 它指定缩放时轴的最小范围。 默认值为0.001。
要平移控件,右键单击控件上的某处并移动鼠标。 鼠标下的点将“跟随”鼠标的移动(实际上,轴的最小和最大值将改变)。 默认情况下启用平移,但您可以通过调用CChartCtrl :: SetPanEnabled(bool bEnabled)来禁用它。
如果您左键单击图表(例如开始缩放),但如果您移动到左上角,所有使用缩放和平移功能所做的修改将被取消(控制将处于它的状态 在使用平移和缩放操作之前)。 最后,还有一种方法通过调用CChartAxis :: SetPanZoomEnabled(bool bEnabled)禁用特定轴的平移和缩放功能。
利用高速功能
线和点系列允许以高速率绘制数据。 这通常在要绘制来自外部设备(例如,传感器)的数据时完成。 这是可能的,因为当您向此类系列添加点时,控件不会完全刷新,只会绘制最后一个点(或最后一个线段),这是非常有效的。 但是,如果希望控件能够足够快地绘制数据,则必须考虑几点。
一个重要的事情是,使用自动轴可能会降低很多性能。这是因为如果一个点绘制在轴