ChartDirector Ver 5.0 (C++ Edition)
Using ChartDirector with MFC
This section describes how to use ChartDirector with MFC on Windows.
MFC Sample Programs
ChartDirector comes with a number of MFC sample programs in the "ChartDirector/mfcdemo" subdirectory. If you are using Visual Studio, you may open the workplace file "mfcdemo.dsw" (for 32-bit ChartDirector) or the solution file "mfcdemo.sln" (for 64-bit ChartDirector), and it will open the Visual Studio workplace or solution with the sample projects.
Project Name | Description
|
---|
helloworld | The "Hello World" example of using ChartDirector with MFC. This is a basic MFC project displaying a simple bar chart.
|
mfcdemo | The main MFC sample program, containing a chart browser for browsing over 100 sample charts.
|
financedemo | An interactive financial chart will comprehensive technical indicators support.
|
realtimedemo | A sample program to demonstrate a real time chart that updates itself once 250 ms to 2 sec.
|
zoomscrolldemo | A sample program to demonstrate a zoomable and scrollable chart.
|
zoomscrolldemo2 | Another sample program to demonstrate how to create a zoomable and scrollable chart.
|
For compatibility with older versions of Visual Studio, for 32-bit ChartDirector, the workplace file is in Visual Studio 6.0 format. If you are using later versions of Visual Studio, it will prompt you to upgrade the workplace. You may press "Yes to All" to upgrade all files.
To try a sample program, simply set the corresponding project as the active project, then compile and run the program.
It is recommended you start with the helloworld project and then the mfcdemo project. The mfcdemo project contains over 100 sample charts illustrating various chart types and how to use ChartDirector in general. The charts are from simple to sophisticated, and are designed for use as tutorials.
The CChartViewer MFC Control
All ChartDirector MFC sample programs uses the
CChartViewer control to display charts and handle mouse interactions. The CChartViewer is a derived class of the MFC CStatic control. It is released in source code format.
To use CChartViewer in your own project:
- Include "ChartViewer.h" and "ChartViewer.cpp" in your project.
- Use the VC++ Dialog Editor to put a CStatic (Picture) control for displaying bitmaps in your Form or Dialog. Set a valid resource ID for the control.
- Add a member variable for the control (eg. right click on the control and select "Add variable" or "ClassWizard", depending on your version of VC++)
- Edit the header file of the Form or Dialog to change the member variable type from CStatic to CChartViewer, and to add the following line:
#include "ChartViewer.h"
Displaying Charts On Screen
To display a chart using CChartViewer, only one line of code is needed:
// m_ChartViewer is a CChartViewer control; myChart is a BaseChart pointer
m_ChartViewer.setChart(myChart);
Handling Hot Spots Mouse Interactions
Hot spots are special regions in on the chart that are usually used to represent chart objects, such as data representation objects (sectors for pie chart, bars for bar charts, etc). One can display tool tips when the mouse is over the hot spots, and/or to make the hot spots clickable with mouse cursor feedback.
In ChartDirector, hot spots for the charts are defined using standard HTML image maps (text strings containing HTML
tags). The
BaseChart.getHTMLImageMap method can be used to generate image maps automatically for a chart. To set the image map to the CChartViewer control, one may use:
After setting the image map, the CChartViewer control will display the tool tips defined in the image map when the mouse is over the hot spots. It will also change the mouse cursor into a "hand" shape for clickable hot spots.
When the mouse clicks on the CChartViewer control, a BN_CLICK message will be sent to the parent container. The parent container may handle this message and use
ImageMapHandler to determine which hot spot the mouse has clicked.
The MFC documentation contains the details on how to handle BN_CLICK messages. In brief, the steps are:
Handling View Port Interactions
A view port can be imagined as a window to an underlying surface. For example, a data series with 10 years of data can be imagined as a long surface. If only 1 year of data is displayed, we may consider this as the view port showing 10% of the underlying surface.
Scrolling can be handled as moving the view port, while zooming in and out can be handled as changing the view port size.
CChartViewer may change the view port during "drag to zoom", "click to zoom" or "drag to scroll" mouse actions (see
CChartViewer.setMouseUsage). When CChartViewer changes the view port, it will send a CVN_ViewPortChanged custom control notification message to its parent container. The parent may handle this message and redraw the chart to reflect the updated view port.
CChartViewer also allows external code or controls (such as scroll bars, sliders, calendar controls, etc) to change the view port and trigger the CVN_ViewPortChanged message. You may refer to
Zoomable and Scrollable Charts for more information.
The MFC documentation contains the details on how to handle the custom control notification messages. In brief, the steps are:
- Add the following to the message map section of your code, in which IDC_ChartViewer is the resource ID of the CChartViewer control, and OnViewPortChanged is the name of the method to handle the message.
ON_CONTROL(CVN_ViewPortChanged, IDC_ChartViewer, OnViewPortChanged)
- Add the prototype of the handler to the message map functions section of the header file.
afx_msg void OnViewPortChanged();
- Add the implementation of the handler to your code file, like:
void CMyDialog::OnViewPortChanged()
{
// View Port may have changed
// - update other controls if necessary
// - redraw chart
}
Printing Charts On Paper
ChartDirector can output charts in BMP or DIB (Device Independent Bitmap) format. The easiest method to print the chart is to blit the DIB directly to the printer device context. For example:
// Output the chart as BMP
MemBlock bmp = c->makeChart(Chart::BMP);
// The BITMAPINFOHEADER is 14 bytes offset from the beginning
LPBITMAPINFO header = (LPBITMAPINFO)(bmp.data + 14);
// The bitmap data
LPBYTE bitData = (LPBYTE)(bmp.data) +
((LPBITMAPFILEHEADER)(bmp.data))->bfOffBits;
// The scaling factor to adjust for printer resolution
// (pDC = CDC pointer representing the printer device context)
double xScaleFactor = pDC->GetDeviceCaps(LOGPIXELSX) / 96.0;
double yScaleFactor = pDC->GetDeviceCaps(LOGPIXELSY) / 96.0;
// Output to device context
StretchDIBits(pDC->m_hDC, (int)(40 * xScaleFactor), (int)(40 * yScaleFactor),
(int)(header->bmiHeader.biWidth * xScaleFactor),
(int)(header->bmiHeader.biHeight * yScaleFactor),
0, 0, header->bmiHeader.biWidth, header->bmiHeader.biHeight,
bitData, header, DIB_RGB_COLORS, SRCCOPY);
© 2010 Advanced Software Engineering Limited. All rights reserved.