Graphing Library, source code adding graphs to your software

Graph Library

 

Graphing Library example of C++ Graphs for Win32 and Win64. Other examples available on this site.

[ Graphing Library via Dynamically Linkable Library ]

The following demonstrates how to create your first Visual C++ ProEssentials Graphing Library implementation. It discusses installation, adding ProEssentials to a project, writing your first few lines of code, and shows the final results.

This example is a non-MFC example for reasons of simplicity. Instructions are based off VC6, but this article teaches the fundamentals that ProEssentials creates an HWND much like the CreateWindow API call, and then is utilized similar to any child window within the Windows operating system.

There are notes for MFC users at the bottom of this article.

File / New... menu Graphing Library Installation...

Creating a Win32 app using our Graphing Library.

When installing ProEssentials, the setup program installs the ProEssentials DLL(our Dynamically Linkable Graphing Library) into the system directory. It also installs a header file and import library into the C:\ProEssentials6\VC directory. The relevant files are:

PEGRP32D.DLL

ProEssentials Pro DLL
PEGRP32D.LIB ProEssentials Pro LIB File

PEGRPAPI.H

ProEssentials Header File

 

PEGRPDS.DLL

ProEssentials Standard DLL
PEGRPDS.LIB ProEssentials Standard LIB File
 

PEGRPDL.DLL

ProEssentials Lite DLL
PEGRPDL.LIB ProEssentials Lite LIB File

Note this Walk-Through uses the Pro version. Substitute the above Standard or Lite Graphing Library file as needed.


Creating the Project... Win32 Application, "Hello World!"...
Hello Graph Library!

 

Launch Visual C++ and use the File / New... menu to launch the [New] project dialog. Select [Win32 Application], supply a project name [MyFirst] and appropriate project location.

Selecting [OK] goes to the next page. Now Select [Hello World] .


Project / Add to Project / Files... menu
Adding our Graphing Library header files and import library.

Adding ProEssentials Graphing Library to a VC project...

1) Copy "PEGRPAPI.H" and "PEGRP32D.LIB" from the C:\ProEssentials6\VC directory to where the [MyFirst] project is located.

2) Use the [Project / Add To Project / Files...] menu to add "PEGRPAPI.H" and "PEGRP32D.LIB" to the [MyFirst" project.

Note, if using Standard or Lite versions, use "PEGRPDS.LIB" or "PEGRPDL.LIB".


myfirst.cpp... Adding declarations and Window handle variable...
Header file for your Graphing Library.

Open the file "myfirst.cpp" and near the top add the lines:

#include "PEGRPAPI.H"
HWND hPE;

The include statement adds the ProEssentials header file which contains constants and function declarations.

The variable hPE is used to store the Window's handle for the ProEssentials control.

Note: Within an MFC application, you'll generally add the include statement to the view class's ".cpp" file and add the variable m_hPE to the view class's ".h" file as a member variable of the view's class.


myfirst.cpp...
Handle to our graph control.

Within the InitInstance function, add one line of code to initialize hPE to NULL. This is needed because we'll be adding code into the WM_SIZE and WM_DESTROY switches which assume a non-NULL hPE represents a ProEssentials control has been constructed.

hPE = NULL;


Add a few variables... WndProc
Other graphing variables needed.

Next, within the WndProc function, add the lines:

RECT r;
int s, p;
float f;

These will be needed within the WM_CREATE and WM_SIZE switches.


myfirst.cpp... WM_CREATE, WM_SIZE
Our Graphing Library source code in Visual Studio code window.

// Using our Graphing Library within MFC, create in the OnCreate handler //
case WM_CREATE:
     GetClientRect(hWnd, &r);
     hPE = PEcreate(PECONTROL_GRAPH, 0, &r, hWnd, 1000);
     PEnset(hPE, PEP_bPREPAREIMAGES, TRUE);
     PEnset(hPE, PEP_nSUBSETS, 2);
     PEnset(hPE, PEP_nPOINTS, 10);
     for (s=0; s<2; s++)
     {
         for (p=0; p<10; p++)
         { 
            f = (rand() % 10) + (rand() % 100) / 100.0F;
            PEvsetcellEx(hPE, PEP_faYDATA, s, p, &f);
         }
     }
     PEszset(hPE, PEP_szMAINTITLE, TEXT("My Title"));
     PEszset(hPE, PEP_szSUBTITLE, TEXT(""));
     PEszset(hPE, PEP_szYAXISLABEL, TEXT("My Data"));
     PEszset(hPE, PEP_szXAXISLABEL, TEXT(""));
     PEvsetcell(hPE, PEP_szaSUBSETLABELS, 0, TEXT("Hello"));
     PEvsetcell(hPE, PEP_szaSUBSETLABELS, 1, TEXT("World"));
     PEnset(hPE, PEP_bBITMAPGRADIENTMODE, TRUE);
     PEnset(hPE, PEP_nQUICKSTYLE, PEQS_LIGHT_INSET);
     PEnset(hPE, PEP_bFIXEDFONTS, TRUE);
     PEnset(hPE, PEP_nLEGENDSTYLE, PELS_1_LINE_INSIDE_AXIS);
     PEreinitialize(hPE);
     PEresetimage(hPE, 0, 0);
     break;

case WM_SIZE:
     if (hPE)
     {
         GetClientRect(hWnd, &r);
         MoveWindow(hPE, 0, 0, r.right, r.bottom, FALSE);
     }
     break;

Next, we add handlers for the WM_CREATE, and WM_SIZE message handlers.

WM_CREATE contains the ProEssentials creation code. The ProEssentials function PEcreate is similar to the Windows CreateWindow function, and if successful, returns a Windows handle which is stored in hPE.

PEnset is a ProEssentials function that sets 32 bit type properties such as INTEGER, BOOL and HANDLE.

Next a nested for loop passes data via PEvsetcellEx and the property YData. Note variable f is type float and this is important because PEvsetcellEx works by reading data at a void pointer's location and memory at this location must be of the type expected.

Next, PEszset is the ProEssentials function used to set textual type properties.

PEvsetcell is then used to set the Subset Legend text for both subsets.

PEnset is then used to set various properties controlling visual aspects.

PEreinitialize and PEresetimage tell ProEssentials you're done setting properties.

The code in the WM_SIZE message handler causes the ProEssentials control to always consume the entire Windows client area.


myfirst.cpp... WM_DESTROY...

Graphing Library resource cleanup.

The code in the WM_DESTROY message handler destroys the ProEssentials control and frees resources via PEdestroy.

if (hPE)
{
     PEdestroy(hPE);
     hPE = 0;
}


Results... Congratulations...
Our Graphing Library in your graphing software!

Use Visual C++'s Build / Build myfirst.exe menu (short cut F7) and then Build / Execute myfirst.exe (short cut Ctrl+F5) and you'll see the resulting Window to the left.

Congratulations, you've just completed your first Visual C++ ProEssentials Graphing Library implementation.

 


This example is very simple and you'll likely set other properties such as:

PointLabels which will replace the "1,2,3..." along x axis.

SubsetLineTypes which controls line styles.

SubsetColors which controls line colors.

PlottingMethod which controls the type of chart created, Line, Bar, Area, Point, etc.

MFC User's Note: ProEssentials installs an MFC example [VC6 Example Project] located via the Start Menu / All Programs / ProEssentials v6. This project will load into any version of Visual Studio. Allow the project to automatically convert as needed.Within an MFC implementation, you'll generally add a HWND m_hPE member variable inside the View Class's declaration and then ProEssentials creation code within the View Class's  OnCreate handler after the base class call. You'll use the OnDestroy message handler to call PEdestroy. Within our included VC6 example, look for "PeView.h" for the m_hPE declaration and "PeView.cpp" for the implementation.

Online developer reference

Complete online technical reference to the ProEssentials product. The .NET Reference is the best mechanism to navigate the large quantity of properties and features.  Walk-Throughs of graphing in VB.NET, C#.NET, ASP, VC, VB6, and Delphi get you started quickly.

learn more about our Graphing Library, see Chapter 5

Online interactive demo

Interactive Financial, Engineering, Scientific, and Business examples give you an instant taste of ProEssentials' power.

view our Graphing Library online

Letter from the President

CONGRATULATIONS! Reading this page means you're likely a product manager, product owner, or should be one.

Charting Component Strengths, print it, read it!