上位机MFC扩展编程实例图表图例标题网格布局排序 
 
默认每个图表都会有一个图例来说明数据系列的含义。 
图例也有几个组成部分可以独立属性设置,还可以将多个图表图例放在一起显示。 
当前例程创建了两个图表,共同使用一个图例来表达系列信息。 
可以显示隐藏图例的标题,网格,指定图表的名称与系列。 
还实现了图例水平垂直显示布局功能。 
效果如下图: 
 
 
 
界面创建有两个图表,分别嵌入于同一个容器来管理。 
点击界面上按钮图例图表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(); 
 
- void CMy123View::ResizeChart()
 
 - {
 
 -         CBCGPVisualContainer* pContainer = m_wndContainer.GetVisualContainer();
 
 -         ASSERT_VALID(pContainer);
 
 -         if (pContainer == NULL || pContainer->GetCount() == 0)
 
 -                 return;
 
 -         ASSERT_VALID(m_pChart1);
 
 -         ASSERT_VALID(m_pChart2);
 
 -         ASSERT_VALID(m_pLegend);
 
 -         //
 
 -         
 
 -         BOOL bLegendTitle = ((CButton*)GetDlgItem(IDC_CHECK1))->GetCheck();
 
 -         BOOL bLegendGrid = ((CButton*)GetDlgItem(IDC_CHECK2))->GetCheck();
 
 -         BOOL bLegendVert = ((CButton*)GetDlgItem(IDC_CHECK3))->GetCheck();
 
 -         BOOL bLegendChartName = ((CButton*)GetDlgItem(IDC_CHECK4))->GetCheck();
 
 -         BOOL bLegendChart1 = ((CButton*)GetDlgItem(IDC_CHECK5))->GetCheck();
 
 -         BOOL bLegendChart2 = ((CButton*)GetDlgItem(IDC_CHECK6))->GetCheck();
 
 -         //
 
 -         m_pLegend->ShowLegendTitle(bLegendTitle,_T("图例标题"));
 
 -         m_pLegend->m_legendStyle.m_bDrawHorizontalGridLines = m_pLegend->m_legendStyle.m_bDrawVerticalGridLines=bLegendGrid;
 
 -         m_pLegend->SetVerticalLayout(bLegendVert);
 
 -         m_pLegend->ShowChartNameInLegend(bLegendChartName);
 
 -         if(bLegendChart1)
 
 -                 m_pLegend->AddRelatedChart(m_pChart1);//图表的图表由此图表管理;
 
 -         else
 
 -                 m_pLegend->RemoveRelatedChart(m_pChart1);
 
 -         if(bLegendChart2)
 
 -                 m_pLegend->AddRelatedChart(m_pChart2);
 
 -         else
 
 -                 m_pLegend->RemoveRelatedChart(m_pChart2);
 
  
-         m_pLegend->SetVerticalAlignment((CBCGPChartLegendVisualObject::LegendAlignment)m_nLegendAlignment);
 
 -         m_pLegend->SetHorizontalAlignment((CBCGPChartLegendVisualObject::LegendAlignment)m_nLegendAlignment);
 
 -         //
 
 -         const double margin = 2.;
 
 -         CBCGPRect rc = pContainer->GetRect();//容器区域;
 
 -         CBCGPRect rectLegend = rc;
 
 -         CBCGPSize sizeLegend = m_pLegend->GetLegendSize();
 
 -         if (bLegendVert)
 
 -         {
 
 -                 double dblMaxLegendWidth = 3.0 * rc.Width() / 4;
 
 -                 if (sizeLegend.cx > dblMaxLegendWidth)
 
 -                 {
 
 -                         sizeLegend.cx = dblMaxLegendWidth;
 
 -                         m_pLegend->SetAdjustLegendSizeByTitleSize(FALSE, FALSE);
 
 -                 }
 
 -                 else
 
 -                 {
 
 -                         m_pLegend->SetAdjustLegendSizeByTitleSize(TRUE, FALSE);
 
 -                 }
 
 -                 rectLegend.left = rectLegend.right - sizeLegend.cx - margin;
 
 -                 rc.right = rectLegend.left;
 
 -         }
 
 -         else
 
 -         {
 
 -                 rectLegend.top = rectLegend.bottom - sizeLegend.cy - margin;
 
 -                 rc.bottom = rectLegend.top;
 
 -         }
 
 -         m_pLegend->SetRect(rectLegend);
 
 - //图表一区域设置;
 
 -         CBCGPRect rectChart1 = rc;
 
 -         rectChart1.SetSize(rc.Width(), rc.Height() / 2);
 
 -         m_pChart1->SetRect(rectChart1);
 
 - //图表二区域设置;
 
 -         CBCGPRect rectChart2 = rectChart1;
 
 -         rectChart2.OffsetRect(0, rc.Height() / 2);
 
 -         m_pChart2->SetRect(rectChart2);
 
 - //
 
 -         CBCGPBrush brFill = m_pChart1->GetColors().m_brChartFillColor;
 
 -     m_wndContainer.GetVisualContainer()->SetFillBrush(brFill);
 
 -         m_wndContainer.RedrawWindow();
 
 - }
 
  复制代码 2.在视窗类中添加虚函数Create,用于创建前面添加的图表与容器变量。 
例程有用到布局管理器,所以在视窗类构造函数中记得调用函数EnableLayout();开启, 
下面是create函数代码。 
- BOOL CMy123View::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
 
 - {
 
 -         BOOL bRst = CBCGPFormView::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);;
 
  
-         m_nLegendAlignment = 0;
 
 -         m_wndContainer.SubclassDlgItem(IDC_CHART,this);
 
 -         CBCGPVisualContainer* pContainer = m_wndContainer.GetVisualContainer();
 
 -         // 设置图表一;
 
 -         m_pChart1 = new CBCGPChartVisualObject(pContainer);
 
 -         m_pChart1->SetChartTitle(_T("1.图表"));
 
 -         CBCGPChartSeries* pSeries1 = m_pChart1->CreateSeries(_T("系列 1"));
 
 -         CBCGPChartSeries* pSeries2 = m_pChart1->CreateSeries(_T("系列 2"));
 
 -         pSeries1->AddDataPoint(1.);
 
 -         pSeries1->AddDataPoint(2.);
 
 -         pSeries1->AddDataPoint(3.);
 
 -         pSeries1->AddDataPoint(2.);
 
 -         pSeries1->AddDataPoint(4.);
 
 -         pSeries2->AddDataPoint(3.);
 
 -         pSeries2->AddDataPoint(4.);
 
 -         pSeries2->AddDataPoint(6.);
 
 -         pSeries2->AddDataPoint(3.);
 
 -         pSeries2->AddDataPoint(8.);
 
 -         m_pChart1->ShowDataMarkers(TRUE, -1, BCGPChartMarkerOptions::MS_RHOMBUS);
 
 -         m_pChart1->SetLegendPosition(BCGPChartLayout::LP_NONE);
 
 -         
 
 -         // 设置图表二;
 
 -         m_pChart2 = new CBCGPChartVisualObject(pContainer);
 
 -         m_pChart2->SetChartTitle(_T("2.图表"));
 
 -         m_pChart2->SetChartType(BCGPChartDoughnut);
 
 -         m_pChart2->AddChartData(_T("A1"), 10);
 
 -         m_pChart2->AddChartData(_T("A2"), 20);
 
 -         m_pChart2->AddChartData(_T("A3"), 30);
 
 -         m_pChart2->AddChartData(_T("A4"), 20);
 
 -         m_pChart2->AddChartData(_T("A5"), 15);
 
 -         m_pChart2->SetLegendPosition(BCGPChartLayout::LP_NONE);
 
  
-         m_pLegend = new CBCGPChartLegendVisualObject(pContainer);        
 
 - //        m_pLegend->AddRelatedChart(m_pChart1);
 
 - //        m_pLegend->AddRelatedChart(m_pChart2);
 
 -         ResizeChart();// 设置与布局图例;
 
 -         //添加添加到布局管理器统一管理布局;
 
 -         if (GetLayout() == NULL)
 
 -                 return bRst;
 
 -         CBCGPStaticLayout* pLayout = (CBCGPStaticLayout*)GetLayout();
 
 -         if (pLayout == NULL)
 
 -                 return bRst;
 
 -         pLayout->AddAnchor(m_wndContainer.GetDlgCtrlID(), CBCGPStaticLayout::e_MoveTypeNone, CBCGPStaticLayout::e_SizeTypeBoth);
 
 -         //
 
 -         return bRst;
 
 - }
 
 
  复制代码 3.窗口大小变化消息WM_SIZE处理函数, 
在用户更改窗口大小时,也更改图表大小。 
- void CMy123View::OnSize(UINT nType, int cx, int cy) 
 
 - {
 
 -         CBCGPFormView::OnSize(nType, cx, cy);
 
 -         ResizeChart();
 
 - }
 
  复制代码 
 
4.最后就是如界面添加单选框,按钮,与ID为IDC_CHART的图表控件。 
关联按钮的点击函数,在点击函数内调用ResizeChart函数。 
- void CMy123View::OnBnClickedCheck1()
 
 - {
 
 -         ResizeChart();
 
 - }
 
 - void CMy123View::OnBnClickedCheck2()
 
 - {
 
 -         ResizeChart();
 
 - }
 
 - void CMy123View::OnBnClickedCheck3()
 
 - {
 
 -         ResizeChart();
 
 - }
 
 - void CMy123View::OnBnClickedCheck4()
 
 - {
 
 -         ResizeChart();
 
 - }
 
 - void CMy123View::OnBnClickedCheck5()
 
 - {
 
 -         ResizeChart();
 
 - }
 
 - void CMy123View::OnBnClickedCheck6()
 
 - {
 
 -         ResizeChart();
 
 - }
 
 - void CMy123View::OnBnClickedButton1()
 
 - {
 
 -         m_nLegendAlignment++;
 
 -         if(m_nLegendAlignment>2)
 
 -                 m_nLegendAlignment=0;
 
 -         ResizeChart();
 
 - }
 
  复制代码 例程源代码下载: 
      
  如果您认可,可联系功能定制!   如果您着急,充值会员可直接联系发您资料!              
 
 
 |