📄 curvehistflow.cpp
字号:
{
delete m_nItems.GetAt(i);
}
m_nItems.RemoveAll();
}
void CCurveHistFlow::SetPos(short nIndex, float nPos, short nState, long nTime)
{
// TODO: Add your dispatch handler code here
if (nIndex>=m_nItems.GetSize()) return;
CHistChartItem *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 CCurveHistFlow::SetNLineX(short nNewValue)
{
// TODO: Add your property handler here
short nMovePixels;
m_nLineX=nNewValue;
long nTempTime;
CTime nTime;
nTime=CTime::GetCurrentTime();
if (m_nLineX<0)
{
if (m_nLineX==-m_nWidth)
{
nTempTime=m_nEndTime-m_nStartTime;
m_nEndTime=m_nStartTime;
m_nStartTime-=nTempTime;
m_nLineX=0;
m_pParentWnd->SendMessage(HIST_CURVE_BACKMOVE_MESSAGE,1,HIST_MOVE_CURVE);
}
else
{
nMovePixels=abs(m_nLineX-0);
m_nLineX=0;
m_pParentWnd->SendMessage(HIST_CURVE_BACKMOVE_MESSAGE,nMovePixels/m_nPigment,HIST_MOVE_POINT);
}
}
else if (m_nLineX>m_nWidth)
{
if (m_nLineX==2*m_nWidth)
{
nTempTime=m_nEndTime-m_nStartTime;
if ((m_nEndTime+nTempTime)>nTime.GetTime()) return;
m_nStartTime=m_nEndTime;
m_nEndTime+=nTempTime;
m_nLineX=m_nWidth;
m_pParentWnd->SendMessage(HIST_CURVE_FORWARDMOVE_MESSAGE,1,HIST_MOVE_CURVE);
}
else
{
nMovePixels=abs(m_nLineX-m_nWidth);
m_nLineX=m_nWidth;
m_pParentWnd->SendMessage(HIST_CURVE_FORWARDMOVE_MESSAGE,nMovePixels/m_nPigment,HIST_MOVE_POINT);
}
}
else
{
m_pParentWnd->SendMessage(HIST_SPLITLINEXCHANGE_MESSAGE,0,0);
}
Invalidate(FALSE);
}
void CCurveHistFlow::PreparePrint(short nIndex, short nCount, long* pTime, float* pPos, char* pName)
{
// TODO: Add your dispatch handler code here
if (nIndex>=m_nItems.GetSize()) return;
CHistChartItem *pItem;
pItem=m_nItems.GetAt(nIndex);
pItem->m_pCurvePos=pPos;
pItem->m_pTime=pTime;
pItem->m_nHistCount=nCount;
pItem->m_pName=pName;
}
void CCurveHistFlow::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);
// CPen nSplitPen(m_nSplitPenStyle,3,RGB(0,0,0));
prePen=dc.SelectObject(&nSplitPen);
dc.MoveTo(nRect.left+(nCurTime-nStartTime)*m_nPigment*nScale/m_nTimer,nRect.top);
dc.LineTo(nRect.left+(nCurTime-nStartTime)*m_nPigment*nScale/m_nTimer,nRect.bottom);
dc.SelectObject(prePen);
//*****end draw curve Grid*********
CHistChartItem *pItem;
for (i=0;i<nCount;i++)
{
pItem=m_nItems.GetAt(i);
short nOldPos=0;
short nOldTime=0;
nRange=pItem->m_nUpper-pItem->m_nLower;
CPen nPen(pItem->m_nPenStyle,pItem->m_nPenWidth,pItem->m_nPenColor);
CPen *prePen=dc.SelectObject(&nPen);
for(j=0;j<pItem->m_nHistCount;j++)
{
float nPos=*(pItem->m_pCurvePos+j);
long nTime=*(pItem->m_pTime+j);
if (nPos>pItem->m_nUpper) nPos=pItem->m_nUpper;
if (nPos<pItem->m_nLower) nPos=pItem->m_nLower;
short x=(int)((float)(nTime-m_nStartTime)/m_nTimer*m_nPigment*nScale);
short y=(int)(nRect.Height()-(nPos-pItem->m_nLower)*nRect.Height()/nRange);
if ((j!=0)&&((x-nOldTime)<=3*m_nPigment*nScale)) // if first point or space between two point greater 3 point
{
if (fabs(x-nOldTime)<m_nPigment*4*nScale)
{
dc.MoveTo(nOldTime+nRect.left,nOldPos+nRect.top);
dc.LineTo(x+nRect.left,y+nRect.top);
}
}
nOldPos=y;
nOldTime=x;
}
dc.SelectObject(prePen);
}
if (m_xIdentifySum!=0) // if have time coordinate identify
{
CString str;
CTime nTime;
nTime=nEndTime;
str.Format("%2d_%2d:%2d:%2d",nTime.GetMonth(),nTime.GetDay(),nTime.GetHour(),nTime.GetMinute());
//CFont nFont;
//nFont.CreatePointFont(m_nTimeCoordFontSize,m_nTimeCoordFontName,NULL);
//CFont *preFont=dc.SelectObject(&nFont);
CSize nSize=dc.GetTextExtent(str);
COLORREF preTextColor=dc.SetTextColor(m_xIdentifyColor);
short nIdentifySpace=(nRect.right-nRect.left)/m_xIdentifySum;
long nPerTime=(nEndTime-nStartTime)/m_xIdentifySum;
for (i=m_xIdentifySum;i>=0;i--)
{
dc.TextOut(i*nIdentifySpace-nSize.cx/2+nRect.left,nRect.bottom+nSize.cy/2,str);
nTime=(time_t)(nEndTime-(m_xIdentifySum-i+1)*nPerTime);
str.Format("%2d_%2d:%2d:%2d",nTime.GetMonth(),nTime.GetDay(),nTime.GetHour(),nTime.GetMinute());
}
//dc.SelectObject(preFont);
dc.SetTextColor(preTextColor);
// nFont.DeleteObject();
}
for (i=0;i<nCount;i++)
{
pItem=m_nItems.GetAt(i);
CPen nPen(pItem->m_nPenStyle,pItem->m_nPenWidth,pItem->m_nPenColor);
//CPen nPen(pItem->m_nPenStyle,3,pItem->m_nPenColor);
CPen *prePen=dc.SelectObject(&nPen);
dc.MoveTo(100,nRect.bottom+(i+1)*nTextHeight+20);
dc.LineTo(100+10*nScale,nRect.bottom+(i+1)*nTextHeight+20);
dc.SelectObject(prePen);
CString nStr;
CTime nTime=nCurTime;
if (fabs(pItem->m_nUpper)>100.0)
{
nStr.Format("%-40s上下限:%5.0f--%-4.0f时间:%-2d_%-2d:%-2d:%-2d:%-2d 值:%5.0f",pItem->m_pName,pItem->m_nUpper,pItem->m_nLower,nTime.GetMonth(),nTime.GetDay(),nTime.GetHour(),nTime.GetMinute(),nTime.GetSecond(),*(pCurPos+i));
}
else if (fabs(pItem->m_nUpper)>10.0)
{
nStr.Format("%-40s上下限:%5.1f--%-4.1f时间:%-2d_%-2d:%-2d:%-2d:%-2d 值:%5.1f",pItem->m_pName,pItem->m_nUpper,pItem->m_nLower,nTime.GetMonth(),nTime.GetDay(),nTime.GetHour(),nTime.GetMinute(),nTime.GetSecond(),*(pCurPos+i));
}
else if (fabs(pItem->m_nUpper)>0.001)
{
nStr.Format("%-40s上下限:%5.3f--%-5.3f时间:%-2d_%-2d:%-2d:%-2d:%-2d 值:%5.3f",pItem->m_pName,pItem->m_nUpper,pItem->m_nLower,nTime.GetMonth(),nTime.GetDay(),nTime.GetHour(),nTime.GetMinute(),nTime.GetSecond(),*(pCurPos+i));
}
else
{
nStr.Format("%-40s上下限:%6.4f--%-5.4f时间:%-2d_%-2d:%-2d:%-2d:%-2d 值:%6.4f",pItem->m_pName,pItem->m_nUpper,pItem->m_nLower,nTime.GetMonth(),nTime.GetDay(),nTime.GetHour(),nTime.GetMinute(),nTime.GetSecond(),*(pCurPos+i));
}
dc.TextOut(50+10*nScale,nRect.bottom+(i+1)*nTextHeight,nStr);
nStr.Empty();
}
nRect.SetRect(50,10+nTextHeight*2,m_nWidth*nScale+50,m_nHeight*nScale+nTextHeight*2+10);
nCount=m_yPrimLineSum+1;
for(i=0;i<2;i++)
{
if (i>=m_nItems.GetSize()) break;
pItem=m_nItems.GetAt(i);
float nSpace=(pItem->m_nUpper-pItem->m_nLower)/nCount;
float nHeightSpace=nRect.Height()/nCount;
float nTemp;
for(int j=0;j<=nCount;j++)
{
nTemp=pItem->m_nLower+j*nSpace;
if (nSpace>1.0)
{
nStr.Format("%6.0f",nTemp);
}
else if (nSpace>0.1)
{
nStr.Format("%6.1f",nTemp);
}
else
{
nStr.Format("%6.2f",nTemp);
}
nStr.TrimLeft();
nSize=dc.GetTextExtent(nStr);
if (i==0)
{
if (j==0 ) dc.TextOut(nRect.left-nSize.cx-2,nRect.bottom-nHeightSpace*j-nSize.cy,nStr);
else dc.TextOut(nRect.left-nSize.cx-2,nRect.bottom-nHeightSpace*j-nSize.cy/2,nStr);
}
else
{
if (j==0 ) dc.TextOut(nRect.right+2,nRect.bottom-nHeightSpace*j-nSize.cy,nStr);
else dc.TextOut(nRect.right+2,nRect.bottom-nHeightSpace*j-nSize.cy/2,nStr);
}
nStr.Empty();
}
}
bPrintingOk=(dc.EndPage()>0);
if (bPrintingOk)
dc.EndDoc();
else
dc.AbortDoc();
dc.SetMapMode(MM_TEXT);
dc.Detach();
}
void CCurveHistFlow::EndPrint()
{
// TODO: Add your dispatch handler code here
int nCount=m_nItems.GetSize();
CHistChartItem *pItem;
for (int i=0;i<nCount;i++)
{
pItem=m_nItems.GetAt(i);
pItem->m_nHistCount=0;
}
}
void CCurveHistFlow::SetHistoryPos(short nIndex, float *pAnavalArray, long *pTimeArray, short nCount)
{
if (nIndex>=m_nItems.GetSize()) return;
CHistChartItem *pItem;
pItem=m_nItems.GetAt(nIndex);
pItem->m_pCurvePos=pAnavalArray;
pItem->m_pTime=pTimeArray;
pItem->m_nHistCount=nCount;
}
void CCurveHistFlow::DrawHistoryData()
{
if (m_MemDC.GetSafeHdc()!=NULL)
{
int nCount=m_nItems.GetSize();
CHistChartItem* pItem;
CPoint nOldPoint,nNewPoint;
float nRange;
CRect nRect;
nRect.SetRect(0,0,m_nWidth,m_nHeight+m_nFrameTopH);
BOOL bBeginPointNormal=TRUE,bEndPointNormal=TRUE;
for (int i=nCount-1;i<nCount;i++)
{
pItem=m_nItems.GetAt(i);
nRange=pItem->m_nUpper-pItem->m_nLower;
for (int j=1;j<pItem->m_nHistCount;j++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -