Click here to Skip to main content
13,894,347 members
Click here to Skip to main content
Add your own
alternative version


374 bookmarked
Posted 6 Nov 2001

Plot Graphic Library

, 7 May 2003
Rate this:
Please Sign up or sign in to vote.
A library to plot data (lines, maps...) in MFC projects.



PGL is a library that encapsulates plot capabilities in a MFC project for VC6 and VC7. It is designed to be able to easily plot data generated in a project without the need of any external software. In fact, with CView and CDialog derived classes, you can have your app display chart in 5 minutes.

The aim of PGL is not to have a user-friendly environment but rather being able to generate any plot from the source code.

PGL was originally using OpenGL to raster graphics but now it uses GDI+ (so you need to install Microsoft SDK to compile PGL).


The source available on CodeProject is licensed under LGPL. However, the next releases are not free anymore (Ooops, sorry). You can check the latest development at PGL Home Page. Anyway, enjoy beautiful charting.


  • line strip, fully customisable:
    • color (RGBA),
    • line dashing,
    • point type (circle, box, triangle, etc...)
    • line width,
    • filled,
    • line shadow,
    • multiple line strip,
    • etc...
  • line strip with level of detail capabilities (based on Douglas-Peukler line simplification algorithm),
  • Vector map,
  • Height map,
  • Text,
    • variable scale,
    • multiple fonts,
    • orientable,
  • Unlimited sub-plotting,
  • Automatic axis,
  • Time labelling,
  • Export to EPS, SVG, JPEG, TIFF, PNG,
  • CView derived class for fast integration in existing project,
  • CDialog derived class, etc...


A UML diagram is available in pdf here. It is not complete but it should help you in understanding the library.


Here are the installation steps to use PGL in one of your projects:
  1. Install GDI+ (part of Microsoft SDK).
  2. Download Gdiplus.dll and make sure it is in the path,
  3. Recompile the source, it will build .lib in the lib directory and the .dll in the bin directory
  4. Add the directory with PGL binaries to your path. (by default it is C:\Program Files\PGL\bin)
  5. Add the include directory and lib directory to Visual C++ include/lib directories.
  6. Make sure the headers are available

That's it!

Getting your project started

  1. Add the following in your StdAfx.h file :
    #include "PGL.h"
  2. Since PGL is using GDI+, you must initialize it :
    • Add the following variable to your CWinApp derived class
      ULONG_PTR m_ulGdiplusToken;
    • Add the following to the CWinApp::OnInitInstance function to initialize GDI+
      // initialize <code>GDI+ (gdi+ is in Gdiplus namespace)
      Gdiplus::GdiplusStartupInput gdiplusStartupInput;
      Gdiplus::GdiplusStartup(&m_ulGdiplusToken, &gdiplusStartupInput, 
    • Add the following to the CWinApp::OnExitInstance function to clean up GDI+.
      // shutdown GDI+

Your project should work fine now.


All these examples are accessible in the source. See the example menu of TestPGL.

Example 1 : Drawing a simple line

This is a first explanatory example. We suppose that the points (x,y) of the line have been generated and are stored in two array pX,pY of size nPoints ( note that you can also pass data as std::vector<double> to PGL).


Here's the code I used to generate the data: a simple sinusoid. Note that the y are in [-1.1, 1.1] but PGL will handle axe labelling the have nice units.

// generate data
int nPoints = 50;
double* pX=new double[nPoints];
double* pY=new double[nPoints];
for (UINT i=0;i< nPoints;i++)
  1. First, create a graph object:
    CPGLGraph* pGraph = new CPGLGraph;
    Note that you can check all PGL object with ASSERT_VALID since they all inherit from CObject.
  2. Create a 2D line:
    CPGLLine2D* pLine = new CPGLLine2D;
  3. Attach the data to the line. PGL will handle the memory afterwards. That is, it will delete the pointers of data at the object destruction. This means pX,pY MUST have been allocated on the heap !
    pLine->SetDatas( nPoints /* number of points */, 
                       pX /* x(i) */, pY /* y(i) */);
  4. (Optional)Change some properties of the line: pLine->SetLineWidth(2);
  5. Add the line to the graph (note that an object can be added to only one graph):
  6. Make PGL scale the plot (automatically)
  7. Create a dialog box and display the plot:
    CPGLGraphBitDlg graphdlg(this, pGraph);
You should have the same as the image above. Note that this image (PNG) has been generated by PGL.


Example 2 : Adding a line with level of detail control

You may have to plot line with thousands of points. This can become very heavy and especially if you export it to EPS, the files can become very large. To overcome this problem, you can use a line with LOD included in PGL.


In this examples, we approximate the previous line. Starting from the previous example,
  1. Change the line of code
    CPGLLine2D* pLine = new CPGLLine2D;
    CPGLLine2DLOD* pLine = new CPGLLine2DLOD;
  2. Change tolerance of level of detail
  3. Shrink the number of points by a desired compression ratio (here to 10% with 2% threshold)
On the figure above, you can see the original line and the approximated one. You can gain a serious amount of points using this technique!


Example 3: Customizing axis, labeling, etc...

As you can see in the previous image, all the parameters of the objects are changeable in the code. In this example, we shall
  • change the title text,
  • turn off horizontal grid,
  • show right label,
  • change number of ticks on the top axis,
  • switch to time labelling for the x-axis,
  • and more...


We start from the second example and add the following line of code before calling ZoomAll().
  1. Get a pointer the axis object (there a huge mistake of English but in French it's ok :)(axe -> axis))
    CPGLAxe2D* pAxis = pGraph-&gtGetAxe();
  2. Change the title text and color
    pAxis->GetTitle()->SetColor(0 /* red */,0.5f /* green */,
                                0 /* blue*/ /* alpha optional */);
  3. Turn off vertical grid, (vertical -> 0, horizontal -> 1)
  4. Show and change right label,
    pAxis->GetRightLabel()-&gtSetString("This is the right label");
  5. Show right numbering
  6. Changing number of ticks on the top axis,
  7. Switch to time labelling the x-axis,
    // enable time labelling
    // set origin, time step and format (see COleDateTime.Format for details)
                                    /* Time at zero. */, 
    			COleDateTimeSpan(0,0,30,0) /* Time per unit */,
    			"%H:%M:%S" /* String format */);
I've also disabled the line drawing and set the tolerance to 0.025 for the LOD line. Of course, you can do much more. This is just an example.

Example 4: Sub-plotting !

What about putting multiple plots on a figure: that's possible in PGL in many ways. In fact you can add plots to plots, and so on.


The class CPGLGraph is inherited from a generic plot class : CPGLRegion. You can either
  • use the function Divide(m,n) to divide the region in an array of m rows and n columns (Note that this method erase all object in the region). After that, you can access the elements with GetChilds(i) (the regions are created row by row). You can get the number of children with GetNChilds():
    // allocated somewhere
    CPGLRegion* pRegion;
    // dividing
    // accessing region at row 2 and column 1 (zero based index)
    CPGLRegion* pChildRegion = pRegion->GetChild(2*n+1);
  • Create an add directly a region using AddRegion. To use this method you must SetNormBBox(...) to set the bounding box (in Normalized coordinates with respect to the parent region)
    CPGLRegion* pChildRegion = pRegion->AddRegion();
    pChildRegion->SetNormBBox(0.1 /* llx */ , 0.2 /* lly */ , 
                              0.7 /* urx */ , 0.8 /* ury */);
Of course, you can divide child regions and so on.


Example 5: Changing properties of objects at runtime

You can explore the object hierarchy by right clicking the view or dialog. Unfortunately, serialization is not working yet. So it is lost work...



The documentation is generated with Doxygen and Doxygen studio. See Plot Graphic Library.dow file. Otherwize, it is shipped with the Microsoft Installer.


You can download the Microsoft installer at the PGL Home Page

Compiling the sources

The sources of PGL are provided. Open the workspace

  • "Plot Graphic Library.dsw" for VC6 users
  • "Plot Graphic LibraryNET.dsw" for VC7 users

It contains 6 projects :

  • AlgoTools. Collection of Algorithmic classes. This project contains the algorithm for line approximation.
  • IGfx. Graphic library used by PGL. Multi-layer graphic interface to export in multiple graphic format such as EPS or SVG.
  • IGfxTest. Test project for IGfx.
  • OGLTools. A useful library to handle OpenGL with Windows. Not used anymore but useful anyway.
  • PGL. The graphic library.
  • Testpgl. An demo application.
Compile the sources. The .lib will be located in the lib directory, and dlls in bin directory.


  • 6-11-2002 Added VC7 build, fixed some stuff and updated DPHull.
  • 15 July 2002: Fixed ressource missing, change CP_THREAD_ACP to CP_ASP, fixed, export bug and text strip bug.
  • 5 June 2002 Updated downloads
  • 29 March 2002 Big Update !
  • 8 November 2001 Initial release.


This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


About the Author

Jonathan de Halleux
United States United States
Jonathan de Halleux is Civil Engineer in Applied Mathematics. He finished his PhD in 2004 in the rainy country of Belgium. After 2 years in the Common Language Runtime (i.e. .net), he is now working at Microsoft Research on Pex (

You may also be interested in...


Comments and Discussions

QuestionImplementing Fractal Trigonometry for Geometrifying Trigonometry(C) Pin
SanjoyNath@GeometrifyingTrigonometry6-Jan-19 23:05
memberSanjoyNath@GeometrifyingTrigonometry6-Jan-19 23:05 
QuestionUnable to built project in Visual Studio 2013 Pin
Member 1267965810-Aug-16 11:26
memberMember 1267965810-Aug-16 11:26 
QuestionPlot Graphic Pin
Member 1180271430-Jun-15 1:16
memberMember 1180271430-Jun-15 1:16 
GeneralMy vote of 5 Pin
futurejo26-Apr-13 0:33
memberfuturejo26-Apr-13 0:33 
QuestionHowTo? three plots in one single Graph? Pin
Alan-Lee Perkins21-Jan-13 22:58
memberAlan-Lee Perkins21-Jan-13 22:58 
GeneralMy vote of 5 Pin
Manoj Kumar Choubey22-Feb-12 0:18
professionalManoj Kumar Choubey22-Feb-12 0:18 
QuestionLatest PGL version an Visual Studio versions Pin
Member 185281411-Nov-11 1:36
memberMember 185281411-Nov-11 1:36 
GeneralBug when compiling with VC .NET 2003 Pin
typke23-May-11 2:12
membertypke23-May-11 2:12 
Generalerror C2664 'hull::TDPHull<T>::Build' Pin
Burim Ramadani19-Dec-10 23:29
memberBurim Ramadani19-Dec-10 23:29 
GeneralRe: error C2664 'hull::TDPHull<T>::Build' Pin
wuziyuan_1114-Sep-14 17:02
memberwuziyuan_1114-Sep-14 17:02 
GeneralVisual C++ 2010 Pin
Burim Ramadani15-Dec-10 20:46
memberBurim Ramadani15-Dec-10 20:46 
GeneralRe: Visual C++ 2010 Pin
Wangrunqing17-Aug-14 16:10
memberWangrunqing17-Aug-14 16:10 
GeneralRe: Visual C++ 2010 Pin
Member 1115562215-Oct-14 22:45
memberMember 1115562215-Oct-14 22:45 
GeneralRe: Visual C++ 2010 Pin
Member 1115562215-Oct-14 22:46
memberMember 1115562215-Oct-14 22:46 
GeneralRe: Visual C++ 2010 Pin
Member 1115562215-Oct-14 22:46
memberMember 1115562215-Oct-14 22:46 
GeneralBug scaling axis Pin
TomekG12-Apr-10 3:32
memberTomekG12-Apr-10 3:32 
GeneralI have compiled this project in VS 2005 PinPopular
broiler31526-Jan-10 22:24
memberbroiler31526-Jan-10 22:24 
GeneralRe: I have compiled this project in VS 2005 Pin
david_liu11129-Jan-10 22:44
memberdavid_liu11129-Jan-10 22:44 
GeneralRe: I have compiled this project in VS 2005 Pin
typke25-Feb-11 2:10
membertypke25-Feb-11 2:10 
Generalopengl question Pin
noura238812-Nov-09 12:00
membernoura238812-Nov-09 12:00 
Generalopengl question Pin
noura238812-Nov-09 11:57
membernoura238812-Nov-09 11:57 
GeneralThe sample "export" functionality does not work Pin
transoft16-Apr-09 2:08
membertransoft16-Apr-09 2:08 is dead.... Pin
dwawad12-Mar-09 19:29
memberdwawad12-Mar-09 19:29 
GeneralRe: is dead.... Pin
Jonathan de Halleux28-Mar-09 18:24
memberJonathan de Halleux28-Mar-09 18:24 
GeneralRe: is dead.... Pin
alextooter11-May-10 2:09
memberalextooter11-May-10 2:09 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Cookies | Terms of Use | Mobile
Web04 | 2.8.190306.1 | Last Updated 8 May 2003
Article Copyright 2001 by Jonathan de Halleux
Everything else Copyright © CodeProject, 1999-2019
Layout: fixed | fluid