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

📄 curvehistflow.cpp

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