C++ 在MFC图表中绘制饼图

C++ 在MFC图表中绘制饼图,c++,mfc,teechart,C++,Mfc,Teechart,我的英语不是很好,所以请原谅我。我已成功地将数据添加到饼图中,但饼图不会仅显示控件中的数据 控件的属性似乎已正确配置。我不知道问题出在哪里,因为我花了一整晚的时间在这上面 BOOL CStatInfPieDlg::OnInitDialog() { CDialogEx::OnInitDialog(); char temp1[100]; char temp2[100]; CString str; // TODO: Add extra initializati

我的英语不是很好,所以请原谅我。我已成功地将数据添加到饼图中,但饼图不会仅显示控件中的数据

控件的属性似乎已正确配置。我不知道问题出在哪里,因为我花了一整晚的时间在这上面

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, "\0", sizeof(temp1));
        memcpy(temp2, "\0", sizeof(temp2));
    }
    return TRUE;  // return TRUE unless you set the focus to a control
                  // EXCEPTION: OCX Property Pages should return FALSE
}
上面的代码示例初始化包含TeeChart控件的my对话框。我通过函数add添加数据。数组temp1和数组temp2是我的描述inf。编译并运行程序后,结果如图所示


TeeChart尝试为长标签和图例留出空间,从而自动减小饼图的直径。在这种情况下,结果是极端的;饼图没有半径

这可以通过以下几种方式之一解决: 最新版本的TeeChart AX包含一个名为InsideSlice for PieMarks的属性。 ie.TChart1.Series0.asPie.PieMarks.InsideSlice=True

对于早期版本的TeeChart,如果此属性不可用,则可以手动将接头到标记的箭头长度设置为负值: 即:TChart1.Series0.Marks.ArrowLength=-20

系列标记可以设置为渲染多行,占用较少的宽度: 即:TChart1.Series0.Marks.MultiLine=True

如果图例位于带有很长标签的图表中,这也会对图表的可读性产生反作用。图例可以设置为Visible false,也可以被告知不要调整图表系列的大小以适应饼图。 即:TChart1.Legend.ResizeChart=False

或者可以放在饼图下面 即:TChart1.Legend.Alignment=laBottom


这里需要一个设计思想。显示长的点值标签、系列标记和重复图例中的某些信息会占用大量的工作空间来显示图表。如果图例放置在图表下方,面板尺寸相应调整,并且可能使用不与序列标记信息重复的信息,使用不同的图例文字样式,并使用短箭头长度的多行设置序列标记,那么整个结果应该是可读性很强的。

那么问题出在哪里呢?这幅画有什么问题吗?你期待什么?丑陋的代码。为什么不直接使用CString::Format而不是所有的sprintf、memcpy和固定长度的字符数组?statinPie是在哪里定义的?另一件事是TeeChart是第三方库。我想您是将其用作ActiveX控件?所以你们最好问问图书馆的供应商。