📄 curvehistflow.cpp
字号:
{
if (*(pItem->m_pTime+(j-1))-*(pItem->m_pTime+(j))>m_nTimer*3) continue;
CPen nPen(pItem->m_nPenStyle,pItem->m_nPenWidth,pItem->m_nPenColor);
CPen *pOldPen=m_MemDC.SelectObject(&nPen);
nOldPoint.x=(*(pItem->m_pTime+(j-1))-m_nStartTime)*m_nPigment/m_nTimer;
nOldPoint.y=m_nHeight-(int)((*(pItem->m_pCurvePos+(j-1))-pItem->m_nLower)*m_nHeight/nRange);
nNewPoint.x=(*(pItem->m_pTime+(j))-m_nStartTime)*m_nPigment/m_nTimer;
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)
{
if (*(pItem->m_pTime+0)==m_nStartTime)
{
pItem->m_nBeginState=NORMAL_POINT;
pItem->m_nBeginPos=m_nHeight-(int)((*(pItem->m_pCurvePos+0)-pItem->m_nLower)*m_nHeight/nRange);
}
else
{
pItem->m_nBeginState=BREAK_POINT;
}
if (*(pItem->m_pTime+pItem->m_nHistCount-1)==m_nEndTime)
{
pItem->m_nEndState=NORMAL_POINT;
pItem->m_nEndPos=m_nHeight-(int)((*(pItem->m_pCurvePos+pItem->m_nHistCount-1)-pItem->m_nLower)*m_nHeight/nRange);
}
else
{
pItem->m_nEndState=BREAK_POINT;
}
}
}
Invalidate(FALSE);
};
}
void CCurveHistFlow::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if (nFlags==VK_LBUTTON)
{
if (m_nPtInSplitLine) SetNLineX(point.x);
}
CWnd::OnMouseMove(nFlags, point);
}
void CCurveHistFlow::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CPoint nPointHead,nPointTail;
nPointHead.x=GetNLineX();
nPointHead.y=GetSplitLineTop();
nPointTail.x=GetNLineX();
nPointTail.y=GetSplitLineBottom();
m_nPtInSplitLine=ptInLine(point,nPointHead,nPointTail);
CWnd::OnLButtonDown(nFlags, point);
}
void CCurveHistFlow::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_nPtInSplitLine=FALSE;
CWnd::OnLButtonUp(nFlags, point);
}
BOOL CCurveHistFlow::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 CCurveHistFlow::DrawGrid(CDC *pDC)
{
int i,j;
float x,y,nRange;
CPen *prePen;
CPen nPen1(m_PrimPenStyle,m_PrimPenWidth,m_PrimPenColor);
CPen nPen2(m_PrimPenStyle,m_SecPenWidth,m_SecPenColor);
//************Draw Frame*********
CRect nRect;
CBrush nFrameBrush(m_nFrameColor);
nRect.SetRect(0,0,m_nFrameLeftW,m_nFrameTopH+m_nHeight+m_nFrameBottomH);
pDC->FillRect(&nRect,&nFrameBrush);
nRect.SetRect(m_nFrameLeftW,0,m_nFrameLeftW+m_nWidth,m_nFrameTopH);
pDC->FillRect(&nRect,&nFrameBrush);
nRect.SetRect(m_nFrameLeftW+m_nWidth,0,m_nFrameLeftW+m_nWidth+m_nFrameRightW,m_nFrameTopH+m_nHeight+m_nFrameBottomH);
pDC->FillRect(&nRect,&nFrameBrush);
//********* Draw Grid******************
nRect.SetRect(m_nFrameLeftW,m_nFrameTopH,m_nWidth+m_nFrameLeftW,m_nHeight+m_nFrameTopH);
x=nRect.right-nRect.left;
y=nRect.bottom-nRect.top;
nRange=x/(m_xPrimLineSum+1);
for(i=0;i<=m_xPrimLineSum+1;i++)
{
prePen=pDC->SelectObject(&nPen1);
pDC->MoveTo((int)(i*nRange)+nRect.left,nRect.top);
pDC->LineTo((int)(i*nRange)+nRect.left,nRect.bottom);
pDC->SelectObject(prePen);
if (i<m_xPrimLineSum+1) for(j=1;j<m_xSecLineSum+1;j++)
{
prePen=pDC->SelectObject(&nPen2);
pDC->MoveTo((int)(i*nRange+j*nRange/(m_xSecLineSum+1)+nRect.left),nRect.top);
pDC->LineTo((int)(i*nRange+j*nRange/(m_xSecLineSum+1)+nRect.left),nRect.bottom);
pDC->SelectObject(prePen);
}
}
nRange=y/(m_yPrimLineSum+1);
for(i=0;i<=m_yPrimLineSum+1;i++)
{
prePen=pDC->SelectObject(&nPen1);
pDC->MoveTo(nRect.left,(int)(i*nRange)+nRect.top);
pDC->LineTo(nRect.right,(int)(i*nRange)+nRect.top);
pDC->SelectObject(prePen);
if (i<m_yPrimLineSum+1) for(j=1;j<m_ySecLineSum+1;j++)
{
prePen=pDC->SelectObject(&nPen2);
pDC->MoveTo(nRect.left,(int)(i*nRange+j*nRange/(m_ySecLineSum+1))+nRect.top);
pDC->LineTo(nRect.right,(int)(i*nRange+j*nRange/(m_ySecLineSum+1))+nRect.top);
pDC->SelectObject(prePen);
}
}
if (m_xIdentifySum>0) // if have time coordinate identify
{
if ((m_nTimer*(m_nWidth/m_nPigment))%m_xIdentifySum!=0) m_xIdentifySum--;
m_xIdentifySpace=m_nWidth/m_xIdentifySum;
CString str;
CTime nTime;
nTime=m_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=pDC->SelectObject(&nFont);
CSize nSize=pDC->GetTextExtent(str);
m_xIdentifyWidth=nSize.cx;
m_xIdentifyCy=m_nHeight+(m_nFrameBottomH-nSize.cy)/2+nRect.top;
COLORREF preTextColor=pDC->SetTextColor(m_xIdentifyColor);
COLORREF preBkColor=pDC->SetBkColor(m_nFrameColor);
nTime=m_nEndTime;
short nPerTime;
nPerTime=(m_nEndTime-m_nStartTime)/m_xIdentifySum;
for (i=m_xIdentifySum;i>=0;i--)
{
pDC->TextOut(i*m_xIdentifySpace-m_xIdentifyWidth/2+nRect.left,m_xIdentifyCy,str);
nTime-=nPerTime;
str.Format("%2d_%2d:%2d:%2d",nTime.GetMonth(),nTime.GetDay(),nTime.GetHour(),nTime.GetMinute());
}
pDC->SelectObject(preFont);
pDC->SetTextColor(preTextColor);
pDC->SetBkColor(preBkColor);
nFont.DeleteObject();
}
CHistChartItem *pItem;
short nCount=m_yPrimLineSum+1;
COLORREF oldBkColor=pDC->SetBkColor(m_nFrameColor);
CSize nSize;
CString nStr;
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=m_nHeight/nCount;
float nTemp;
for(int j=0;j<=nCount;j++)
{
nTemp=pItem->m_nLower+j*nSpace;
if (nSpace>10.0)
{
nStr.Format("%6.0f",nTemp);
}
else if (nSpace>1.0)
{
nStr.Format("%6.1f",nTemp);
}
else
{
nStr.Format("%6.2f",nTemp);
}
nStr.TrimLeft();
nSize=pDC->GetTextExtent(nStr);
if (i==0)
{
if (j==0 ) pDC->TextOut(m_nFrameLeftW-nSize.cx-2,m_nFrameTopH+m_nHeight-nHeightSpace*j-nSize.cy,nStr);
else pDC->TextOut(m_nFrameLeftW-nSize.cx-2,m_nFrameTopH+m_nHeight-nHeightSpace*j-nSize.cy/2,nStr);
}
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 CCurveHistFlow::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);
}
void CCurveHistFlow::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
// Get the scroll position ourselves to ensure we get a 32 bit value
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 CCurveHistFlow::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 CCurveHistFlow::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 + -