Search code examples
c++mfcteechart

Draw a pie chart in MFC TeeChart


My English is no very good, so please forgive me. I have added my data successfully in a pie chart, but the pie chart doesn't show with only data shown in the control.

The properties of the control seem like have been configured appropriately. I don't know where is the problem since I have spent whole my night on it.

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
}

The code sample above initializes my dialog which contains the TeeChart control. I add data through function Add(). Array temp1 and array temp2 is my description inf. After I compile and run my program, the result shows in the picture blow.

enter image description here


Solution

  • TeeChart tries to make space for the long labels and the Legend, automatically reducing the diameter of the Pie. In this case the result is extreme; the Pie is left with no radius.

    That can be resolved in one of several ways: The latest version of TeeChart (AX) includes a property called InsideSlice for PieMarks. ie.TChart1.Series(0).asPie.PieMarks.InsideSlice = True

    For older versions of TeeChart, where this property is not available you can manually set the Arrowlength (the connector to the Mark) to a negative value: ie. TChart1.Series(0).Marks.ArrowLength = -20

    The Series Marks can be setup to render multiline, taking up less width: ie. TChart1.Series(0).Marks.MultiLine = True

    If the Legend is in the Chart with very long labels that can also be counter productive to chart readability. The Legend can be set to Visible false or told to not resize the Chart Series (the Pie) to fit. ie. TChart1.Legend.ResizeChart = False

    or can be positioned below the Pie ie. TChart1.Legend.Alignment = laBottom

    A thought to design will be required here. Showing long Point Value labels (the Series Marks) and repeating some of the information in the Legend is taking up a great deal of the working space where the Chart could be shown. If the Legend were to be placed below the Chart and the Panel were sized accordingly and perhaps were to use information that doesn't duplicate the Series Marks' information (using a different Legend Text Style) plus setting up the Series Marks with Multiline, with a shorter Arrowlength, then the overall result should be very readable.