工控编程吧
标题:
MFC扩展编程实例2D线形与折线图表创建及标签标记线宽样式设置
[打印本页]
作者:
qq263946146
时间:
2020-1-18 14:00
标题:
MFC扩展编程实例2D线形与折线图表创建及标签标记线宽样式设置
MFC扩展编程实例2D线形与折线图表创建及标签标记线宽样式设置
例程实现二维线形图表的创建以及设置图表常见属性,比如设置标签显示角度,
数据标记样式与大小,数据系列线宽与线的样式等。
例程界面如下。
(, 下载次数: 0)
上传
点击文件名下载附件
可以看到例程三个数据系列,因创建的是线形图表,所以数据系列以线条形式显示。
通过界面的几个按钮可以设置图表相关的属性。
多次点击 更改标签角度按钮,可以显示出标签,并以45度为单位更改标签显示的角度。
多次点击标记点大小开头按钮,可以修改标记点不同的外形与大小。
多次点击线形样式按钮,可以循环修改线条的样式与线条的宽度,
其中变包括折线,也就是可以创建折线图表。
下面是例程创建过程 与关键代码。
先创建基于class CMy123View : public CBCGPFormView的单文档工程。
在视窗的对话框资源上添加图片控件,修改ID为IDC_CHART用于显示图表。
在视窗类中添加变量CBCGPChartCtrl m_wndChart及虚函数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_wndChart.SubclassDlgItem(IDC_CHART,this);//子类化图表;
CBCGPChartVisualObject* pChart = m_wndChart.GetChart();
BCGPChartCategory category = BCGPChartLine;//图表种类,F12查看全部;
BCGPChartType type = BCGP_CT_SIMPLE ; //BCGP_CT_100STACKED;//BCGP_CT_STACKED;//图表类型,按F12查看全部;
pChart->SetChartType(category, type);//设置图表类别;
pChart->SetChartTitle(_T("2D线形与折线图表创建及标签标记线宽样式设置"));
//XY轴刻度设置;
CBCGPChartAxis* pYAxis = pChart->GetChartAxis(BCGP_CHART_Y_PRIMARY_AXIS);
CBCGPChartAxis* pXAxis = pChart->GetChartAxis(BCGP_CHART_X_PRIMARY_AXIS);
pYAxis->m_majorTickMarkType = CBCGPChartAxis::TMT_CROSS;
pYAxis->m_minorTickMarkType = CBCGPChartAxis::TMT_CROSS;
pXAxis->m_majorTickMarkType = CBCGPChartAxis::TMT_CROSS;
pXAxis->m_minorTickMarkType = CBCGPChartAxis::TMT_CROSS;
//创建三个个数据系列及添加数据;
CBCGPChartSeries* pSeries1 = DYNAMIC_DOWNCAST(CBCGPChartSeries, pChart->CreateSeries(_T("能源")));
CBCGPChartSeries* pSeries2 = DYNAMIC_DOWNCAST(CBCGPChartSeries, pChart->CreateSeries(_T("税收")));
CBCGPChartSeries* pSeries3 = DYNAMIC_DOWNCAST(CBCGPChartSeries, pChart->CreateSeries(_T("维护")));
srand((unsigned)time(NULL));
COleDateTime now = COleDateTime::GetCurrentTime();
CString sYear;
for(int i=5;i>0;i--)
{
sYear.Format(_T("%d"), now.GetYear() - i);
pSeries1->AddDataPoint(sYear, rand()%20+1);
}
pSeries2->AddDataPoint(9.);
pSeries2->AddDataPoint(15.);
pSeries2->AddDataPoint(19.);
pSeries2->AddDataPoint(21.);
pSeries2->AddDataPoint(23.);
pSeries3->AddDataPoint(2.);
pSeries3->AddDataPoint(3.);
pSeries3->AddDataPoint(16.);
pSeries3->AddDataPoint(19.);
pSeries3->AddDataPoint(19.);
//添加添加到布局管理器统一管理布局;
if (GetLayout() == NULL)
return bRst;
CBCGPStaticLayout* pLayout = (CBCGPStaticLayout*)GetLayout();
if (pLayout == NULL)
return bRst;
pLayout->AddAnchor(m_wndChart.GetDlgCtrlID(), CBCGPStaticLayout::e_MoveTypeNone, CBCGPStaticLayout::e_SizeTypeBoth);
//
return bRst;
}
复制代码
在虚函数中就创建了线形图表,关键代码如下:
BCGPChartCategory category = BCGPChartLine;//图表种类,F12查看全部;
BCGPChartType type = BCGP_CT_SIMPLE ; //BCGP_CT_100STACKED;//BCGP_CT_STACKED;//图表类型,按F12查看全部;
pChart->SetChartType(category, type);//设置图表类别;
例程使用的参数是BCGP_CT_SIMPLE ,表示创建简单的线形图表。
如果还想创建叠加类型的线形图表,可以更改参数为BCGP_CT_STACKED或BCGP_CT_100STACKED。
图表创建后,可以对线条的外观及线条的宽度进行设置,这也是比较直观的属性。
例程对应实现代码如下。
void CMy123View::OnBnClickedButton3()
{
static int nIndex=0;
CBCGPChartVisualObject* pChart = m_wndChart.GetChart();
for (int i = 0; i < pChart->GetSeriesCount(); i++)
{
CBCGPChartSeries* pSeries = pChart->GetSeries(i);
ASSERT_VALID(pSeries);
BCGPChartFormatSeries style = pSeries->GetSeriesFormat();
style.m_curveType = (BCGPChartFormatSeries::ChartCurveType)(nIndex+1);//线类型;
style.SetSeriesOutlineDashStyle((CBCGPStrokeStyle::BCGP_DASH_STYLE)nIndex);
style.SetSeriesLineWidth(nIndex + 2);
pSeries->SetSeriesFormat(style);
}
pChart->Redraw();
//
nIndex++;
nIndex = nIndex>4? 0:nIndex;
}
复制代码
在函数中线形对应为枚举类型,CCT_STEP对应为折线类型。
enum ChartCurveType
{
CCT_NO_LINE,
CCT_LINE,
CCT_SPLINE, // Kochanek-Bartels spline
CCT_SPLINE_HERMITE, // Hermite spline
CCT_STEP,
CCT_REVERSED_STEP
};
例程还实现对数据标签与数据标记点的设置,
对应两个函数如下。
void CMy123View::OnBnClickedButton1()//图表修改数据标签位置;
{
static int nAng=0;
CBCGPChartVisualObject* pChart = m_wndChart.GetChart();
pChart->ShowDataLabels(true,true,true,nAng);
pChart->Redraw();
//
nAng+=45;
nAng = nAng>360?45:nAng;
}
void CMy123View::OnBnClickedButton2()
{
static int n=0;
CBCGPChartVisualObject* pChart = m_wndChart.GetChart();
pChart->ShowDataMarkers(true, n*2+4, (BCGPChartMarkerOptions::MarkerShape)n);
pChart->Redraw();
//
n++;
n = n>3?0:n;
}
复制代码
相对来说,创建线形图表也很简单,例程用到的MFC扩展库可以在网站搜索下载。
例程源代码下载:
(, 下载次数: 0)
上传
点击文件名下载附件
[weixinlianxi]1[/weixinlianxi]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4