MFC扩展编程在后续帖子中都是指扩展库BCGP库的编程使用。
具体可以博客搜索BCGP下载此库使用。
在此库中CHART的功能由类CBCGPChartVisualObject实现。
此类派生自CBCGPBaseVisualObject,继承了可视对象的所有功能,
比如驻留在容器中的能力(因此可以组合仪表和图表)和其他功能。
CBCGPChartVisualObject是绘制图表的一个关键集成类,
它管理了图表的数据系列、轴、图例和其他图表元素。
下面是我们可以操作和自定义的图表元素列表:
Chart Area,图表区域: 所有其他元素都位于图表区域内。 可以使用BCGPChartFormatArea选项对其进行格式化(使用GetChartAreaFormat()。
Title,标题: 图表标题通常位于图表区域的顶部。 可以使用BCGPChartFormatLabel选项对其进行格式化(使用GetTitleLabelFormat())。 标题可以覆盖图表的绘图区域。
Legend,图例: 图例显示图表数据系列名称或数据点及其键的列表。 图例可以在图表区域的左、上、右、下和右上角位置对齐。 它可重叠显示于绘图区域。 使用GetLegendFormat()可获得图例格式化的可用选项。
Plot Area,绘图区域: 绘图区域包含图表轴和图表区域。 使用GetPlotAreaFormat()来获取对绘图格式选项的引用。
Chart Axes,图表轴: 基本轴由CBCGPChartAxis类表示。 一个轴有以下可组合使用的元素: Axis line, 轴线 Major tick marks,主刻度线 Minor tick marks,次刻度线 Labels, 标签 Major grid lines,主网格线 Minor grid lines,次网格线 Major interval interlacing,主间隔交错区
Diagram Area,图区域: 图区域用于显示数据系列。 包含在上面的plot area内。
Series,数据系列: 一个系列(基本系列由CBCGPChartSeries类表示)由一个数据点列表构建。 每个数据点的外观可以单独设置,也可以继承其父系列的设置。 Data Point,数据点: 数据点是可以在图中显示的最简单的实体。 它的外观取决于图表类型。 例如,对于漏斗图,数据点显示为漏斗段。 而对于柱状图,数据点显示为矩形。 数据点由CBCGPChartDataPoint类表示。 数据点可以用数据标记在图表上,也可以用数据标签进行注释。
图表中数据点的位置取决于其图表数据。 图表数据由CBCGPChartData类表示,该类包含一个最简单的图表实体—图表值(CBCGPChartValue)数组。 每个图表值都位于组件索引处的图表数据中。组件实际上是X、Y和Z值,它们可以组成特定图表类型的数据点。 某些图表类型(如range或bubble)需要多个Y分量,它们被编码为Y1、Y2等。 数据标记总是放在图表数据的屏幕位置(这个位置可以在派生类中定制),并且可以通过(callout)线与数据标签连接。
每个系列都有一个内建的“实现”——一个特定于系列的类, 负责绘制实际的图表形状,并做一些其他特定于系列的工作,比如计算屏幕上的数据标签位置。 “实现”由CBCGPBaseChartImpl类表示。 图表的组成也可以参考办公软件excel的图表知识。
那么在使用扩展库GCBP时,具体如何从0开始一步步使用图表功能呢? 可以从类CBCGPChartView派生自己的类实现图表的操作, 也可以直接在自己的工程中通过关联控件的形式使用。 下面以一个单文档工程为例,通过VS2010演示如何创建与显示一个图表操作工程。 1.创建一个基于CBCGPFormView的单文档工程。 2.添加一个图片控件(picture control),ID设置为IDC_CHART,用于显示图表内容。 然后就是关联这个控件到一个图表变量CBCGPChartCtrl m_wndChart; 这是创建的是基于BCGP扩展库的工程,所以无法通过VS2010自带的类向导添加关联, 自己拖动添加代码关联DDX_Control(pDX,IDC_CHART,m_wndChart); 3.在默认的初始化函数OnInitialUpdate中,添加代码实现图表数据系列的生成与数据的添加。 - void CMy111View::OnInitialUpdate()
- {
- CBCGPFormView::OnInitialUpdate();
- GetParentFrame()->RecalcLayout();
- CBCGPChartVisualObject* pChart = m_wndChart.GetChart();
- ASSERT_VALID(pChart);
- pChart->SetChartTitle(_T("Chart Title"));
- CBCGPChartSeries* pSeries1 = pChart->CreateSeries(_T("Series 1"));
- pSeries1->SetCurveType (BCGPChartFormatSeries::CCT_SPLINE);
- CBCGPChartSeries* pSeries2 = pChart->CreateSeries(_T("Series 2"));
- pSeries2->SetCurveType (BCGPChartFormatSeries::CCT_SPLINE_HERMITE);
- pSeries1->AddDataPoint(0.);
- pSeries1->AddDataPoint(2.);
- pSeries1->AddDataPoint(5.);
- pSeries1->AddDataPoint(3.);
- pSeries1->AddDataPoint(3.5);
- pSeries1->AddDataPoint(5.);
- pSeries1->AddDataPoint(8.);
- pSeries1->AddDataPoint(7.);
- pSeries2->AddDataPoint(2.);
- pSeries2->AddDataPoint(4.);
- pSeries2->AddDataPoint(6.);
- pSeries2->AddDataPoint(7.);
- pSeries2->AddDataPoint(6.);
- pSeries2->AddDataPoint(3.);
- pSeries2->AddDataPoint(1.);
- pSeries2->AddDataPoint(0.);
- pChart->SetSeriesShadow();
- pChart->Redraw();
- }
复制代码这样就可以显示一个图表了,图表上面显示有两数据系列。 但当我们缩放窗口时会发现图表闪烁厉害,也无法随窗口大小自动改变大小。 所以我们还得通过下面两步完善显示效果。
4.在框架类CMainFrame的函数PreCreateWindow中,修改窗口样式, 去除自动添加文档标题功能,去除 水平垂直自动刷新功能。 代码如下: - BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
- {
- cs.style &= ~FWS_ADDTOTITLE;
- if( !CBCGPFrameWnd::PreCreateWindow(cs) )
- return FALSE;
-
- WNDCLASS wndcls;
- if (GetClassInfo (AfxGetInstanceHandle (), cs.lpszClass, &wndcls))
- {
- HINSTANCE hInst = AfxFindResourceHandle(MAKEINTRESOURCE(IDR_MAINFRAME), RT_GROUP_ICON);
- HICON hIcon = ::LoadIcon(hInst, MAKEINTRESOURCE(IDR_MAINFRAME));
- // register a very similar WNDCLASS but without CS_HREDRAW and CS_VREDRAW styles:
- cs.lpszClass = AfxRegisterWndClass (CS_DBLCLKS, wndcls.hCursor, wndcls.hbrBackground, hIcon);
- }
- return TRUE;
- }
复制代码5.在视窗类中添加消息WM_INITDIALOG处理函数ON_MESSAGE(WM_INITDIALOG, HandleInitDialog)。 在函数中将控件的锚点添加到布局管理器,并在构造函数中开启布局管理器。 - LRESULT CMy111View::HandleInitDialog(WPARAM wParam, LPARAM lParam)
- {
- LRESULT lRes = CBCGPFormView::HandleInitDialog (wParam, lParam);
- if (GetLayout() != NULL)
- {
- UpdateData(FALSE);
- CBCGPStaticLayout* pLayout = (CBCGPStaticLayout*)GetLayout();
- if (pLayout != NULL )
- {
- pLayout->AddAnchor(m_wndChart.GetDlgCtrlID(), CBCGPStaticLayout::e_MoveTypeNone, CBCGPStaticLayout::e_SizeTypeBoth);
- }
- }
- return lRes;
- }
复制代码这样通过上面几个步骤的操作,就可以完美添加与显示图表了。 效果如下: 当然如果觉得图表界面与程序外观主题不搭配的话, 也可以调用图表颜色设置函数: pChart->SetColors(CBCGPChartTheme::CT_PASTEL,true); 比如可以自定义一个按钮来切换图表的外观颜色: - void CMy111View::OnText()
- {
- CBCGPChartVisualObject* pChart = m_wndChart.GetChart();
- ASSERT_VALID(pChart);
- //
- static bool b=true;
- b=!b;
- pChart->SetColors(CBCGPChartTheme::CT_PASTEL,b);
- pChart->Redraw();
- }
复制代码
需要例程源代码的朋友,也可以下载使用。 使用前请自行下载上面提到的BCGP护库,进行环境的配置。 库有提供视频教程与中文版本的工程向导。
如果工程只是针对图表功能的开发,也可选择视窗基于CBCGPChartView。 如创建一个基于CBCGPEditView等单文档工程, 添加如下代码将CBCGPEditView定义为CBCGPChartView就好。 可以省去界面布局的管理。 #define CBCGPEditView CBCGPChartView class CMy123View : public CBCGPEditView { } 例程源代码下载: 以上就是对图表的入门介绍,后面会不定期更新图表不同分类的介绍与元素的使用。
|