📄 curvedynamicflow.cpp
字号:
}
else
{
if (j==0 ) pDC->TextOut(m_nFrameLeftW+m_nWidth+2,m_nFrameTopH+m_nHeight-nHeightSpace*j-nSize.cy,nStr);
else pDC->TextOut(m_nFrameLeftW+m_nWidth+2,m_nFrameTopH+m_nHeight-nHeightSpace*j-nSize.cy/2,nStr);
}
nStr.Empty();
}
}
pDC->SetBkColor(oldBkColor);
}
void CCurveDynamicFlow::DrawSpike()
{
// TODO: Add your dispatch handler code here
if (m_MemDC.GetSafeHdc()!=NULL)
{
int nPels=m_nPigment;
CRect nRect;
nRect.SetRect(0,0,m_nWidth,m_nHeight+m_nFrameBottomH);
m_MemDC.BitBlt(0,0,nRect.right,nRect.bottom,&m_MemDC,nPels,0,SRCCOPY); //Moving
CBrush nBkBrush(m_nBkColor);
CBrush nFrameBrush(m_nFrameColor);
//nBkBrush.CreateSolidBrush(m_nBkColor);
// nFrameBrush.CreateSolidBrush;
nRect.left=nRect.right-nPels;
nRect.top=m_nHeight;
m_MemDC.FillRect(&nRect,&nFrameBrush); //Fill Frame;
m_nStartTime+=m_nTimer;
m_nEndTime+=m_nTimer;
if (m_xIdentifySum>0) // display time identify
{
m_xIdentifyMoved+=nPels;
if (m_xIdentifyMoved<=m_xIdentifyWidth)
{
COLORREF preBkColor=m_MemDC.SetBkColor(m_nFrameColor);
COLORREF preTextColor=m_MemDC.SetTextColor(m_xIdentifyColor);
CFont nFont;
nFont.CreatePointFont(m_nTimeCoordFontSize,m_nTimeCoordFontName,NULL);
CFont *pOldFont=m_MemDC.SelectObject(&nFont);
m_MemDC.TextOut(nRect.right-m_xIdentifyMoved,m_xIdentifyCy,m_nTimeStr);
m_MemDC.SelectObject(pOldFont);
nFont.DeleteObject();
m_MemDC.SetTextColor(m_nBkColor);
m_MemDC.SetBkColor(m_nFrameColor);
}
if (m_xIdentifyMoved>=m_xIdentifySpace) // this sentence extend is if (m_xIdentfyMoved>=m_xIdentifySpace) m_xIdentifyMoved-=m_xIdentifySpace;
{
m_nInitTime=(time_t)(m_nInitTime.GetTime()+m_nPerTime);
m_xIdentifyMoved%=m_xIdentifySpace;
m_nTimeStr.Format("%2d:%2d:%2d ",m_nInitTime.GetHour(),m_nInitTime.GetMinute(),m_nInitTime.GetSecond());
}
} // end if (m_xIdentifySum!=0)
nRect.top=0;
nRect.bottom=m_nHeight;
m_MemDC.FillRect(&nRect,&nBkBrush); //Fill Curve BkColor;
short x,nX_Range;
float y,nY_Range;
CPen nPen1(m_PrimPenStyle,m_PrimPenWidth,m_PrimPenColor);
CPen nPen2(m_PrimPenStyle,m_SecPenWidth,m_SecPenColor);
x=m_nWidth;
y=nRect.bottom-nRect.top;
if (m_xPrimLineSum>0)
{
nX_Range=x/(m_xPrimLineSum+1);
if (m_nCurveMoved%nX_Range<m_nPigment) //draw x coordinate primay line line
{
CPen *prePen=m_MemDC.SelectObject(&nPen1);
m_MemDC.MoveTo(nRect.left-m_nCurveMoved%nX_Range,nRect.top);
m_MemDC.LineTo(nRect.left-m_nCurveMoved%nX_Range,nRect.bottom);
m_MemDC.SelectObject(prePen);
m_nSecLineMoved%=nX_Range;
m_nSecPrecision=nX_Range/(float)(m_xSecLineSum+1)-nX_Range/(m_xSecLineSum+1);
nCheck=0;
nBCount=0;
}
else
{
// m_nSecLineMoved+=nPels;
if (((m_nSecLineMoved%(nX_Range/(m_xSecLineSum+1))-nCheck<m_nPigment)&&(m_nSecLineMoved%(nX_Range/(m_xSecLineSum+1))-nCheck)>=0))
{
nBCount++;
m_nSecPrecision+=nX_Range/(float)(m_xSecLineSum+1)-nX_Range/(m_xSecLineSum+1);
m_nSecPrecision-=nCheck;
if (nBCount<=m_xSecLineSum)
{
CPen *prePen=m_MemDC.SelectObject(&nPen2);
m_MemDC.MoveTo(nRect.left-(m_nSecLineMoved%(nX_Range/(m_xSecLineSum+1))-nCheck),nRect.top);
m_MemDC.LineTo(nRect.left-(m_nSecLineMoved%(nX_Range/(m_xSecLineSum+1))-nCheck),nRect.bottom);
m_MemDC.SelectObject(prePen);
}
nBCount%=(m_xSecLineSum+1);
}
else if (m_nSecLineMoved%(nX_Range/(m_xSecLineSum+1))>nX_Range/(m_xSecLineSum+1)/2)
{
nCheck=((m_nSecPrecision-1.0)>1e-4)?1:0;
}
}
}
nY_Range=y/(m_yPrimLineSum+1);
for(int i=0;i<=m_yPrimLineSum+1;i++) //draw y coordinate primay second identify line
{
CPen *prePen=m_MemDC.SelectObject(&nPen1);
m_MemDC.MoveTo(nRect.left,(int)(i*nY_Range));
m_MemDC.LineTo(nRect.right,(int)(i*nY_Range));
m_MemDC.SelectObject(prePen);
if (i<m_yPrimLineSum+1) for(int j=1;j<m_ySecLineSum+1;j++)
{
CPen *prePen=m_MemDC.SelectObject(&nPen2);
m_MemDC.MoveTo(nRect.left,(int)(i*nY_Range+j*nY_Range/(m_ySecLineSum+1)));
m_MemDC.LineTo(nRect.right,(int)(i*nY_Range+j*nY_Range/(m_ySecLineSum+1)));
m_MemDC.SelectObject(prePen);
}
}
//***********begin draw curve*******
int nCount=m_nItems.GetSize();
CLineChartItem* pItem;
CPoint nOldPoint,nNewPoint;
float nRange;
for ( i=0;i<nCount;i++)
{
pItem=m_nItems.GetAt(i);
if (pItem->m_nPointState!=0) continue;
nRange=pItem->m_nUpper-pItem->m_nLower;
short nBlank;
nBlank=(pItem->m_nOldPosTime-m_nEndTime+m_nTimer)*m_nPigment/m_nTimer;
nOldPoint.x=nRect.left-1+nBlank;
nBlank=(pItem->m_nPosTime-m_nEndTime)*m_nPigment/m_nTimer;
CString nStr;
nNewPoint.x=nRect.right-1+nBlank;
nOldPoint.y=m_nHeight-(int)((pItem->m_nOldPos-pItem->m_nLower)*m_nHeight/nRange);
nNewPoint.y=m_nHeight-(int)((pItem->m_nPos-pItem->m_nLower)*m_nHeight/nRange);
CPen nPen(pItem->m_nPenStyle,pItem->m_nPenWidth,pItem->m_nPenColor);
CPen *pOldPen=m_MemDC.SelectObject(&nPen);
m_MemDC.MoveTo(nOldPoint);
m_MemDC.LineTo(nNewPoint);
m_MemDC.SelectObject(pOldPen);
}
//***********Draw Curve end**********
m_nCurveMoved+=nPels;
m_nSecLineMoved+=nPels;
m_nCurveMoved%=m_nWidth;
}
}
void CCurveDynamicFlow::Go()
{
// TODO: Add your dispatch handler code here
DrawSpike();
Invalidate(FALSE);
}
void CCurveDynamicFlow::AddLine(long nPenColor, short nPenStyle, short nPenWidth, float nLower, float nUpper)
{
// TODO: Add your dispatch handler code here
CLineChartItem *pItem=new CLineChartItem;
pItem->m_nPenColor=(nPenColor);
pItem->m_nPenStyle=nPenStyle;
pItem->m_nPenWidth=nPenWidth;
pItem->m_nUpper=nUpper;
pItem->m_nLower=nLower;
if ((pItem->m_nUpper-pItem->m_nLower)<1e-5) pItem->m_nUpper=pItem->m_nLower+1;
pItem->m_nOldPos=0;
pItem->m_nPos=0;
pItem->m_nPointState=2;
pItem->m_nHistCount=0;
try
{
m_nItems.Add(pItem);
}
catch(CMemoryException *e)
{
if (pItem!=NULL) delete pItem;
e->Delete();
AfxMessageBox("Add Curve Error");
}
}
void CCurveDynamicFlow::DeleteAllLine()
{
int nIndex=m_nItems.GetSize();
for(int i=0;i<nIndex;i++)
{
delete m_nItems.GetAt(i);
}
m_nItems.RemoveAll();
}
void CCurveDynamicFlow::SetPos(short nIndex, float nPos, short nState, long nTime)
{
// TODO: Add your dispatch handler code here
if (nIndex>=m_nItems.GetSize()) return;
CLineChartItem *pItem;
pItem=m_nItems.GetAt(nIndex);
if (nPos>pItem->m_nUpper) nPos=pItem->m_nUpper;
if (nPos<pItem->m_nLower) nPos=pItem->m_nLower;
pItem->m_nOldPos=pItem->m_nPos;
pItem->m_nPos=nPos;
if (nTime<pItem->m_nPosTime) nTime=pItem->m_nPosTime;
if (nTime>m_nEndTime+m_nTimer) nTime=m_nEndTime+m_nTimer;
pItem->m_nOldPosTime=pItem->m_nPosTime;
pItem->m_nPosTime=nTime;
pItem->m_nPointState=nState;
}
void CCurveDynamicFlow::SetNLineX(short nNewValue)
{
// TODO: Add your property handler here
m_nLineX=nNewValue;
if (m_nLineX<0) m_nLineX=0;
if (m_nLineX>m_nWidth) m_nLineX=m_nWidth;
Invalidate(FALSE);
m_pParentWnd->SendMessage(SPLITLINEXCHANGE_MESSAGE,0,0);
}
void CCurveDynamicFlow::PreparePrint(short nIndex, short nCount, long* pTime, float* pPos, char* pName)
{
// TODO: Add your dispatch handler code here
if (nIndex>=m_nItems.GetSize()) return;
CLineChartItem *pItem;
pItem=m_nItems.GetAt(nIndex);
pItem->m_pCurvePos=pPos;
pItem->m_pTime=pTime;
pItem->m_nHistCount=nCount;
pItem->m_pName=pName;
}
void CCurveDynamicFlow::Printer(long nStartTime, long nEndTime, long nCurTime, float * pCurPos)
{
// TODO: Add your dispatch handler code here
CDC dc;
CPrintInfo Info;
DOCINFO di;
TEXTMETRIC nTm;
CPrintDialog PrintDlg(FALSE);
if (PrintDlg.DoModal()==IDCANCEL) return;
dc.Attach(PrintDlg.GetPrinterDC());
dc.m_bPrinting=TRUE;
//dc.SetMapMode(MM_TWIPS);
dc.SetMapMode(MM_LOMETRIC);
Info.SetMinPage(1);
Info.SetMaxPage(1);
di.cbSize=sizeof(DOCINFO);
di.lpszDocName="";
di.lpszOutput=NULL;
di.fwType=0;
short nTextHeight;
if (dc.GetTextMetrics(&nTm)!=0) nTextHeight=nTm.tmHeight+50;
short nPageHeight=dc.GetDeviceCaps(VERTRES);
short nPageWidth=dc.GetDeviceCaps(HORZRES);
short nCount=m_nItems.GetSize();
short nScale=((nPageHeight-(nCount+4)*nTextHeight)/m_nHeight<(nPageWidth-200)/m_nWidth)?(nPageHeight/m_nHeight):(nPageWidth/m_nWidth);
BOOL bPrintingOk=dc.StartDoc(&di);
dc.SetViewportOrg(0,0);
dc.StartPage();
//******draw title*******
CString nStr;
CFont nFont;
CTime nTime;
nTime=nCurTime;
nStr.Format("%s","------实 时 曲 线 图------");
CSize nSize=dc.GetTextExtent(nStr);
dc.TextOut((nPageWidth-nSize.cx)/2,nSize.cy,nStr);
nStr.Format("%4d/%2d/%2d",nTime.GetYear(),nTime.GetMonth(),nTime.GetDay());
nSize=dc.GetTextExtent(nStr);
dc.TextOut((nPageWidth-nSize.cx)/2,nSize.cy+nTextHeight,nStr);
//******end draw title **********
// ****draw grid*********
CPen nPen1(m_PrimPenStyle,m_PrimPenWidth,m_PrimPenColor);
CPen nPen2(m_PrimPenStyle,m_SecPenWidth,m_SecPenColor);
CPen *prePen;
CRect nRect;
nRect.SetRect(50,10+nTextHeight*2,m_nWidth*nScale+50,m_nHeight*nScale+nTextHeight*2+10);
float x=nRect.right-nRect.left;
float y=nRect.bottom-nRect.top;
float nRange=x/(m_xPrimLineSum+1);
int i,j;
for( i=0;i<=m_xPrimLineSum+1;i++)
{
prePen=dc.SelectObject(&nPen1);
dc.MoveTo((int)(i*nRange)+nRect.left,nRect.top);
dc.LineTo((int)(i*nRange)+nRect.left,nRect.bottom);
dc.SelectObject(prePen);
if (i<m_xPrimLineSum+1) for(j=1;j<m_xSecLineSum+1;j++)
{
prePen=dc.SelectObject(&nPen2);
dc.MoveTo((int)(i*nRange+j*nRange/(m_xSecLineSum+1))+nRect.left,nRect.top);
dc.LineTo((int)(i*nRange+j*nRange/(m_xSecLineSum+1))+nRect.left,nRect.bottom);
dc.SelectObject(prePen);
}
}
nRange=y/(m_yPrimLineSum+1);
for(i=0;i<=m_yPrimLineSum+1;i++)
{
prePen=dc.SelectObject(&nPen1);
dc.MoveTo(nRect.left,(int)(i*nRange)+nRect.top);
dc.LineTo(nRect.right,(int)(i*nRange)+nRect.top);
dc.SelectObject(prePen);
if (i<m_yPrimLineSum+1) for(j=1;j<m_ySecLineSum+1;j++)
{
prePen=dc.SelectObject(&nPen2);
dc.MoveTo(nRect.left,(int)(i*nRange+j*nRange/(m_ySecLineSum+1))+nRect.top);
dc.LineTo(nRect.right,(int)(i*nRange+j*nRange/(m_ySecLineSum+1)+nRect.top));
dc.SelectObject(prePen);
}
}
CPen nSplitPen(m_nSplitPenStyle,m_nSplitPenWidth,m_nSplitPenColor);
prePen=dc.SelectObject(&nSplitPen);
dc.MoveTo(nRect.left+(nCurTime-nStartTime)*m_nPigment*nScale/m_nTimer,nRect.top);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -