上位机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();
- }
复制代码 例程源代码下载:
如果您认可,可联系功能定制! 如果您着急,充值会员可直接联系发您资料!
|