MFC TeeChart中绘制饼图
Draw a pie chart in MFC TeeChart
我的英文不是很好,请见谅。我已成功将数据添加到饼图中,但饼图不显示,控件中只显示数据。
控件的属性似乎已正确配置。搞了一个晚上也不知道是哪里出了问题
BOOL CStatInfPieDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
char temp1[100];
char temp2[100];
CString str;
// TODO: Add extra initialization here
CSeries series = (CSeries)statInfPie.Series(0);
int size = stationInfList.size();
series.put_ColorEachPoint(true);
srand(time(NULL));
for (int i = 0; i < size; i++) {
sprintf(temp1, "%s/%d ", iptostr(stationInfList[i].netaddrA), toCidr(stationInfList[i].netmaskA));
sprintf(temp2, "%s/%d", iptostr(stationInfList[i].netaddrB), toCidr(stationInfList[i].netmaskB));
strcat(temp1, temp2);
str = CString(temp1);
series.Add(stationInfList[i].bcountAToB + stationInfList[i].bcountBToA, str, RGB(rand() % 255, rand() % 255, rand() % 255));
memcpy(temp1, "[=10=]", sizeof(temp1));
memcpy(temp2, "[=10=]", sizeof(temp2));
}
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
上面的代码示例初始化我的对话框,其中包含 TeeChart 控件。我通过函数 Add()
添加数据。数组 temp1
和数组 temp2
是我的描述信息。在我编译和运行我的程序后,结果如图所示。
TeeChart 尝试为长标签和图例制作 space,自动减小饼图的直径。在这种情况下,结果是极端的;饼图没有半径。
这可以通过以下几种方式之一解决:
最新版本的 TeeChart (AX) 包括一个名为 InsideSlice for PieMarks 的 属性。
即TChart1.Series(0).asPie.PieMarks.InsideSlice = True
对于旧版本的 TeeChart,如果此 属性 不可用,您可以手动将箭头长度(标记的连接器)设置为负值:
IE。 TChart1.Series(0).Marks.ArrowLength = -20
系列标记可以设置为呈现多行,占用更少的宽度:
IE。 TChart1.Series(0).Marks.MultiLine = True
如果图表中的图例带有很长的标签,这也会影响图表的可读性。 Legend 可以设置为 Visible false 或告知不要调整图表系列(饼图)的大小以适合。
IE。 TChart1.Legend.ResizeChart = False
或者可以放在馅饼下面
IE。 TChart1.Legend.Alignment = laBottom
这里需要设计思路。显示长点值标签(系列标记)并重复图例中的一些信息占用了大量 space 可以显示图表的工作。如果将图例放置在图表下方并且面板的大小相应调整并且可能使用不重复系列标记信息的信息(使用不同的图例文本样式)加上使用多行设置系列标记,与一个较短的Arrowlength,那么整体结果应该是非常可读的。
我的英文不是很好,请见谅。我已成功将数据添加到饼图中,但饼图不显示,控件中只显示数据。
控件的属性似乎已正确配置。搞了一个晚上也不知道是哪里出了问题
BOOL CStatInfPieDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
char temp1[100];
char temp2[100];
CString str;
// TODO: Add extra initialization here
CSeries series = (CSeries)statInfPie.Series(0);
int size = stationInfList.size();
series.put_ColorEachPoint(true);
srand(time(NULL));
for (int i = 0; i < size; i++) {
sprintf(temp1, "%s/%d ", iptostr(stationInfList[i].netaddrA), toCidr(stationInfList[i].netmaskA));
sprintf(temp2, "%s/%d", iptostr(stationInfList[i].netaddrB), toCidr(stationInfList[i].netmaskB));
strcat(temp1, temp2);
str = CString(temp1);
series.Add(stationInfList[i].bcountAToB + stationInfList[i].bcountBToA, str, RGB(rand() % 255, rand() % 255, rand() % 255));
memcpy(temp1, "[=10=]", sizeof(temp1));
memcpy(temp2, "[=10=]", sizeof(temp2));
}
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
上面的代码示例初始化我的对话框,其中包含 TeeChart 控件。我通过函数 Add()
添加数据。数组 temp1
和数组 temp2
是我的描述信息。在我编译和运行我的程序后,结果如图所示。
TeeChart 尝试为长标签和图例制作 space,自动减小饼图的直径。在这种情况下,结果是极端的;饼图没有半径。
这可以通过以下几种方式之一解决:
最新版本的 TeeChart (AX) 包括一个名为 InsideSlice for PieMarks 的 属性。
即TChart1.Series(0).asPie.PieMarks.InsideSlice = True
对于旧版本的 TeeChart,如果此 属性 不可用,您可以手动将箭头长度(标记的连接器)设置为负值:
IE。 TChart1.Series(0).Marks.ArrowLength = -20
系列标记可以设置为呈现多行,占用更少的宽度:
IE。 TChart1.Series(0).Marks.MultiLine = True
如果图表中的图例带有很长的标签,这也会影响图表的可读性。 Legend 可以设置为 Visible false 或告知不要调整图表系列(饼图)的大小以适合。
IE。 TChart1.Legend.ResizeChart = False
或者可以放在馅饼下面
IE。 TChart1.Legend.Alignment = laBottom
这里需要设计思路。显示长点值标签(系列标记)并重复图例中的一些信息占用了大量 space 可以显示图表的工作。如果将图例放置在图表下方并且面板的大小相应调整并且可能使用不重复系列标记信息的信息(使用不同的图例文本样式)加上使用多行设置系列标记,与一个较短的Arrowlength,那么整体结果应该是非常可读的。