⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 curvedynamicflow.cpp

📁 远程视频监控系统最新程序代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	 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 + -