QQ登录

只需一步,快速开始

上位机MFC扩展编程实例图表图例标题网格布局排序

[ 复制链接 ]
上位机MFC扩展编程实例图表图例标题网格布局排序

默认每个图表都会有一个图例来说明数据系列的含义。
图例也有几个组成部分可以独立属性设置,还可以将多个图表图例放在一起显示。
当前例程创建了两个图表,共同使用一个图例来表达系列信息。
可以显示隐藏图例的标题,网格,指定图表的名称与系列。
还实现了图例水平垂直显示布局功能。
效果如下图:
2020-01-08_221308.jpg

界面创建有两个图表,分别嵌入于同一个容器来管理。
点击界面上按钮图例图表1,图例图表2,可以显示出图表1和2的图例信息。
点击图例标题,图例图表名,图例表格可以显示图例对应标题,图表名称与图例的网格。
点击图例水平/垂直,可以水平方向或垂直方向显示图例。
点击图例内容排版,可以使图例在水平方向显示时,左中右显示,在垂直方向显示出,上中下显示。

例程源代码在后边下载,例程用到的扩展库可以搜索BCGP下载。
下面是例程创建过程与关键代码。

1.首先创建基于CBCGPFormView的单文档程序。
在视窗类中添加自定义变量与函数:
        //CBCGPChartCtrl m_wndChart;
        CBCGPVisualContainerCtrl            m_wndContainer;//容器;
        CBCGPChartVisualObject*                        m_pChart1;//图表;
        CBCGPChartVisualObject*                        m_pChart2;
        CBCGPChartLegendVisualObject*        m_pLegend;//图例;
        int                             m_nLegendAlignment;
        void                            ResizeChart();

  1. void CMy123View::ResizeChart()
  2. {
  3.         CBCGPVisualContainer* pContainer = m_wndContainer.GetVisualContainer();
  4.         ASSERT_VALID(pContainer);
  5.         if (pContainer == NULL || pContainer->GetCount() == 0)
  6.                 return;
  7.         ASSERT_VALID(m_pChart1);
  8.         ASSERT_VALID(m_pChart2);
  9.         ASSERT_VALID(m_pLegend);
  10.         //
  11.        
  12.         BOOL bLegendTitle = ((CButton*)GetDlgItem(IDC_CHECK1))->GetCheck();
  13.         BOOL bLegendGrid = ((CButton*)GetDlgItem(IDC_CHECK2))->GetCheck();
  14.         BOOL bLegendVert = ((CButton*)GetDlgItem(IDC_CHECK3))->GetCheck();
  15.         BOOL bLegendChartName = ((CButton*)GetDlgItem(IDC_CHECK4))->GetCheck();
  16.         BOOL bLegendChart1 = ((CButton*)GetDlgItem(IDC_CHECK5))->GetCheck();
  17.         BOOL bLegendChart2 = ((CButton*)GetDlgItem(IDC_CHECK6))->GetCheck();
  18.         //
  19.         m_pLegend->ShowLegendTitle(bLegendTitle,_T("图例标题"));
  20.         m_pLegend->m_legendStyle.m_bDrawHorizontalGridLines = m_pLegend->m_legendStyle.m_bDrawVerticalGridLines=bLegendGrid;
  21.         m_pLegend->SetVerticalLayout(bLegendVert);
  22.         m_pLegend->ShowChartNameInLegend(bLegendChartName);
  23.         if(bLegendChart1)
  24.                 m_pLegend->AddRelatedChart(m_pChart1);//图表的图表由此图表管理;
  25.         else
  26.                 m_pLegend->RemoveRelatedChart(m_pChart1);
  27.         if(bLegendChart2)
  28.                 m_pLegend->AddRelatedChart(m_pChart2);
  29.         else
  30.                 m_pLegend->RemoveRelatedChart(m_pChart2);

  31.         m_pLegend->SetVerticalAlignment((CBCGPChartLegendVisualObject::LegendAlignment)m_nLegendAlignment);
  32.         m_pLegend->SetHorizontalAlignment((CBCGPChartLegendVisualObject::LegendAlignment)m_nLegendAlignment);
  33.         //
  34.         const double margin = 2.;
  35.         CBCGPRect rc = pContainer->GetRect();//容器区域;
  36.         CBCGPRect rectLegend = rc;
  37.         CBCGPSize sizeLegend = m_pLegend->GetLegendSize();
  38.         if (bLegendVert)
  39.         {
  40.                 double dblMaxLegendWidth = 3.0 * rc.Width() / 4;
  41.                 if (sizeLegend.cx > dblMaxLegendWidth)
  42.                 {
  43.                         sizeLegend.cx = dblMaxLegendWidth;
  44.                         m_pLegend->SetAdjustLegendSizeByTitleSize(FALSE, FALSE);
  45.                 }
  46.                 else
  47.                 {
  48.                         m_pLegend->SetAdjustLegendSizeByTitleSize(TRUE, FALSE);
  49.                 }
  50.                 rectLegend.left = rectLegend.right - sizeLegend.cx - margin;
  51.                 rc.right = rectLegend.left;
  52.         }
  53.         else
  54.         {
  55.                 rectLegend.top = rectLegend.bottom - sizeLegend.cy - margin;
  56.                 rc.bottom = rectLegend.top;
  57.         }
  58.         m_pLegend->SetRect(rectLegend);
  59. //图表一区域设置;
  60.         CBCGPRect rectChart1 = rc;
  61.         rectChart1.SetSize(rc.Width(), rc.Height() / 2);
  62.         m_pChart1->SetRect(rectChart1);
  63. //图表二区域设置;
  64.         CBCGPRect rectChart2 = rectChart1;
  65.         rectChart2.OffsetRect(0, rc.Height() / 2);
  66.         m_pChart2->SetRect(rectChart2);
  67. //
  68.         CBCGPBrush brFill = m_pChart1->GetColors().m_brChartFillColor;
  69.     m_wndContainer.GetVisualContainer()->SetFillBrush(brFill);
  70.         m_wndContainer.RedrawWindow();
  71. }
复制代码
2.在视窗类中添加虚函数Create,用于创建前面添加的图表与容器变量。
例程有用到布局管理器,所以在视窗类构造函数中记得调用函数EnableLayout();开启,
下面是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_nLegendAlignment = 0;
  5.         m_wndContainer.SubclassDlgItem(IDC_CHART,this);
  6.         CBCGPVisualContainer* pContainer = m_wndContainer.GetVisualContainer();
  7.         // 设置图表一;
  8.         m_pChart1 = new CBCGPChartVisualObject(pContainer);
  9.         m_pChart1->SetChartTitle(_T("1.图表"));
  10.         CBCGPChartSeries* pSeries1 = m_pChart1->CreateSeries(_T("系列 1"));
  11.         CBCGPChartSeries* pSeries2 = m_pChart1->CreateSeries(_T("系列 2"));
  12.         pSeries1->AddDataPoint(1.);
  13.         pSeries1->AddDataPoint(2.);
  14.         pSeries1->AddDataPoint(3.);
  15.         pSeries1->AddDataPoint(2.);
  16.         pSeries1->AddDataPoint(4.);
  17.         pSeries2->AddDataPoint(3.);
  18.         pSeries2->AddDataPoint(4.);
  19.         pSeries2->AddDataPoint(6.);
  20.         pSeries2->AddDataPoint(3.);
  21.         pSeries2->AddDataPoint(8.);
  22.         m_pChart1->ShowDataMarkers(TRUE, -1, BCGPChartMarkerOptions::MS_RHOMBUS);
  23.         m_pChart1->SetLegendPosition(BCGPChartLayout::LP_NONE);
  24.        
  25.         // 设置图表二;
  26.         m_pChart2 = new CBCGPChartVisualObject(pContainer);
  27.         m_pChart2->SetChartTitle(_T("2.图表"));
  28.         m_pChart2->SetChartType(BCGPChartDoughnut);
  29.         m_pChart2->AddChartData(_T("A1"), 10);
  30.         m_pChart2->AddChartData(_T("A2"), 20);
  31.         m_pChart2->AddChartData(_T("A3"), 30);
  32.         m_pChart2->AddChartData(_T("A4"), 20);
  33.         m_pChart2->AddChartData(_T("A5"), 15);
  34.         m_pChart2->SetLegendPosition(BCGPChartLayout::LP_NONE);

  35.         m_pLegend = new CBCGPChartLegendVisualObject(pContainer);       
  36. //        m_pLegend->AddRelatedChart(m_pChart1);
  37. //        m_pLegend->AddRelatedChart(m_pChart2);
  38.         ResizeChart();// 设置与布局图例;
  39.         //添加添加到布局管理器统一管理布局;
  40.         if (GetLayout() == NULL)
  41.                 return bRst;
  42.         CBCGPStaticLayout* pLayout = (CBCGPStaticLayout*)GetLayout();
  43.         if (pLayout == NULL)
  44.                 return bRst;
  45.         pLayout->AddAnchor(m_wndContainer.GetDlgCtrlID(), CBCGPStaticLayout::e_MoveTypeNone, CBCGPStaticLayout::e_SizeTypeBoth);
  46.         //
  47.         return bRst;
  48. }
复制代码
3.窗口大小变化消息WM_SIZE处理函数,
在用户更改窗口大小时,也更改图表大小。
  1. void CMy123View::OnSize(UINT nType, int cx, int cy)
  2. {
  3.         CBCGPFormView::OnSize(nType, cx, cy);
  4.         ResizeChart();
  5. }
复制代码


4.最后就是如界面添加单选框,按钮,与ID为IDC_CHART的图表控件。
关联按钮的点击函数,在点击函数内调用ResizeChart函数。
  1. void CMy123View::OnBnClickedCheck1()
  2. {
  3.         ResizeChart();
  4. }
  5. void CMy123View::OnBnClickedCheck2()
  6. {
  7.         ResizeChart();
  8. }
  9. void CMy123View::OnBnClickedCheck3()
  10. {
  11.         ResizeChart();
  12. }
  13. void CMy123View::OnBnClickedCheck4()
  14. {
  15.         ResizeChart();
  16. }
  17. void CMy123View::OnBnClickedCheck5()
  18. {
  19.         ResizeChart();
  20. }
  21. void CMy123View::OnBnClickedCheck6()
  22. {
  23.         ResizeChart();
  24. }
  25. void CMy123View::OnBnClickedButton1()
  26. {
  27.         m_nLegendAlignment++;
  28.         if(m_nLegendAlignment>2)
  29.                 m_nLegendAlignment=0;
  30.         ResizeChart();
  31. }
复制代码
例程源代码下载:
请点击此处下载

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

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

文件名称:上位机MFC扩展编程实例图表图例标题网格布局排序.rar 
文件大小:80.92 KB  售价:3金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我


  

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

  

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

  

QQ联系我

微信扫扫联系我

  



回复

使用道具 举报

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