What
is
Trend
Display?
Trend
Display is an
area to show time dependent
values in form of curves for
different purposes. this is
designed for
real
time software and
HMI &
SCADA Software For
example if you want to monitor
some hardware quantities that
are time dependent such as
voltage, temperature and
something like these the
Trend
Display is a
good area to
display the changes of
those signals value in different
times.
How
does it work?
For
this purpose I've created a
CFormView
based class called
CTrendView
with related document and frame
classes (
CTrendDoc
and
CTrendFrame
). By using these classes in a
MDI project you can have a
multiple documents
Trend
Display. It's very easy
to use. Just you should register
the
Trend's document
templates in
InitInstance()
method of application class.
Collapse |
Copy
Code
CMultiDocTemplate* pDocTemplate;
m_pTrendTemplate = new CMultiDocTemplate(IDR_TrendTestTYPE,
RUNTIME_CLASS(CTrendDoc),
RUNTIME_CLASS(CTrendFrame),
RUNTIME_CLASS(CTrendView));
AddDocTemplate(m_pTrendTemplate);
Also
because of using a
CFormView
class you need to add a dialog
resource (IDD_FORMVIEW
)
to your project. Now you can
open
Trend
Display in any way you
desire for example through a
menu or toolbar.
Collapse |
Copy
Code
void CTrendTestApp::OnTrendOpen()
{
m_pTrendTemplate->OpenDocumentFile(NULL);
}
A ruler
that moves horizontally,
signifies the current time. This
ruler moves pixel by pixel by a
timer, which is used in
CTrendView
class. There is no need to any
special code for invalidating
the
OnDraw
function when
Trend window moves,
resize or disappears behind the
other windows, because there is
a buffer to hold the values for
each signal.
Collapse |
Copy
Code
void CTrendView::DrawTrend()
{
m_pDC = GetDC();
for(BYTE j=0 ; j < m_pDoc->m_noOfPoint ; j++)
{
CPen pen(PS_SOLID,1,m_pDoc->m_pPoint[j].Color);
m_OldPen = m_pDC->SelectObject(&pen);
for(int i=1 ;
i < m_pDoc->m_pPoint[j].BufferedValue.GetSize();
i++)
{
m_portion =
(m_pDoc->m_pPoint[j].BufferedValue[i-1] -
m_pDoc->m_pPoint[j].Min)
/ m_pDoc->m_pPoint[j].Range;
m_pDC->MoveTo(m_trendRect.left+i-1,
int(m_trendRect.bottom -
m_portion*m_trendRect.Height()));
m_portion = (m_pDoc->m_pPoint[j].BufferedValue[i] -
m_pDoc->m_pPoint[j].Min)
/ m_pDoc->m_pPoint[j].Range;
m_pDC->LineTo(m_trendRect.left+i,
int(m_trendRect.bottom -
m_portion*m_trendRect.Height()));
}
m_pDC->SelectObject(m_OldPen);
}
InvalidateRect(CRect(m_trendRect.left +
m_timeStep-1, m_trendRect.top,
m_trendRect.left+m_timeStep+1,m_trendRect.bottom));
ReleaseDC(m_pDC);
}
I
didn't use any options for this
project but it could has many
options. For example the back
ground color and signals color
can be changeable and grids,
scales and scan time as well.
May be in my upcoming version I
add these options to my code.
But it's better that you put
these possibilities as you
desire. The attached demo
project is created and compiled
with MFC7, so to compile it, you
need VS.NET but it's very easy
to add source code to your MFC6
based project. Please feel free
to send your comments, questions
and suggestions about this
Trend
Display. Thank you in
advance.