2D Chart and 3D Waterfall Chart Control

Environment: Visual C++ 6.0,Win 95/98,NT4.0.
The print routine
has been tested with HP Laserjet 4ML and Lexmark 3200, with Acrobat Writer
by setting the resolution at 600 dpi.


The CChart class is the class derived from CWnd
class. The class provides the functionality of Windows plotting chart control
. The chart plotted from this class will look like the output of an Oscilloscope
. By the way, I found that there is an article like this already posted
here . So CChart3d is the derived class from CChart that will be able to
plot data in 3D style.The demo project will will plot data in 2D and 3D
like a Waterfall plot found in an expensive Signal Analyser.


CChart and CChart3d to your project First add these
four files to your project. Chart3d.cpp , Chart3d.h , Chart.cpp and Chart.h
. Then you can add the object to like this :

CChart m_Chart2d ;
CChart3d m_Chart3d;

After that you can customize,create and then update new data to chart respectively.
In the demo project you can find the implementation of CChart and CChart3d
in the routine

CWFDemoView::InitialUpdate();   // for customizing and creating chart
CWFDemoView::OnTimer();         // for updating data to chart
CWFDemoView::OnPrint(CDC *pDC); // for printing chart.

Customize Control

Customize control of chart can be done before
and after the chart is created. If you change setting after the chart was
created then call function Invalidate() to redrawn the chart.

  1. Setting Chart Title can be done by calling the function
    SetChartTitle(Cstring str)
  2. Setting Range of each axis can be done by calling the following functions:
    CChart::SetRange(double Xmin, double Xmax,
                     double Ymin, doubleYmax)
    Default: SetRange(-10,10,-10,10)
    CChart3d::SetRange3d(double Xmin, double Xmax,
                         double Ymin, double Ymax,
                         double Zmin , double Zmax)
    Default: SetRange3d(0,100,0,20,0,100)
  3. Setting the Axiss Label can be done by calling the functions:
    CChart::SetAxisLabel(Cstring strLabelX , Cstring strLabelY)
  4. Setting the number of grid scale for each axis and the labels to be
    plotted on screen can be done by calling the functions:

    CChart::SetGridNumber(int nGridX , int nGridY)
    CChart3d::SetGridNumber3D(int nGridX, int nGridY, int nGridZ)

    Note: Grid labels will be automatic drawn according to the number
    of grid setting.

  5. Setting the Axis style by calling the function:
    CChart::SetAxisStyle(int nStyle)
                         //0: Single Quadrant
                         //1: Double Quadrant
                         //2: 4 Quadrant *default
  6. Customize color on chart Background Color can be modified with variable:
    m_BGColor. Axis color can be modified with variable: m_AxisColor. Grid
    color can be modified with variable: m_GridColor. Series plot color can
    be modified with variable: CSerie::m_plotColor.


    mChart.m_BGColor = RGB(255,0,0,)               //Set background color to red
    mChart.m_AxisColor = RGB(0,0,0);               // Set background color to black
    mChart.m_GridColor = RGB(120,120,120);         // Set grid color to gray .<
    mChart.mpSerie[0].m_plotColor = RGB(0,255,0) ; //Set series 0 color to green
  7. Set the number of series on chart by modify variable

    Note: The maximum series on the code is 60 but you can assemble
    it and change to any number is your want.

  8. Allocate number of points for all series by calling function:
    CChart::AllocSerie(int nSerie)

    Caution : Setting the number of series has to be done before calling this

  9. Working with the Chart
    • Creating Chart – After you finished customizing the chart then call the function:
      Create(DWORD dwStyle, CRect &rect, CWnd *pParent, UINT id)


    • Updating Chart – You can update data for each series by calling function

      SetXYValue(double x , double y , int index , int nSerieIdx).

      If you want chart to be redrawn function Invalidate() should be called
      . The chart background will be drawn as it was when the chart was first
      created then it will save the background in the buffer. But if you changed
      background color or grid color then you need to call the Invalidate() function
      with argument FALSE to force the chart background to be redrawn .

    • Printing Chart – In the demo project you can preview and print
      the chart . I have test the program with several printers. The function
      CChart::PrintChart(CDC *pDC,int x ,int y) is used for printing the chart.

      In the demo project I added this function in OnPrint(CDC *pDC) in CFormView
      class as example :

      void CWFDemoView::OnPrint(CDC* pDC, CPrintInfo* /*pInfo*/)


Download demo project – 29 Kb
Download source – 10 Kb

More by Author

Previous articleColorSpace ATL Control
Next articleSimple String Class

Must Read