教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 综合文档 >

High-speed Charting Control--MFC绘制图表(折线图、饼图、柱形(3)

来源:网络收集 时间:2026-08-11
导读: COleDateTime对象可以从不同的时间格式构造(检查COleDateTime类的MSDN文档,以了解从哪种格式可以构造它)。 填充数据后,可以配置轴以显示所需的内容。 与日期/时间轴相关的几个功能可用: void SetDateTimeIncre

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* pSerie, unsigned uPointIndex) {

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函数也可以被调用。 例如当用户在两个点之间但仍然在该系列上点击时情况。 …… 此处隐藏:3704字,全部文档内容请下载后查看。喜欢就下载吧 ……

High-speed Charting Control--MFC绘制图表(折线图、饼图、柱形(3).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/403917.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)