65.9K
CodeProject is changing. Read more.
Home

Using the MS Chart control in VC++

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.45/5 (14 votes)

Jun 15, 2003

viewsIcon

261426

downloadIcon

6543

Setting data and labels on the MS Chart control using VC++

Introduction

The following is the description for using the MS Chart control in VC++. The diagram below will give you an idea of the chart we are going to make.

First insert the chart control in your project using Project->Add Reference->Microsoft Chart Control. Next is populating the chart control. When I was working with Visual Basic I had used a data source to pass data to the chart. But in VC++ ,I did not get the datasource method in the initial tries. So I passed the chart data through a COleSafeArray. Thanks to J L Colson for illuminating the details in his article on code project.

Here is the code snippet for that.

//First create a safe array
COleSafeArray saRet;

SAFEARRAYBOUND sab[2];

sab[0].cElements =noOfRows; // give this exactly the number of rows you
                               display in your chart
sab[1].cElements = 5;       // number of columns + 1 (because the first
                            // column is where we put the row labels,
                            // ie in 1.1, 2.1, 3.1, 4,1 etc

sab[0].lLbound = sab[1].lLbound = 1;

// Use the chart as the backdrop of the legend.
m_ChartControl.SetShowLegend(TRUE);

// Create the safe-array...

saRet.Create(VT_BSTR, 2, sab);

long index[2] = { 0, 0 };   //a 2D graph needs a 2D array as index array
BSTR bstr;
index[0] = 1;
  
FILEDETAILS filedetailsstruct; // this is just a datastructure I used,
                               // pls see attached code
CString cstemp;

// m_filedetails is an STL list of filedetailsstruct
// in this loop we populate the safe array
for (i = m_filedetails.begin(); i != m_filedetails.end(); i++)
{
    filedetailsstruct = (FILEDETAILS *) i;
    index[1] = 1;

    // make sure this cannot be converted to a valid number like "54" and
    // is a valid string like "John"
    bstr = filedetailsstruct.login.AllocSysString(); // Row label
    saRet.PutElement(index, bstr);

    index[1] = 2;
    bstr = filedetailsstruct.n9000.AllocSysString(); // Data for column 1
    ::SysFreeString(bstr);
    saRet.PutElement(index, bstr);
  
    index[1] = 3;
      bstr = filedetailsstruct.n9002.AllocSysString(); // Data for column 2
    ::SysFreeString(bstr);
    saRet.PutElement(index, bstr);
  
    index[1] = 4;
    bstr = filedetailsstruct.n9004.AllocSysString(); // Data for column 3
    ::SysFreeString(bstr);
    saRet.PutElement(index, bstr);

    index[1] = 5;
    bstr = filedetailsstruct.nCancel.AllocSysString();// Data for column 4
    ::SysFreeString(bstr);
    saRet.PutElement(index, bstr);

    index[0]++;
}

//now hand over the safe array to the chart control
m_ChartControl.SetChartData(saRet.Detach());

Our chart data will look like this:

2,1  2,2  2,3  2,4  2,5
1,1  1,2  1,3  1,4  1,5

where 1,1 - Row label 1 2,1 - Row Label 2

Okay now to label the columns:

m_ChartControl.SetColumnLabelCount(4);
m_ChartControl.SetColumn(1);
m_ChartControl.SetColumnLabel("Monday");
m_ChartControl.SetColumn(2);
m_ChartControl.SetColumnLabel("Wednesday");
m_ChartControl.SetColumn(3);
m_ChartControl.SetColumnLabel("Friday");
m_ChartControl.SetColumn(4);
m_ChartControl.SetColumnLabel("Saturday");

Thats it folks.

Dependencies

MFC42.DLL, MSVCRT.DLL, KERNEL32.DLL, USER32.DLL, ADVAPI32.DLL, OLEAUT32.DLL

Developed On Windows 2000 Server using VC++ ver 6