Introduction
The Code Project is an exciting site with impressive teaching and professional
exchange capabilities. I have learned much from it and also decided to submit my
contribution. Occasionally I was involved in a project to check experimental
data for consistency. The data were collected in several binary files, which
also contain "holes", i.e. missing data segments. The main idea to simplify the
fast check report was to embed this report inside the progress control. So first
of all I had found :
I thank these authors for inspiration. It was a starting point, because I
needed a more complex structure of the progress control to show report data.
Resolving the problem
Considering 2D pie chart you can easily reveal that it contains 4 parameters,
which are potentially able to display 4 independent variables. These are width
of angular sectors, their radius, initial offset from the horizontal line (an
initial phase), and the color of each angular segment. A small restriction in
conversion to the geometrical representation is that the radius and width of
angular sectors require positive determined input data, what is sometimes
automatically met (for instance, counting number of iterations or loop passing).
You may think about the example represented by the figure as a report of
processed files, which have their own length (width), the "holes" total length
relative to the file length (%) (radius), maximal "hole" length relative to the
file length (%) (color), and possibly deviation of the processing time from the
mean value (%) (phase). (I have never used the last option, always assuming it
as zero, but I believe it can be used in other tasks).
Programming issues
All necessary operations are included in the Cpcontrol
class derived from
CStatic
, which converts processed data into their geometrical representation and
displays them in an appropriate window frame. Cpcontrol
class is embedded in the
standard dialog application, which is responsible for the general data
processing and collecting data for the Pie Progress Control. The internal labels
of the control can be customized during the process of the dialog
initialization.
BOOL CPieProgressCtrlDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_pWnd=GetDlgItem(IDC_PROGRESS);
m_control.m_pWnd=m_pWnd;
CRect rect;
m_pWnd->GetClientRect(&rect);
m_control.m_rect=rect;
int lenx=rect.right-rect.left;
int leny=rect.bottom-rect.top;
m_control.m_w=lenx;
m_control.m_h=leny;
if(2*lenx>3*leny)
m_control.m_w=(int)floor(1.5*leny);
else
if(2*lenx<3*leny)
m_control.m_h=(int)floor(2.0*lenx/3);
m_control.m_top=rect.top;
m_control.m_left=rect.left;
strcpy(m_control.m_bottom,"total");
strcpy(m_control.m_color,"Max bad segments");
strcpy(m_control.m_ctitle,"Current processing info");
int fsize=8;
if(m_control.m_h>80 && m_control.m_h<150)
fsize=10;
else
if(m_control.m_h>=150)
fsize=12;
LOGFONT lf;
memset(&lf, 0, sizeof(LOGFONT));
lf.lfHeight = fsize;
strcpy(lf.lfFaceName, "Arial");
m_control.m_SmallFont.CreateFontIndirect(&lf);
lf.lfHeight = fsize+2;
m_control.m_MiddleFont.CreateFontIndirect(&lf);
lf.lfHeight = fsize+4;
lf.lfWeight=FW_BOLD;
m_control.m_BigFont.CreateFontIndirect(&lf);
m_control.m_cur=-1;
}
The process of geometrical conversion in the pie progress control is pretty
fast and not time consuming as compared with the general data processing. In the
above mentioned example an additional delaying function Sleep(500)
is used to
make an impression this example is visually running.