QQ登录

只需一步,快速开始

MFC扩展编程实例3D簇状与叠加条形图创建与交互操作

[ 复制链接 ]
MFC扩展编程实例3D簇状与叠加条形图创建与交互操作

当前例程创建了一个三维簇状条形图,通过修改一函数参数还可以创建叠加形式的条形图。
另外还可以对图表进行交互操作。
例程界面如下:

23.MFC扩展编程实例3D簇状与叠加条形图创建与交互操作

23.MFC扩展编程实例3D簇状与叠加条形图创建与交互操作


界面显示的是一个百分比的叠加条形图。
创建有四个数据系列,每两个数据系列叠加显示为一柱形,每两柱形并列显示。
显现了并列显示的带百分比的叠加矩形图。

下面是例程实现过程与关键代码。
创建基于class CMy123View : public CBCGPFormView的单文档工程。
在视窗类的对话框资源上添加两图片控件,修改ID为IDC_ROTATE,IDC_CHART,用于操作与显示图表。
还有一个编辑框ID,默认为IDC_EDIT1.
添加视窗的成员变量与函数。
        CBCGPChartCtrl      m_wndChart;
        CBCGPRotationCtrl        m_wndRotate;
    void RotateChart(CBCGPRotationObject::RotationElement hit, double xDelta = 10., double yDelta = 10., double persperctiveDelta = 0.1);

现添加视窗的虚函数,用于初始化变量。
  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.         m_wndRotate.SubclassDlgItem(IDC_ROTATE,this);
  5.         m_wndRotate.GetRotationObject()->SetAutorepeatMode(100);
  6.         m_wndRotate.GetRotationObject()->SetColorTheme(CBCGPRotationObject::BCGP_COLOR_THEME_VISUAL_MANAGER);
  7.         m_wndRotate.GetRotationObject()->EnablePart(CBCGPRotationObject::BCGP_ROTATION_CLOCKWISE, FALSE);
  8.         m_wndRotate.GetRotationObject()->EnablePart(CBCGPRotationObject::BCGP_ROTATION_COUNTER_CLOCKWISE, FALSE);
  9.         m_wndRotate.GetRotationObject()->EnableFlatIcons();
  10.         //获取图表指针;
  11.         m_wndChart.SubclassDlgItem(IDC_CHART,this);//子类化图表;
  12.         CBCGPChartVisualObject* pChart = m_wndChart.GetChart();
  13.         pChart->SetChartTitle(_T("3D簇状与并列叠加条形图"));//图表标题设置;
  14.         pChart->SetThemeOpacity(70);//图表主题透明度设置;
  15.         pChart->EnableMouseTrackingMode(BCGPChartHitInfo::HIT_DIAGRAM);
  16.         BCGPChartCategory category = BCGPChartBar3D;//图表种类,F12查看全部;
  17.         BCGPChartType type = BCGP_CT_100STACKED ;//BCGP_CT_STACKED;//BCGP_CT_100STACKED;//图表类型,按F12查看全部;
  18.         pChart->SetChartType(category, type);//设置图表类别;
  19. //        pChart->GetDiagram3D()->SetGrouped(TRUE, FALSE);//配合BCGP_CT_SIMPLE可设置为簇状类型图表;
  20.         //设置3D背部与底部;
  21.         DWORD dwoFlags = CBCGPChartDiagram3D::DWO_OUTLINE_ALL;
  22.         dwoFlags |= (CBCGPChartDiagram3D::DWO_DRAW_ALL_WALLS | CBCGPChartDiagram3D::DWO_DRAW_FLOOR);
  23.         pChart->GetDiagram3D()->SetDrawWallOptions((CBCGPChartDiagram3D::DrawWallOptions)dwoFlags);
  24.         pChart->GetDiagram3D()->SetThickWallsAndFloor(true);
  25.         //创建4个数据系列;
  26.         CBCGPChartBarSeries* pBarSeries1 = DYNAMIC_DOWNCAST(CBCGPChartBarSeries, pChart->CreateSeries(_T("能源")));
  27.         CBCGPChartBarSeries* pBarSeries2 = DYNAMIC_DOWNCAST(CBCGPChartBarSeries, pChart->CreateSeries(_T("税收")));
  28.         CBCGPChartBarSeries* pBarSeries3 = DYNAMIC_DOWNCAST(CBCGPChartBarSeries, pChart->CreateSeries(_T("维护")));
  29.         CBCGPChartBarSeries* pBarSeries4 = DYNAMIC_DOWNCAST(CBCGPChartBarSeries, pChart->CreateSeries(_T("其他")));
  30.         //将系列设置相同组ID,配合BCGP_CT_STACKED,BCGP_CT_100STACKED可实现并列显示;
  31.         pBarSeries1->SetGroupID(0);
  32.         pBarSeries2->SetGroupID(0);
  33.         pBarSeries3->SetGroupID(1);
  34.         pBarSeries4->SetGroupID(1);
  35.        
  36.         //向四个数据系列添加数据;
  37.         srand((unsigned)time(NULL));
  38.         COleDateTime now = COleDateTime::GetCurrentTime();
  39.         CString sYear;
  40.         for(int i=5;i>0;i--)
  41.         {
  42.                 sYear.Format(_T("%d"), now.GetYear() - i);
  43.                 pBarSeries1->AddDataPoint(sYear, rand()%20+1);
  44.         }

  45.         pBarSeries2->AddDataPoint(10);
  46.         pBarSeries2->AddDataPoint(12);
  47.         pBarSeries2->AddDataPoint(15);
  48.         pBarSeries2->AddDataPoint(17);
  49.         pBarSeries2->AddDataPoint(12);

  50.         pBarSeries3->AddDataPoint(5);
  51.         pBarSeries3->AddDataPoint(7);
  52.         pBarSeries3->AddDataPoint(11);
  53.         pBarSeries3->AddDataPoint(14);
  54.         pBarSeries3->AddDataPoint(19);

  55.         pBarSeries4->AddDataPoint(2);
  56.         pBarSeries4->AddDataPoint(3);
  57.         pBarSeries4->AddDataPoint(5);
  58.         pBarSeries4->AddDataPoint(3);
  59.         pBarSeries4->AddDataPoint(2);

  60.         //添加添加到布局管理器统一管理布局;
  61.         if (GetLayout() == NULL)
  62.                 return bRst;
  63.         CBCGPStaticLayout* pLayout = (CBCGPStaticLayout*)GetLayout();
  64.         if (pLayout == NULL)
  65.                 return bRst;
  66.         pLayout->AddAnchor(m_wndChart.GetDlgCtrlID(), CBCGPStaticLayout::e_MoveTypeNone, CBCGPStaticLayout::e_SizeTypeBoth);
  67.         //
  68.         return bRst;
  69. }
复制代码
上创建图表时,关键代码为
BCGPChartCategory category = BCGPChartBar3D;//图表种类,F12查看全部;
BCGPChartType type = BCGP_CT_100STACKED ;//BCGP_CT_STACKED;//BCGP_CT_100STACKED;//图表类型,按F12查看全部;
pChart->SetChartType(category, type);//设置图表类别;
使用参数BCGP_CT_100STACKED 或BCGP_CT_STACKED可以创建叠加类型的条形图表。
使用参数BCGP_CT_SIMPLE再配合pChart->GetDiagram3D()->SetGrouped(TRUE, FALSE);
可以创建三维的簇状类型条形图表。

图表创建后,就是实现对图表的平移等操作。
关联控件m_wndRotate的点击函数实现通过控件对图片旋转操作。
afx_msg void OnRotate();
ON_BN_CLICKED(IDC_ROTATE, OnRotate)

添加鼠标点击与移动函数,实现对图表交互旋转平移操作。
        afx_msg LRESULT OnMouseTrack(WPARAM wp, LPARAM lp);
        afx_msg LRESULT OnMouseDown(WPARAM wp, LPARAM lp);

    ON_REGISTERED_MESSAGE(BCGM_ON_CHART_MOUSE_TRACK, OnMouseTrack)
        ON_REGISTERED_MESSAGE(BCGM_ON_CHART_MOUSE_DOWN, OnMouseDown)

函数的定义及另外两设置图表属性的按钮函数可以下载例程查看。
例程使用到的MFC扩展库可以网站搜索下载,库带有中文版本向导与视屏教程。
例程源代码下载:
请点击此处下载

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

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

文件名称:23.MFC扩展编程实例3D簇状与叠加条形图创建与交互操作.rar 
文件大小:83.44 KB  售价:2金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我


  

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

  

如果您着急,充值会员可直接联系发您资料!

  

QQ联系我

微信扫扫联系我

  



回复

使用道具 举报

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