扫一扫,访问微社区

QQ登录

只需一步,快速开始

MFC扩展编程实例2D线形与折线图表创建及标签标记线宽样式设置

[ 复制链接 ]
MFC扩展编程实例2D线形与折线图表创建及标签标记线宽样式设置


例程实现二维线形图表的创建以及设置图表常见属性,比如设置标签显示角度,
数据标记样式与大小,数据系列线宽与线的样式等。
例程界面如下。

24.MFC扩展编程实例2D线形与折线图表创建及标签标记线宽样式设置

24.MFC扩展编程实例2D线形与折线图表创建及标签标记线宽样式设置


可以看到例程三个数据系列,因创建的是线形图表,所以数据系列以线条形式显示。
通过界面的几个按钮可以设置图表相关的属性。
多次点击 更改标签角度按钮,可以显示出标签,并以45度为单位更改标签显示的角度。
多次点击标记点大小开头按钮,可以修改标记点不同的外形与大小。
多次点击线形样式按钮,可以循环修改线条的样式与线条的宽度,
其中变包括折线,也就是可以创建折线图表。

下面是例程创建过程 与关键代码。
先创建基于class CMy123View : public CBCGPFormView的单文档工程。
在视窗的对话框资源上添加图片控件,修改ID为IDC_CHART用于显示图表。
在视窗类中添加变量CBCGPChartCtrl m_wndChart及虚函数create.
函数如下:

  1. BOOL CMy123View::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
  2. {
  3.         BOOL bRst = CBCGPFormView::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);;
  4.         //获取图表指针;
  5.         m_wndChart.SubclassDlgItem(IDC_CHART,this);//子类化图表;
  6.         CBCGPChartVisualObject* pChart = m_wndChart.GetChart();
  7.         BCGPChartCategory category = BCGPChartLine;//图表种类,F12查看全部;
  8.         BCGPChartType type = BCGP_CT_SIMPLE ; //BCGP_CT_100STACKED;//BCGP_CT_STACKED;//图表类型,按F12查看全部;
  9.         pChart->SetChartType(category, type);//设置图表类别;
  10.         pChart->SetChartTitle(_T("2D线形与折线图表创建及标签标记线宽样式设置"));
  11.         //XY轴刻度设置;
  12.         CBCGPChartAxis* pYAxis = pChart->GetChartAxis(BCGP_CHART_Y_PRIMARY_AXIS);
  13.         CBCGPChartAxis* pXAxis = pChart->GetChartAxis(BCGP_CHART_X_PRIMARY_AXIS);
  14.         pYAxis->m_majorTickMarkType = CBCGPChartAxis::TMT_CROSS;
  15.         pYAxis->m_minorTickMarkType = CBCGPChartAxis::TMT_CROSS;
  16.         pXAxis->m_majorTickMarkType = CBCGPChartAxis::TMT_CROSS;
  17.         pXAxis->m_minorTickMarkType = CBCGPChartAxis::TMT_CROSS;
  18.         //创建三个个数据系列及添加数据;
  19.         CBCGPChartSeries* pSeries1 = DYNAMIC_DOWNCAST(CBCGPChartSeries, pChart->CreateSeries(_T("能源")));
  20.         CBCGPChartSeries* pSeries2 = DYNAMIC_DOWNCAST(CBCGPChartSeries, pChart->CreateSeries(_T("税收")));
  21.         CBCGPChartSeries* pSeries3 = DYNAMIC_DOWNCAST(CBCGPChartSeries, pChart->CreateSeries(_T("维护")));
  22.         srand((unsigned)time(NULL));
  23.         COleDateTime now = COleDateTime::GetCurrentTime();
  24.         CString sYear;
  25.         for(int i=5;i>0;i--)
  26.         {
  27.                 sYear.Format(_T("%d"), now.GetYear() - i);
  28.                 pSeries1->AddDataPoint(sYear, rand()%20+1);
  29.         }

  30.         pSeries2->AddDataPoint(9.);
  31.         pSeries2->AddDataPoint(15.);
  32.         pSeries2->AddDataPoint(19.);
  33.         pSeries2->AddDataPoint(21.);
  34.         pSeries2->AddDataPoint(23.);

  35.         pSeries3->AddDataPoint(2.);
  36.         pSeries3->AddDataPoint(3.);
  37.         pSeries3->AddDataPoint(16.);
  38.         pSeries3->AddDataPoint(19.);
  39.         pSeries3->AddDataPoint(19.);

  40.         //添加添加到布局管理器统一管理布局;
  41.         if (GetLayout() == NULL)
  42.                 return bRst;
  43.         CBCGPStaticLayout* pLayout = (CBCGPStaticLayout*)GetLayout();
  44.         if (pLayout == NULL)
  45.                 return bRst;
  46.         pLayout->AddAnchor(m_wndChart.GetDlgCtrlID(), CBCGPStaticLayout::e_MoveTypeNone, CBCGPStaticLayout::e_SizeTypeBoth);
  47.         //
  48.         return bRst;
  49. }
复制代码
在虚函数中就创建了线形图表,关键代码如下:
BCGPChartCategory category = BCGPChartLine;//图表种类,F12查看全部;
BCGPChartType type = BCGP_CT_SIMPLE ; //BCGP_CT_100STACKED;//BCGP_CT_STACKED;//图表类型,按F12查看全部;
pChart->SetChartType(category, type);//设置图表类别;
例程使用的参数是BCGP_CT_SIMPLE ,表示创建简单的线形图表。
如果还想创建叠加类型的线形图表,可以更改参数为BCGP_CT_STACKED或BCGP_CT_100STACKED。

图表创建后,可以对线条的外观及线条的宽度进行设置,这也是比较直观的属性。
例程对应实现代码如下。
  1. void CMy123View::OnBnClickedButton3()
  2. {
  3.         static int nIndex=0;
  4.         CBCGPChartVisualObject* pChart = m_wndChart.GetChart();
  5.         for (int i = 0; i < pChart->GetSeriesCount(); i++)
  6.         {
  7.                 CBCGPChartSeries* pSeries = pChart->GetSeries(i);
  8.                 ASSERT_VALID(pSeries);
  9.                 BCGPChartFormatSeries style = pSeries->GetSeriesFormat();
  10.                 style.m_curveType = (BCGPChartFormatSeries::ChartCurveType)(nIndex+1);//线类型;
  11.                 style.SetSeriesOutlineDashStyle((CBCGPStrokeStyle::BCGP_DASH_STYLE)nIndex);
  12.                 style.SetSeriesLineWidth(nIndex + 2);
  13.                 pSeries->SetSeriesFormat(style);
  14.         }
  15.         pChart->Redraw();
  16.         //
  17.         nIndex++;
  18.         nIndex = nIndex>4? 0:nIndex;
  19. }
复制代码
在函数中线形对应为枚举类型,CCT_STEP对应为折线类型。
        enum ChartCurveType       
        {
                CCT_NO_LINE,
                CCT_LINE,
                CCT_SPLINE,                        // Kochanek-Bartels spline
                CCT_SPLINE_HERMITE,        // Hermite spline
                CCT_STEP,
                CCT_REVERSED_STEP
        };

例程还实现对数据标签与数据标记点的设置,
对应两个函数如下。

  1. void CMy123View::OnBnClickedButton1()//图表修改数据标签位置;
  2. {
  3.         static int nAng=0;
  4.         CBCGPChartVisualObject* pChart = m_wndChart.GetChart();
  5.         pChart->ShowDataLabels(true,true,true,nAng);
  6.         pChart->Redraw();
  7.         //
  8.         nAng+=45;
  9.         nAng = nAng>360?45:nAng;
  10. }
  11. void CMy123View::OnBnClickedButton2()
  12. {
  13.         static int n=0;
  14.         CBCGPChartVisualObject* pChart = m_wndChart.GetChart();
  15.         pChart->ShowDataMarkers(true, n*2+4, (BCGPChartMarkerOptions::MarkerShape)n);
  16.         pChart->Redraw();
  17.         //
  18.         n++;
  19.         n = n>3?0:n;
  20. }
复制代码
相对来说,创建线形图表也很简单,例程用到的MFC扩展库可以在网站搜索下载。
例程源代码下载:
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:24.MFC扩展编程实例2D线形与折线图表创建及标签标记线宽样式设置.rar 
文件大小:82.14 KB  售价:2金币
下载权限: 不限 以上或 VIP会员   [购买VIP]   [充值积分]   有问题联系我


  

如果您认可,可联系功能定制!

  

如果您着急,可红包后,发您资料!

  

QQ联系我

微信扫扫联系我

  


回复

使用道具 举报

点击查看
快速回复 返回列表 客服中心 搜索