📄 curvedynamicflow.cpp
字号:
dc.LineTo(nRect.left+(nCurTime-nStartTime)*m_nPigment*nScale/m_nTimer,nRect.bottom);
dc.SelectObject(prePen);
//*****end draw curve Grid*********
CLineChartItem *pItem;
nCount=m_nItems.GetSize();
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 ((nTime>m_nEndTime)||(nTime<m_nStartTime))continue;
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
{
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",nTime.GetHour(),nTime.GetMinute(),nTime.GetSecond());
//CFont nFont;
// nFont.CreatePointFont(m_nTimeCoordFontSize*nScale,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;
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)*m_nPerTime);
str.Format("%2d:%2d:%2d",nTime.GetHour(),nTime.GetMinute(),nTime.GetSecond());
}
// 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--%-5.0f 时间:%2d:%2d:%2d 值:%5.0f",pItem->m_pName,pItem->m_nUpper,pItem->m_nLower,nTime.GetHour(),nTime.GetMinute(),nTime.GetSecond(),*(pCurPos+i));
}
else if (fabs(pItem->m_nUpper)>10.0)
{
nStr.Format("%-40s上下限:%5.1f--%-5.1f 时间:%2d:%2d:%2d 值:%5.1f",pItem->m_pName,pItem->m_nUpper,pItem->m_nLower,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 值:%5.3f",pItem->m_pName,pItem->m_nUpper,pItem->m_nLower,nTime.GetHour(),nTime.GetMinute(),nTime.GetSecond(),*(pCurPos+i));
}
else
{
nStr.Format("%-40s上下限:%6.4f--%-6.4f 时间:%2d:%2d:%2d 值:%6.4f",pItem->m_pName,pItem->m_nUpper,pItem->m_nLower,nTime.GetHour(),nTime.GetMinute(),nTime.GetSecond(),*(pCurPos+i));
}
dc.TextOut(150+10*nScale,nRect.bottom+(i+1)*nTextHeight,nStr);
}
bPrintingOk=(dc.EndPage()>0);
if (bPrintingOk)
dc.EndDoc();
else
dc.AbortDoc();
dc.SetMapMode(MM_TEXT);
dc.Detach();
}
void CCurveDynamicFlow::EndPrint()
{
// TODO: Add your dispatch handler code here
int nCount=m_nItems.GetSize();
CLineChartItem *pItem;
for (int i=0;i<nCount;i++)
{
pItem=m_nItems.GetAt(i);
pItem->m_nHistCount=0;
pItem->m_pTime=NULL;
pItem->m_pCurvePos=NULL;
}
}
void CCurveDynamicFlow::SetHistoryPos(short nIndex, float *pAnavalArray, long *pTimeArray, short nCount)
{
if (nIndex>=m_nItems.GetSize()) return;
CLineChartItem *pItem;
pItem=m_nItems.GetAt(nIndex);
pItem->m_pCurvePos=pAnavalArray;
pItem->m_pTime=pTimeArray;
pItem->m_nHistCount=nCount;
}
void CCurveDynamicFlow::DrawHistoryData()
{
if (m_MemDC.GetSafeHdc()!=NULL)
{
int nCount=m_nItems.GetSize();
CLineChartItem* pItem;
CPoint nOldPoint,nNewPoint;
float nRange;
CRect nRect;
nRect.SetRect(0,0,m_nWidth,m_nHeight+m_nFrameTopH);
for (int i=nCount-1;i<nCount;i++)
{
pItem=m_nItems.GetAt(i);
nRange=pItem->m_nUpper-pItem->m_nLower;
CPen nPen(pItem->m_nPenStyle,pItem->m_nPenWidth,pItem->m_nPenColor);
CPen *pOldPen=m_MemDC.SelectObject(&nPen);
for (int j=1;j<pItem->m_nHistCount;j++)
{
if (*(pItem->m_pTime+j)<=m_nStartTime) continue;
if (fabs(*(pItem->m_pTime+j)-*(pItem->m_pTime+j-1))>4*m_nTimer) continue;
nOldPoint.x=nRect.right-(m_nEndTime-*(pItem->m_pTime+(j-1)))*m_nPigment/m_nTimer;
nNewPoint.x=nRect.right-(m_nEndTime-*(pItem->m_pTime+(j)))*m_nPigment/m_nTimer;
nOldPoint.y=m_nHeight-(int)((*(pItem->m_pCurvePos+(j-1))-pItem->m_nLower)*m_nHeight/nRange);
nNewPoint.y=m_nHeight-(int)((*(pItem->m_pCurvePos+(j))-pItem->m_nLower)*m_nHeight/nRange);
if (nOldPoint.y>m_nHeight) nOldPoint.y=m_nHeight;
if (nOldPoint.y<0) nOldPoint.y=0;
if (nNewPoint.y>m_nHeight) nNewPoint.y=m_nHeight;
if (nNewPoint.y<0) nNewPoint.y=0;
m_MemDC.MoveTo(nOldPoint);
m_MemDC.LineTo(nNewPoint);
}
m_MemDC.SelectObject(pOldPen);
if (pItem->m_nHistCount>0)
{
pItem->m_nPos=*(pItem->m_pCurvePos+(pItem->m_nHistCount-1));
pItem->m_nPosTime=*(pItem->m_pTime+(pItem->m_nHistCount-1));
}
}
Invalidate(FALSE);
};
}
BOOL CCurveDynamicFlow::ptInLine(CPoint point, CPoint nPointHead, CPoint nPointTail)
{
int x=point.x;
int y=point.y;
int x1=nPointHead.x;
int y1=nPointHead.y;
int x2=nPointTail.x;
int y2=nPointTail.y;
if(((x>x1+5)&&(x>x2+5))||((x<x1-5)&&(x<x2-5))) return FALSE;
if (abs(x1-x2)<5)
{
if (abs(x-x1)>9) return FALSE;
if (((y>y1+5)&&(y<y2-5))||((y>y2+5)&&(y<y1-5))) return TRUE;
else return FALSE;
}
else
{
if (abs(x-x1)<5)
{
if (abs(y-y1)<5) return TRUE;
else return FALSE;
}
return abs((x2-x1)*(y-y1)-(y2-y1)*(x-x1))<300;
}
}
void CCurveDynamicFlow::ResetScrollBars()
{
if (!::IsWindow(GetSafeHwnd())) return;
CRect nRect;
GetClientRect(nRect);
SCROLLINFO si;
si.cbSize = sizeof(SCROLLINFO);
si.fMask = SIF_PAGE;
si.nPage = nRect.right;
SetScrollInfo(SB_HORZ, &si, FALSE);
//SetScrollRange(SB_VERT, 0, m_nWid, TRUE);
SetScrollRange(SB_HORZ, 0, nRect.right, TRUE);
//SetScrollPos32(SB_HORZ,0,TRUE);
}
BOOL CCurveDynamicFlow::OnAmbientProperty(COleControlSite* pSite, DISPID dispid, VARIANT* pvar)
{
// TODO: Add your specialized code here and/or call the base class
return CWnd::OnAmbientProperty(pSite, dispid, pvar);
}
void CCurveDynamicFlow::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
CRect nRect;
GetClientRect(nRect);
float nScale=(float)nRect.right/(float)m_nWidth;
short nScrollPos,nSplitPos;
AfxGetApp()->BeginWaitCursor();
switch (nSBCode)
{
case SB_LINERIGHT:
//nSplitPos=GetNLineX();
/*
nSplitPos=2*m_nWidth;
SetNLineX(nSplitPos);
nSplitPos=m_nWidth;
SetScrollPos(SB_HORZ,nSplitPos*nScale,TRUE);
*/
break;
case SB_LINELEFT:
/*
nSplitPos=-m_nWidth;
SetNLineX(nSplitPos);
nSplitPos=0;
SetScrollPos(SB_HORZ,nSplitPos*nScale,TRUE);
*/
break;
case SB_PAGERIGHT:
nSplitPos=GetNLineX();
nSplitPos+=10*m_nPigment;
SetNLineX(nSplitPos);
if (nSplitPos>m_nWidth)
{
nSplitPos=m_nWidth;
}
SetScrollPos(SB_HORZ,nSplitPos*nScale,TRUE);
break;
case SB_PAGELEFT:
nSplitPos=GetNLineX();
nSplitPos-=10*m_nPigment;
SetNLineX(nSplitPos);
if (nSplitPos<0)
{
nSplitPos=0;
}
SetScrollPos(SB_HORZ,nSplitPos*nScale,TRUE);
break;
case SB_THUMBPOSITION:
case SB_THUMBTRACK:
nScrollPos=GetScrollPos32(SB_HORZ,TRUE);
nSplitPos=nScrollPos/nScale;
if (nSplitPos%m_nPigment!=0)
{
nSplitPos=nSplitPos/m_nPigment*m_nPigment;
nScrollPos=nSplitPos*nScale;
}
SetNLineX(nSplitPos);
if (nSplitPos<0) nSplitPos=0;
else if (nSplitPos>m_nWidth)nSplitPos=m_nWidth;
SetScrollPos32(SB_HORZ,nSplitPos*nScale,TRUE);
break;
case SB_LEFT:
break;
case SB_RIGHT:
break;
default: break;
}
AfxGetApp()->EndWaitCursor();
CWnd::OnHScroll(nSBCode, nPos, pScrollBar);
}
int CCurveDynamicFlow::GetScrollPos32(int nBar, BOOL bGetTrackPos /* = FALSE */)
{
SCROLLINFO si;
si.cbSize = sizeof(SCROLLINFO);
if (bGetTrackPos)
{
if (GetScrollInfo(nBar, &si, SIF_TRACKPOS))
return si.nTrackPos;
}
else
{
if (GetScrollInfo(nBar, &si, SIF_POS))
return si.nPos;
}
return 0;
}
BOOL CCurveDynamicFlow::SetScrollPos32(int nBar, int nPos, BOOL bRedraw /* = TRUE */)
{
SCROLLINFO si;
si.cbSize = sizeof(SCROLLINFO);
si.fMask = SIF_POS;
si.nPos = nPos;
return SetScrollInfo(nBar, &si, bRedraw);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -