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

📄 curvedynamicflow.cpp

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