QQ登录

只需一步,快速开始

MFC扩展编程实例3D簇状柱形图旋转平移缩放操作

[ 复制链接 ]
MFC扩展编程实例3D簇状柱形图旋转平移缩放操作

例程实现对3D图表按钮的旋转平移缩放等常见操作。
界面如下:

18.MFC扩展编程实例3D簇状柱形图旋转平移缩放操作

18.MFC扩展编程实例3D簇状柱形图旋转平移缩放操作

例程界面创建的是3D簇状柱形图表,可以通过库自带的图表操作按钮来左右,上下,斜切旋转图表。
也可以通过鼠标交互形式来操作图表。
按住鼠标右键不放,左右上下移动鼠标,可以下载左右旋转三维图表,代码中注释了斜切操作,可选择使用。
图表的缩放与平移操作,可以按钮键盘左边shift键不放,鼠标点住左键平移,鼠标滚轮前后滚动缩放。
下面是创建过程与关键代码。

先创建基于class CMy123View : public CBCGPFormView的单文档工程。
添加 变量与自定义函数
        CBCGPChartCtrl      m_wndChart;
        CBCGPRotationCtrl        m_wndRotate;
    void RotateChart(CBCGPRotationObject::RotationElement hit, double xDelta = 10., double yDelta = 10., double persperctiveDelta = 0.1);

添加虚函数Create,在函数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 = BCGPChartColumn3D;//图表种类,F12查看全部;
  17.         BCGPChartType type = BCGP_CT_SIMPLE;//图表类型,按F12查看全部;
  18.         pChart->SetChartType(category, type);//设置图表类别;
  19.         pChart->GetDiagram3D()->SetGrouped(TRUE, FALSE);//设置为簇状类型图表;
  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.         //向四个数据系列添加数据;
  31.         srand((unsigned)time(NULL));
  32.         COleDateTime now = COleDateTime::GetCurrentTime();
  33.         CString sYear;
  34.         for(int i=5;i>0;i--)
  35.         {
  36.                 sYear.Format(_T("%d"), now.GetYear() - i);
  37.                 pBarSeries1->AddDataPoint(sYear, rand()%20+1);
  38.         }

  39.         pBarSeries2->AddDataPoint(10);
  40.         pBarSeries2->AddDataPoint(12);
  41.         pBarSeries2->AddDataPoint(15);
  42.         pBarSeries2->AddDataPoint(17);
  43.         pBarSeries2->AddDataPoint(12);

  44.         pBarSeries3->AddDataPoint(5);
  45.         pBarSeries3->AddDataPoint(7);
  46.         pBarSeries3->AddDataPoint(11);
  47.         pBarSeries3->AddDataPoint(14);
  48.         pBarSeries3->AddDataPoint(19);

  49.         pBarSeries4->AddDataPoint(2);
  50.         pBarSeries4->AddDataPoint(3);
  51.         pBarSeries4->AddDataPoint(5);
  52.         pBarSeries4->AddDataPoint(3);
  53.         pBarSeries4->AddDataPoint(2);

  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. }
复制代码
  1. void CMy123View::RotateChart(CBCGPRotationObject::RotationElement hit, double xDelta, double yDelta, double persperctiveDelta)
  2. {
  3.         CBCGPChartVisualObject* pChart = m_wndChart.GetChart();
  4.         if (pChart == NULL)
  5.                 return;
  6.         ASSERT_VALID(pChart);
  7.         CBCGPChartDiagram3D* pDiagram3D = pChart->GetDiagram3D();
  8.         if (pDiagram3D == NULL)
  9.                 return;
  10.         double xRotation = pDiagram3D->GetXRotation();
  11.         double yRotation = pDiagram3D->GetYRotation();
  12.         double dblPerspectivePercent = pDiagram3D->GetPerspectivePercent();
  13.         switch (hit)
  14.         {
  15.         case CBCGPRotationObject::BCGP_ROTATION_RESET:
  16.                 pDiagram3D->Reset(TRUE);
  17.                 return;
  18.         case CBCGPRotationObject::BCGP_ROTATION_UP:
  19.                 yRotation += yDelta;
  20.                 break;
  21.         case CBCGPRotationObject::BCGP_ROTATION_DOWN:
  22.                 yRotation -= yDelta;
  23.                 break;
  24.         case CBCGPRotationObject::BCGP_ROTATION_LEFT:
  25.                 xRotation -= xDelta;
  26.                 break;
  27.         case CBCGPRotationObject::BCGP_ROTATION_RIGHT:
  28.                 xRotation += xDelta;
  29.                 break;
  30.         case CBCGPRotationObject::BCGP_ROTATION_NARROW_FIELD_OF_VIEW:
  31.                 dblPerspectivePercent -= persperctiveDelta;
  32.                 break;
  33.         case CBCGPRotationObject::BCGP_ROTATION_WIDEN_FIELD_OF_VIEW:
  34.                 dblPerspectivePercent += persperctiveDelta;
  35.                 break;
  36.         }
  37.         pDiagram3D->SetPosition(xRotation, yRotation, dblPerspectivePercent);
  38.         pChart->SetDirty(TRUE,TRUE);
  39. }
复制代码
在创建函数中有用到控件ID,请要视窗对话框资源中添加两图片控件,修改ID为IDC_ROTATE,IDC_CHART。
还有一个编辑框,ID修改为IDC_EDIT1。
这样变能够正常创建变量,另外可以在构造函数中调用EnableLayout();以开启布局管理器。

然后变可以关联图表操作控件m_wndRotate的点击函数以实现旋转图表等操作。
  1. afx_msg void OnRotate();
  2. ON_BN_CLICKED(IDC_ROTATE, OnRotate)
  3. void CMy123View::OnRotate()
  4. {
  5.         RotateChart(m_wndRotate.GetRotationObject()->GetClicked());
  6. }
复制代码
如果还想实现鼠标来操作图表,可以再实现对鼠标点击,移动消息的响应。
  1. afx_msg LRESULT OnMouseTrack(WPARAM wp, LPARAM lp);
  2.         afx_msg LRESULT OnMouseDown(WPARAM wp, LPARAM lp);
  3.     ON_REGISTERED_MESSAGE(BCGM_ON_CHART_MOUSE_TRACK, OnMouseTrack)
  4.         ON_REGISTERED_MESSAGE(BCGM_ON_CHART_MOUSE_DOWN, OnMouseDown)
  5. CPoint ptOrigin;
  6. LRESULT CMy123View::OnMouseDown(WPARAM /*wp*/, LPARAM lp)
  7. {
  8.         BCGPChartHitInfo* pHitInfo = (BCGPChartHitInfo*)lp;
  9.         if(pHitInfo->m_nMouseButton ==0)
  10.                 ptOrigin = pHitInfo->m_ptHit;
  11.         return false;
  12. }

  13. LRESULT CMy123View::OnMouseTrack(WPARAM /*wp*/, LPARAM lp)
  14. {
  15.         CBCGPChartVisualObject* pChart = m_wndChart.GetChart();
  16.         if(pChart == NULL)
  17.                 return false;
  18.         BCGPChartHitInfo* pHitInfo = (BCGPChartHitInfo*)lp;
  19.         if(pHitInfo->m_ptHit == CBCGPPoint(-1, -1))
  20.                 return false;
  21.         if(0x8000 & GetKeyState(VK_RBUTTON ) )
  22.         {
  23.                 CString sText;
  24.                 CBCGPPoint pt = pHitInfo->m_ptHit;
  25.                 double p = sqrt( pow(pt.x-ptOrigin.x,2)+pow(pt.y-ptOrigin.y,2) );
  26.                 if(p<10)
  27.                         return false;
  28.                 double dbAng = asin( (pt.y-ptOrigin.y) /p)*(180.0 / 3.1415926);
  29.                
  30.                 //dbAng转换为对应逆时针一圈角度(0-360);
  31.                 if( pt.x>ptOrigin.x)
  32.                 {
  33.                         if(dbAng<0)
  34.                                 dbAng = abs(dbAng);
  35.                         else
  36.                                 dbAng= abs(360-dbAng);
  37.                 }
  38.                 else
  39.                 {
  40.                         if(dbAng<0)
  41.                                 dbAng = 180+dbAng;
  42.                         else
  43.                                 dbAng = 180+dbAng;
  44.                 }
  45.                 sText.Format(_T("%.03lf"),dbAng);
  46.                 SetDlgItemText(IDC_EDIT1,sText);
  47.                 //
  48.                 int nDir=0,nDel=360/16;
  49.                 if(0<=dbAng && dbAng<nDel)
  50.                         nDir = CBCGPRotationObject::BCGP_ROTATION_LEFT;
  51.                 else if(nDel<=dbAng && dbAng<3*nDel)
  52.                         nDir = CBCGPRotationObject::BCGP_ROTATION_NONE;//BCGP_ROTATION_NARROW_FIELD_OF_VIEW;
  53.                 else if(3*nDel<=dbAng && dbAng<5*nDel)
  54.                         nDir = CBCGPRotationObject::BCGP_ROTATION_DOWN;
  55.                 else if(5*nDel<=dbAng && dbAng<7*nDel)
  56.                         nDir = CBCGPRotationObject::BCGP_ROTATION_NONE;//BCGP_ROTATION_CLOCKWISE;
  57.                 else if(7*nDel<=dbAng && dbAng<9*nDel)
  58.                         nDir = CBCGPRotationObject::BCGP_ROTATION_RIGHT;
  59.                 else if(9*nDel<=dbAng && dbAng<11*nDel)
  60.                         nDir = CBCGPRotationObject::BCGP_ROTATION_NONE;//BCGP_ROTATION_WIDEN_FIELD_OF_VIEW;
  61.                 else if(11*nDel<=dbAng && dbAng<13*nDel)
  62.                         nDir = CBCGPRotationObject::BCGP_ROTATION_UP;
  63.                 else if(13*nDel<=dbAng && dbAng<15*nDel)
  64.                         nDir = CBCGPRotationObject::BCGP_ROTATION_NONE;//BCGP_ROTATION_COUNTER_CLOCKWISE;
  65.                 else if(15*nDel<=dbAng && dbAng<360)
  66.                         nDir = CBCGPRotationObject::BCGP_ROTATION_LEFT;
  67.                 RotateChart((CBCGPRotationObject::RotationElement)nDir,10.0,10.0);
  68.         }
  69.         if(0x8000 & GetKeyState(VK_LSHIFT ))
  70.                 pChart->SetZoomScrollConfig(BCGPChartMouseConfig::ZSO_WHEEL_PAN);
  71.         else
  72.                 pChart->SetZoomScrollConfig(BCGPChartMouseConfig::ZSO_NONE);
  73.         ptOrigin = pHitInfo->m_ptHit;
  74.         return false;
  75. }
复制代码
例程中还有对标签显示位置及渐变样式设置,可以选择使用。

例程中使用有MFC扩展库,可以网站下载使用。
例程源代码下载:
请点击此处下载

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

您的用户组是:游客

文件名称:18.MFC扩展编程实例3D簇状柱形图旋转平移缩放操作.rar 
文件大小:82.73 KB 
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我


  

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

  

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

  

QQ联系我

微信扫扫联系我

  



回复

使用道具 举报

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