Environment: VC++, charting
The following is the description for using a MS Chart control in VC++. The diagram below will give you an idea of the chart we are going to make.
Firstly, 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 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.
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 - // 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 // an 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; bstr = filedetailsstruct.login.AllocSysString(); // Row label // make sure this cannot be converted to a valid number like // "54" and is a valid string like "John" 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.