QQ登录

只需一步,快速开始

MFC扩展编程实例3D环面图表爆炸显示与设置标签位置

[ 复制链接 ]
MFC扩展编程实例3D环面图表爆炸显示与设置标签位置

当前例程实现三维环面图表的创建,并可以让其呈现爆炸显示,及设置其标签显示位置。
效果如下图。

MFC扩展编程实例3D环面图表爆炸显示与设置标签位置

MFC扩展编程实例3D环面图表爆炸显示与设置标签位置

点击例程界面最左边按钮可以来回旋转图表,
点击对应的其他三个按钮,可以设置图表数据标签显示的位置,
可以让图表以爆炸形式显示,可以让图表填充整个显示区域。

下面是图表创建过程。
首先创建基于单文档的工程,class CMy123View : public CBCGPFormView。
在默认的对话框资源上添加两图片控件,修改ID为IDC_CHART,IDC_ROTATE,用于显示图表与旋转图表。
并在视窗类中添加旋转按钮对象,图表对象,
        CBCGPRotationCtrl m_wndRotate;
        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_wndRotate.SubclassDlgItem(IDC_ROTATE,this);       
  6.         m_wndRotate.GetRotationObject()->SetAutorepeatMode(100);
  7.         m_wndRotate.GetRotationObject()->SetColorTheme(CBCGPRotationObject::BCGP_COLOR_THEME_VISUAL_MANAGER);
  8.         m_wndRotate.GetRotationObject()->EnableFlatIcons();
  9.         CBCGPRotationObject* pRO = m_wndRotate.GetRotationObject();
  10.         pRO->EnablePart(CBCGPRotationObject::BCGP_ROTATION_CLOCKWISE, FALSE);
  11.         pRO->EnablePart(CBCGPRotationObject::BCGP_ROTATION_NARROW_FIELD_OF_VIEW, FALSE);
  12.         pRO->EnablePart(CBCGPRotationObject::BCGP_ROTATION_WIDEN_FIELD_OF_VIEW, FALSE);
  13.         pRO->EnablePart(CBCGPRotationObject::BCGP_ROTATION_COUNTER_CLOCKWISE, FALSE);
  14.         pRO->EnablePart(CBCGPRotationObject::BCGP_ROTATION_UP, FALSE);
  15.         pRO->EnablePart(CBCGPRotationObject::BCGP_ROTATION_DOWN, FALSE);
  16.         //图表初始化;
  17.         m_wndChart.SubclassDlgItem(IDC_CHART,this);       
  18.         CBCGPInfoTipOptions infoTipOptions;
  19.         infoTipOptions.m_StemLocation = CBCGPPopupWindow::BCGPPopupWindowStemLocation_Left;
  20.         m_wndChart.EnableInfoTip(TRUE, &infoTipOptions);//显示提示文本;
  21.         CBCGPChartVisualObject* pChart = m_wndChart.GetChart();//获取图表指针;
  22.         pChart->SetChartType(BCGPChartTorus3D);//
  23.         pChart->SetChartTitle(_T("3D环图表"));//设置图表标题;
  24.         pChart->SetSeriesShadow(true);//数据系列显示阴影;
  25.         //创建一数据系列,添加数据;
  26.         pChart->AddChartData(_T("工控编程吧"), 6700);
  27.         pChart->AddChartData(_T("头条"), 4500);
  28.         pChart->AddChartData(_T("百度"), 2200);
  29.         pChart->AddChartData(_T("微信"), 1500);
  30.         pChart->AddChartData(_T("微博"), 1400);
  31.         pChart->AddChartData(_T("阿里"), 1350);
  32.         pChart->AddChartData(_T("其他"), 1700);
  33.         //添加添加到布局管理器统一管理布局;
  34.         if (GetLayout() == NULL)
  35.                 return bRst;
  36.         CBCGPStaticLayout* pLayout = (CBCGPStaticLayout*)GetLayout();
  37.         if (pLayout == NULL)
  38.                 return bRst;
  39.         pLayout->AddAnchor(m_wndChart.GetDlgCtrlID(), CBCGPStaticLayout::e_MoveTypeNone, CBCGPStaticLayout::e_SizeTypeBoth);
  40.         //
  41.         return bRst;
  42. }
复制代码
以及添加旋转图表控件的点击函数OnRotate,用于旋转图表。
  1. void CMy123View::OnRotate()
  2. {
  3.         CBCGPChartVisualObject* pChart = m_wndChart.GetChart();
  4.         ASSERT_VALID(pChart);

  5.         int xDelta = 10;
  6.         double yDelta = 10.;

  7.         for (int i = 0; i < pChart->GetSeriesCount(); i++)
  8.         {
  9.                 CBCGPChartPieSeries* pSeries = DYNAMIC_DOWNCAST(CBCGPChartPieSeries, pChart->GetSeries(i));
  10.                 ASSERT_VALID(pSeries);

  11.                 int nRotationAngle = pSeries->GetPieRotation();
  12.                 double dblPieAngle = pSeries->GetPieAngle();

  13.                 switch (m_wndRotate.GetRotationObject()->GetClicked())
  14.                 {
  15.                 case CBCGPRotationObject::BCGP_ROTATION_UP:
  16.                         dblPieAngle -= yDelta;
  17.                         if (dblPieAngle < 1.)
  18.                         {
  19.                                 dblPieAngle = 1.;
  20.                         }
  21.                         break;

  22.                 case CBCGPRotationObject::BCGP_ROTATION_DOWN:
  23.                         dblPieAngle += yDelta;
  24.                         break;

  25.                 case CBCGPRotationObject::BCGP_ROTATION_LEFT:
  26.                         nRotationAngle -= xDelta;
  27.                         break;

  28.                 case CBCGPRotationObject::BCGP_ROTATION_RIGHT:
  29.                         nRotationAngle += xDelta;
  30.                         break;

  31.                 case CBCGPRotationObject::BCGP_ROTATION_RESET:
  32.                         nRotationAngle = 0;
  33.                         dblPieAngle = 45.;
  34.                         break;
  35.                 }

  36.                 pSeries->SetPieRotation(nRotationAngle);
  37.                 pSeries->SetPieAngle(dblPieAngle);
  38.         }
  39.         pChart->SetDirty(true,true);
  40. }
复制代码
最后就是三个按钮控件的添加,实现对应图表属性的设置。
  1. void CMy123View::OnBnClickedButton1()
  2. {
  3.         static int nIndex=0,nShow=0;
  4.         CBCGPChartVisualObject* pChart = m_wndChart.GetChart();
  5.         pChart->ShowDataLabels(TRUE);
  6.         BCGPChartDataLabelOptions dataLabelOptions = pChart->GetDataLabelOptions();
  7.         dataLabelOptions.m_position = (BCGPChartDataLabelOptions::LabelPosition)(nIndex==5?nIndex-1:nIndex);
  8.         dataLabelOptions.m_bUnderlineDataLabel = TRUE;
  9.         dataLabelOptions.m_content = nShow>4 ? BCGPChartDataLabelOptions::LC_DP_INDEX : BCGPChartDataLabelOptions::LC_PIE_NAME_PERCENTAGE;
  10.         dataLabelOptions.m_bDrawDataLabelBorder = dataLabelOptions.m_position != BCGPChartDataLabelOptions::LP_DEFAULT_POS && dataLabelOptions.m_position != BCGPChartDataLabelOptions::LP_OUTSIDE_END;
  11.         pChart->SetDataLabelsOptions(dataLabelOptions);
  12.         for (int i = 0; i < pChart->GetSeriesCount(); i++)
  13.         {
  14.                 CBCGPChartPieSeries* pSeries = DYNAMIC_DOWNCAST(CBCGPChartPieSeries, pChart->GetSeries(i));
  15.             pSeries->SetLegendLabelContent(nShow>4 ?
  16.                 (BCGPChartDataLabelOptions::LabelContent)(BCGPChartDataLabelOptions::LC_PIE_NAME_PERCENTAGE | BCGPChartDataLabelOptions::LC_DP_INDEX) :
  17.              BCGPChartDataLabelOptions::LC_DEFAULT_CONTENT);
  18.         }
  19.         pChart->Redraw();
  20.         //
  21.         nIndex++;
  22.         nIndex = nIndex>4?0:nIndex;
  23.         nShow++;
  24.         nShow = nShow>8?0:nShow;
  25. }


  26. void CMy123View::OnBnClickedButton2()
  27. {
  28.         static bool bExplose=false;
  29.         bExplose = !bExplose;
  30.         CBCGPChartVisualObject* pChart = m_wndChart.GetChart();
  31.         for (int i = 0; i < pChart->GetSeriesCount(); i++)
  32.         {
  33.                 CBCGPChartPieSeries* pSeries = DYNAMIC_DOWNCAST(CBCGPChartPieSeries, pChart->GetSeries(i));
  34.                 pSeries->SetPieExplosion(bExplose ? 10 : 0);//设置圆饼图每个数据爆炸像素大小;
  35.                 pSeries->SetDataPointPieExplosion(bExplose ? 20 : 0, 0);//设置第0个数据点的爆炸像素大小;
  36.         }
  37.         pChart->SetDirty(true,true);;//图表重绘设置生效;
  38. }


  39. void CMy123View::OnBnClickedButton3()
  40. {
  41.         static bool bFit = false;
  42.         bFit = !bFit;
  43.         CBCGPChartVisualObject* pChart = m_wndChart.GetChart();
  44.         for (int i = 0; i < pChart->GetSeriesCount(); i++)
  45.         {
  46.                 CBCGPChartPieSeries* pSeries = DYNAMIC_DOWNCAST(CBCGPChartPieSeries, pChart->GetSeries(i));
  47.                 pSeries->EnableFitDiagramArea(bFit);//设置圆饼图填充图表区域;
  48.         }
  49.         pChart->SetDirty(true,true);;//图表重绘设置生效;
  50. }
复制代码
例程是基于MFC扩展库编程的,可以网站搜索下载。
例程源代码下载地址:
游客,为过滤非法行为,全站隐藏资源仅对充值会员开放进入升级

回复

使用道具 举报

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