QQ登录

只需一步,快速开始

上位机MFC扩展编程图表介绍与编程显示

[ 复制链接 ]
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的图表知识。
timg.jpg

那么在使用扩展库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中,添加代码实现图表数据系列的生成与数据的添加。
  1. void CMy111View::OnInitialUpdate()
  2. {
  3.         CBCGPFormView::OnInitialUpdate();
  4.         GetParentFrame()->RecalcLayout();

  5.         CBCGPChartVisualObject* pChart = m_wndChart.GetChart();
  6.         ASSERT_VALID(pChart);
  7.         pChart->SetChartTitle(_T("Chart Title"));

  8.         CBCGPChartSeries* pSeries1 = pChart->CreateSeries(_T("Series 1"));
  9.         pSeries1->SetCurveType (BCGPChartFormatSeries::CCT_SPLINE);

  10.         CBCGPChartSeries* pSeries2 = pChart->CreateSeries(_T("Series 2"));
  11.         pSeries2->SetCurveType (BCGPChartFormatSeries::CCT_SPLINE_HERMITE);

  12.         pSeries1->AddDataPoint(0.);
  13.         pSeries1->AddDataPoint(2.);
  14.         pSeries1->AddDataPoint(5.);
  15.         pSeries1->AddDataPoint(3.);
  16.         pSeries1->AddDataPoint(3.5);
  17.         pSeries1->AddDataPoint(5.);
  18.         pSeries1->AddDataPoint(8.);
  19.         pSeries1->AddDataPoint(7.);

  20.         pSeries2->AddDataPoint(2.);
  21.         pSeries2->AddDataPoint(4.);
  22.         pSeries2->AddDataPoint(6.);
  23.         pSeries2->AddDataPoint(7.);
  24.         pSeries2->AddDataPoint(6.);
  25.         pSeries2->AddDataPoint(3.);
  26.         pSeries2->AddDataPoint(1.);
  27.         pSeries2->AddDataPoint(0.);

  28.         pChart->SetSeriesShadow();
  29.         pChart->Redraw();
  30. }
复制代码
这样就可以显示一个图表了,图表上面显示有两数据系列。
但当我们缩放窗口时会发现图表闪烁厉害,也无法随窗口大小自动改变大小。
所以我们还得通过下面两步完善显示效果。

4.在框架类CMainFrame的函数PreCreateWindow中,修改窗口样式,
去除自动添加文档标题功能,去除 水平垂直自动刷新功能。
代码如下:
  1. BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
  2. {
  3.         cs.style &= ~FWS_ADDTOTITLE;

  4.         if( !CBCGPFrameWnd::PreCreateWindow(cs) )
  5.                 return FALSE;
  6.         
  7.         WNDCLASS wndcls;
  8.         if (GetClassInfo (AfxGetInstanceHandle (), cs.lpszClass, &wndcls))
  9.         {
  10.                 HINSTANCE hInst = AfxFindResourceHandle(MAKEINTRESOURCE(IDR_MAINFRAME), RT_GROUP_ICON);
  11.                 HICON hIcon = ::LoadIcon(hInst, MAKEINTRESOURCE(IDR_MAINFRAME));

  12.                 // register a very similar WNDCLASS but without CS_HREDRAW and CS_VREDRAW styles:
  13.                 cs.lpszClass = AfxRegisterWndClass (CS_DBLCLKS, wndcls.hCursor, wndcls.hbrBackground, hIcon);
  14.         }
  15.         return TRUE;
  16. }
复制代码
5.在视窗类中添加消息WM_INITDIALOG处理函数ON_MESSAGE(WM_INITDIALOG, HandleInitDialog)。
在函数中将控件的锚点添加到布局管理器,并在构造函数中开启布局管理器。
  1. LRESULT CMy111View::HandleInitDialog(WPARAM wParam, LPARAM lParam)
  2. {
  3.         LRESULT lRes = CBCGPFormView::HandleInitDialog (wParam, lParam);
  4.         if (GetLayout() != NULL)
  5.         {
  6.                 UpdateData(FALSE);
  7.                 CBCGPStaticLayout* pLayout = (CBCGPStaticLayout*)GetLayout();
  8.                 if (pLayout != NULL )
  9.                 {
  10.                         pLayout->AddAnchor(m_wndChart.GetDlgCtrlID(), CBCGPStaticLayout::e_MoveTypeNone, CBCGPStaticLayout::e_SizeTypeBoth);
  11.                 }
  12.         }
  13.         return lRes;
  14. }
复制代码
这样通过上面几个步骤的操作,就可以完美添加与显示图表了。
效果如下:
2019-12-30_144811.jpg
当然如果觉得图表界面与程序外观主题不搭配的话,
也可以调用图表颜色设置函数:
pChart->SetColors(CBCGPChartTheme::CT_PASTEL,true);
比如可以自定义一个按钮来切换图表的外观颜色:
  1. void CMy111View::OnText()
  2. {
  3.         CBCGPChartVisualObject* pChart = m_wndChart.GetChart();
  4.         ASSERT_VALID(pChart);
  5.         //
  6.         static bool b=true;
  7.         b=!b;
  8.         pChart->SetColors(CBCGPChartTheme::CT_PASTEL,b);
  9.         pChart->Redraw();
  10. }
复制代码

需要例程源代码的朋友,也可以下载使用。
使用前请自行下载上面提到的BCGP护库,进行环境的配置。
库有提供视频教程与中文版本的工程向导。
请点击此处下载

查看状态:已购买或有权限

您的用户组是:游客

文件名称:上位机MFC扩展编程图表介绍与编程显示.rar 
文件大小:65.45 KB 
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我


如果工程只是针对图表功能的开发,也可选择视窗基于CBCGPChartView。
如创建一个基于CBCGPEditView等单文档工程,
添加如下代码将CBCGPEditView定义为CBCGPChartView就好。
可以省去界面布局的管理。
#define CBCGPEditView CBCGPChartView
class CMy123View : public CBCGPEditView
{
}
2019-12-30_160031.jpg
例程源代码下载:
请点击此处下载

查看状态:已购买或有权限

您的用户组是:游客

文件名称:上位机MFC扩展编程图表介绍与编程显示1.rar 
文件大小:65.03 KB 
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我

以上就是对图表的入门介绍,后面会不定期更新图表不同分类的介绍与元素的使用。


回复

使用道具 举报

快速回复 返回列表 客服中心 搜索