QQ登录

只需一步,快速开始

MFC扩展编程实例3D线形图表创建与交互操作

[ 复制链接 ]
MFC扩展编程实例3D线形图表创建与交互操作

例程创建了一个三维的线形图表,界面如下。

25.MFC扩展编程实例3D线形图表创建与交互操作

25.MFC扩展编程实例3D线形图表创建与交互操作


界面显示有三个数据系列,也就是三根三维的线条。
线条的标签显示角度也可以设置,三维线条的宽度也可以设置。
通过界面圆形控件可以旋转图表,也可以通过鼠标右键来旋转图表。

下面是例程实现过程与关键代码。
先创建基于class CMy123View : public CBCGPFormView的单文档工程。
在视窗对话框资源中添加两个图片控件,修改ID为IDC_CHART,IDC_ROTATE,
用于显示图表与操作图表 。

在视窗类中添加变量,成员函数与虚函数Create。
        CBCGPChartCtrl      m_wndChart;
        CBCGPRotationCtrl        m_wndRotate;
    void RotateChart(CBCGPRotationObject::RotationElement hit, double xDelta = 10., double yDelta = 10., double persperctiveDelta = 0.1);

在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.         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 = BCGPChartLine3D;//图表种类,F12查看全部;
  17.         BCGPChartType type = BCGP_CT_SIMPLE;//BCGP_CT_100STACKED;//BCGP_CT_STACKED;//图表类型,按F12查看全部;
  18.         pChart->SetChartType(category, type);//设置图表类别;
  19.         //设置XY轴刻度;
  20.         CBCGPChartAxis* pYAxis = pChart->GetChartAxis(BCGP_CHART_Y_PRIMARY_AXIS);
  21.         CBCGPChartAxis* pXAxis = pChart->GetChartAxis(BCGP_CHART_X_PRIMARY_AXIS);
  22.         pYAxis->m_majorTickMarkType = CBCGPChartAxis::TMT_CROSS;
  23.         pYAxis->m_minorTickMarkType = CBCGPChartAxis::TMT_CROSS;
  24.         pXAxis->m_majorTickMarkType = CBCGPChartAxis::TMT_CROSS;
  25.         pXAxis->m_minorTickMarkType = CBCGPChartAxis::TMT_CROSS;
  26.         //设置3D场景背部与底部;
  27.         DWORD dwoFlags = CBCGPChartDiagram3D::DWO_OUTLINE_ALL;
  28.         dwoFlags |= (CBCGPChartDiagram3D::DWO_DRAW_ALL_WALLS | CBCGPChartDiagram3D::DWO_DRAW_FLOOR);
  29.         pChart->GetDiagram3D()->SetDrawWallOptions((CBCGPChartDiagram3D::DrawWallOptions)dwoFlags);
  30.         pChart->GetDiagram3D()->SetThickWallsAndFloor(true);
  31.         //创建数据系列;
  32.         CBCGPChartSeries* pSeries1 = DYNAMIC_DOWNCAST(CBCGPChartSeries, pChart->CreateSeries(_T("能源")));
  33.         CBCGPChartSeries* pSeries2 = DYNAMIC_DOWNCAST(CBCGPChartSeries, pChart->CreateSeries(_T("税收")));
  34.         CBCGPChartSeries* pSeries3 = DYNAMIC_DOWNCAST(CBCGPChartSeries, pChart->CreateSeries(_T("维护")));
  35.         //数据系列添加数据;
  36.         srand((unsigned)time(NULL));
  37.         COleDateTime now = COleDateTime::GetCurrentTime();
  38.         CString sYear;
  39.         for(int i=5;i>0;i--)
  40.         {
  41.                 sYear.Format(_T("%d"), now.GetYear() - i);
  42.                 pSeries1->AddDataPoint(sYear, rand()%20+1);
  43.         }
  44.         pSeries2->AddDataPoint(9.);
  45.         pSeries2->AddDataPoint(10.);
  46.         pSeries2->AddDataPoint(14.);
  47.         pSeries2->AddDataPoint(11.);
  48.         pSeries2->AddDataPoint(23.);

  49.         pSeries3->AddDataPoint(11.);
  50.         pSeries3->AddDataPoint(7.);
  51.         pSeries3->AddDataPoint(16.);
  52.         pSeries3->AddDataPoint(10.);
  53.         pSeries3->AddDataPoint(13.);

  54.         //添加添加到布局管理器统一管理布局;
  55.         if (GetLayout() == NULL)
  56.                 return bRst;
  57.         CBCGPStaticLayout* pLayout = (CBCGPStaticLayout*)GetLayout();
  58.         if (pLayout == NULL)
  59.                 return bRst;
  60.         pLayout->AddAnchor(m_wndChart.GetDlgCtrlID(), CBCGPStaticLayout::e_MoveTypeNone, CBCGPStaticLayout::e_SizeTypeBoth);
  61.         //
  62.         return bRst;
  63. }
复制代码
创建图表时,关键代码如下。
BCGPChartCategory category = BCGPChartLine3D;//图表种类,F12查看全部;
BCGPChartType type = BCGP_CT_SIMPLE;//BCGP_CT_100STACKED;//BCGP_CT_STACKED;//图表类型,按F12查看全部;
pChart->SetChartType(category, type);//设置图表类别;
创建的是三维线形图表,所以使用了参数BCGPChartLine3D和BCGP_CT_SIMPLE。
如果想创建叠加类型的,可以使用另外参数BCGP_CT_100STACKED;//BCGP_CT_STACKED。

图表创建完成后,就是关联控件变量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)

图表标签显示角度与线条宽度设置,可以选择实现,对应是通过两按钮实现。

  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 nThick = 1;
  14.         CBCGPChartVisualObject* pChart = m_wndChart.GetChart();
  15.         for (int i = 0; i < pChart->GetSeriesCount(); i++)
  16.         {
  17.                 CBCGPChartSeries* pSeries = pChart->GetSeries(i);
  18.                 ASSERT_VALID(pSeries);
  19.                 pSeries->SetDataPoint3DLineThickness(nThick);
  20.         }
  21.         pChart->SetDirty(true,true);
  22.         //
  23.         nThick++;
  24.         nThick = nThick>10?1:nThick;
  25. }
复制代码
记得在视窗类构造函数中开启布局管理器EnableLayout()。
例程用到的MFC扩展库,可以搜索BCGP下载使用。
例程源代码下载:
请点击此处下载

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

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

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


  

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

  

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

  

QQ联系我

微信扫扫联系我

  


回复

使用道具 举报

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