www.pudn.com > RMS2000_C.rar > CurveView.cpp


// CurveView.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "DrawCli.h" 
#include "CurveView.h" 
#include "CurveDoc.h" 
#include "mainfrm.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
int MyColor[CURVE_NUM][3]= 
           { 255,0,0,     0,255,0,     0,0,255,    255,255,0,// 0,0,0, 
		     0,255,255,	  255,0,255,  128,0,0,     128,128,0, 
             0,128,0,	  0,128,128,  0,255,128,   162,103,52, 
             255,128,64,  128,64,0,	  0,128,64,    64,0,128, 
		   }; 
 
///////////////////////////////////////////////////////////////////////////// 
// CCurveView 
 
IMPLEMENT_DYNCREATE(CCurveView, CFolderView) 
 
CCurveView::CCurveView() 
{ 
	m_iPage=0; 
} 
 
CCurveView::~CCurveView() 
{ 
} 
 
 
BEGIN_MESSAGE_MAP(CCurveView, CFolderView) 
	//{{AFX_MSG_MAP(CCurveView) 
	ON_WM_CHAR() 
	ON_COMMAND(ID_WINDOW_NEW, OnWindowNew) 
	ON_COMMAND(ID_FILE_SAVE, OnFileSave) 
	ON_COMMAND(ID_FILE_SAVE_AS, OnFileSaveAs) 
	//}}AFX_MSG_MAP 
  
	ON_COMMAND(ID_FILE_PRINT, CFolderView::OnFilePrint) 
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CFolderView::OnFilePrint) 
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CFolderView::OnFilePrintPreview) 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CCurveView drawing 
 
void CCurveView::OnChangedFolder(int iPage) 
{ 
	m_iPage = iPage; 
	Invalidate(); 
} 
 
void CCurveView::OnInitialUpdate() 
{ 
	CFolderView::OnInitialUpdate(); 
 
	CSize size = CSize(1024,768);//GetDocument()->GetDocSize(); 
	CClientDC dc(NULL); 
	size.cx = MulDiv(size.cx, dc.GetDeviceCaps(LOGPIXELSX), 100); 
	size.cy = MulDiv(size.cy, dc.GetDeviceCaps(LOGPIXELSY), 100); 
	SetScrollSizes(MM_TEXT, size); 
 	GetFolderFrame()->ShowControls(CFolderFrame::bestFit); 
} 
 
void CCurveView::OnDraw(CDC* pDC) 
{ 
	CCurveDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
 
 	int      i,k,cx,cy,iCurveNum;  
	int      xres,yres,xOrg,yOrg; 
	CRect    DrawZone; 
	USEDATA* lpUseDat; 
	float    MaxVal,MinVal, 
	         xScale,yScale; 
    float    sMaxV[CURVE_NUM], 
	         sMinV[CURVE_NUM], 
	         sSumV[CURVE_NUM]; 
	CPen     pen[CURVE_NUM];  
	CPen*    pOldPen; 
	char     szBuff[64]; 
 
	CFont hMyFont; 
	CFont* OldFont; 
 	hMyFont.CreateFont(20,             //lfHeight 10    字体高度 
		      24,                     //lfWidth 8       字体宽度 
		      0,                     //lfEscapement		字体旋转角度 
		      0,                     //lfOrientation	字体方向 
		      FW_BOLD,               //lfWeight			字体轻重 
		      FALSE,                 //lfItalic			是否斜体 
		      FALSE,                 //lfUnderline		是否下划线 
		      FALSE,                 //lfStrikeOut		是否强调线 
		      DEFAULT_CHARSET,          //lfCharSet		字符集 
		      OUT_DEFAULT_PRECIS,    //lfOutPrecision	输出精度 
		      CLIP_DEFAULT_PRECIS,   //lfClipPrecision	剪裁精度 
		      DEFAULT_QUALITY,       //lfQuality		输出质量 
		      FIXED_PITCH|FF_MODERN, //lfPitchAndFamily	间距和字体族	 
		      "楷体_GB2312"// Arial"        //lfFaceName		字体名,可为空 
		    ); 
 
 	CClientDC dc(this); 
   	OnPrepareDC(&dc); 
      
	lpUseDat=(USEDATA*)pDoc->m_UseDat; 
	iCurveNum=pDoc->m_InfoTable.CurveNum; 
	if (iCurveNum==0) return; 
	for (i=0; ilpUseDat[i].Val[k]) 
			 sMinV[i]=lpUseDat[i].Val[k]; 
		 sSumV[i]=sSumV[i]+lpUseDat[i].Val[k]; 
	  } 
    } 
 
    MaxVal=sMaxV[0]; 
    MinVal=sMinV[0]; 
    for (i=0; isMinV[i]) 
		  MinVal=sMinV[i]; 
    } 
  
	if (MaxVal==0) MaxVal=1.0; 
	if (MinVal>0) MinVal=0.0; 
 
 	xres=dc.GetDeviceCaps(HORZRES); 
	if (xres==640) 
		yres=480; 
	    else if (xres==800) 
		        yres=600; 
	            else if (xres==1024) 
			            yres=768; 
		                else yres=1024;  
 
	DrawZone.left=100; 	DrawZone.right=DrawZone.left+(int)(xres*0.7); 
	DrawZone.top=80;  	DrawZone.bottom=DrawZone.top+(int)(yres*0.6); 
 
	CDrawApp* pApp=(CDrawApp*)AfxGetApp(); 
	int point=(pApp->m_QJCS.StoreLap+1); 
 
  if (m_iPage == PAGE_LINE) 
  { 
	xOrg=DrawZone.left; 
	yOrg=DrawZone.bottom; 
	xScale=(float)((DrawZone.right-DrawZone.left)/95.0); 
	yScale=(float)((MaxVal-MinVal)/(DrawZone.bottom-DrawZone.top)); 
 
	// Draw coordinate axes 
	dc.MoveTo(DrawZone.left,DrawZone.top); 
	dc.LineTo(DrawZone.left,DrawZone.bottom); //Y-axis 
	dc.MoveTo(DrawZone.left,DrawZone.bottom-(int)((0-MinVal)/yScale)); 
    dc.LineTo(DrawZone.right,DrawZone.bottom-(int)((0-MinVal)/yScale));//X-axis 
 
	// Draw coordinate scale(VERTICAL) 
	dc.MoveTo(DrawZone.left-4,DrawZone.top); 
 	dc.LineTo(DrawZone.left+4,DrawZone.top); 
	dc.MoveTo(DrawZone.left-4,DrawZone.bottom); 
 	dc.LineTo(DrawZone.left+4,DrawZone.bottom); 
	for	(i=0; i<=8; i++) 
	{ 
	   k=(int)((MaxVal-MinVal)*i/(yScale*8)); 
//	   if (i!=8) 
	   { 
         dc.MoveTo(xOrg-2,yOrg-k); 
//         dc.LineTo(xOrg,yOrg-k); 
         dc.LineTo(DrawZone.right,yOrg-k); 
	   } 
	    
	   sprintf(szBuff,"%9.2f",MinVal+(MaxVal-MinVal)*i/8);  
	   dc.TextOut(xOrg-80,yOrg-k-5,szBuff,strlen(szBuff)); 
	} 
 
  	// Draw coordinate scale(HORIZON) 
	dc.MoveTo(DrawZone.right,DrawZone.bottom-(int)((0-MinVal)/yScale-4)); 
 	dc.LineTo(DrawZone.right,DrawZone.bottom-(int)((0-MinVal)/yScale+4)); 
	for (i=0; i<96; i++) 
	{  
		cx=xOrg+(int)(xScale*i); 
		cy=yOrg-(int)((0-MinVal)/yScale); 
		if (i%4==0) 
		{ 
		   wsprintf(szBuff,"%d",i/4); 
		   dc.TextOut(cx-8,cy+4,szBuff,strlen(szBuff)); 
		} 
		if (i!=95) 
		{ 
		   if (i%4==0) 
		     dc.MoveTo(cx,DrawZone.top); 
		   else	 
	         dc.MoveTo(cx,cy); 
		   if (i%4==0) 
			 dc.LineTo(cx,cy+8); 
		   else 
			 dc.LineTo(cx,cy+4); 
		} 
	} 
 
	for (i=0; im_InfoTable.RtuNum[i]-1],sizeof(RmsSta)); 
		strcat(szBuff,s.RtuName); 
        strcat(szBuff," "); 
		strcat(szBuff,pDoc->m_InfoTable.ycName[i]); 
 
		sprintf(szBuff,"%s%s<%04d-%02d-%02d>", 
						 s.RtuName, 
                         pDoc->m_InfoTable.ycName[i], 
                         pDoc->m_InfoTable.Year[i], 
                         pDoc->m_InfoTable.Month[i], 
                         pDoc->m_InfoTable.Day[i] 
						 ); 
 
		dc.TextOut(cx+30,cy-10,szBuff,strlen(szBuff)); 
 
		if (i==(iCurveNum-1))  
			dc.SelectObject(pOldPen); 
	} 
 
	cx=(int)((float)xres*0.3); 
	cy=DrawZone.top-50; 
	dc.SelectObject(hMyFont); 
	strcpy(szBuff,"历史数据曲线");	 
 	dc.SetTextColor(RGB(0,0,255)); 
	dc.TextOut(cx,cy,szBuff,strlen(szBuff)); 
  } 
 
  if (m_iPage == PAGE_TAB) 
  { 
	DrawZone.left=80; 	DrawZone.right=DrawZone.left+(int)(xres*0.8); 
	DrawZone.top=40;  	DrawZone.bottom=DrawZone.top+(int)(yres*0.7); 
 
	cx=(int)((float)xres*0.3); 
	cy=DrawZone.top-38; 
 
	xOrg=DrawZone.left; 
	yOrg=DrawZone.bottom; 
	xScale=(float)((DrawZone.right-DrawZone.left)/iCurveNum); 
	yScale=(float)((MaxVal-MinVal)/(DrawZone.bottom-DrawZone.top)); 
 
	// Draw coordinate axes 
	dc.MoveTo(DrawZone.left,DrawZone.top); 
	dc.LineTo(DrawZone.left,DrawZone.bottom); //Y-axis 
	dc.MoveTo(DrawZone.left,DrawZone.bottom-(int)((0-MinVal)/yScale)); 
    dc.LineTo(DrawZone.right,DrawZone.bottom-(int)((0-MinVal)/yScale));//X-axis 
 
	// Draw coordinate scale(VERTICAL) 
	dc.MoveTo(DrawZone.left,DrawZone.top); 
 	dc.LineTo(DrawZone.left,DrawZone.top); 
	dc.MoveTo(DrawZone.left,DrawZone.bottom); 
 	dc.LineTo(DrawZone.left,DrawZone.bottom); 
 
	for	(i=0; i<=24; i++) 
	{ 
	   k=(int)((MaxVal-MinVal)*i/(yScale*24)); 
       dc.MoveTo(xOrg,yOrg-k); 
 	   dc.LineTo(DrawZone.right,yOrg-k); 
	   sprintf(szBuff,"%d",24-i); 
	   if (i>0) 
	     dc.TextOut(xOrg-20,yOrg-k+1,szBuff,strlen(szBuff)); 
	} 
 
 	dc.MoveTo(DrawZone.right,DrawZone.bottom-(int)((0-MinVal)/yScale)); 
 	dc.LineTo(DrawZone.right,DrawZone.bottom-(int)((0-MinVal)/yScale)); 
	for (i=0; im_InfoTable.ycName[i]); 
	  dc.TextOut(xOrg+(int)(xScale*i)+5,DrawZone.top-17,szBuff,strlen(szBuff)); 
    } 
 
	cx=(int)((float)xres*0.3); 
	cy=DrawZone.top-38; 
	dc.SelectObject(&hMyFont); 
 	dc.SetTextColor(RGB(0,0,255)); 
 	strcpy(szBuff,"历史数据表格");	 
  	dc.TextOut(cx,cy,szBuff,strlen(szBuff)); 
  } 
 
  if (m_iPage == PAGE_SUBVAL) 
  { 
	DrawZone.left=80; 	DrawZone.right=DrawZone.left+(int)(xres*0.8); 
	DrawZone.top=40;  	DrawZone.bottom=DrawZone.top+(int)(yres*0.7); 
	cx=(int)((float)xres*0.3); 
	cy=DrawZone.top-38; 
 
	xOrg=DrawZone.left; 
	yOrg=DrawZone.bottom; 
	xScale=(float)((DrawZone.right-DrawZone.left)/iCurveNum); 
	yScale=(float)((MaxVal-MinVal)/(DrawZone.bottom-DrawZone.top)); 
 
	// Draw coordinate axes 
	dc.MoveTo(DrawZone.left,DrawZone.top); 
	dc.LineTo(DrawZone.left,DrawZone.bottom); //Y-axis 
	dc.MoveTo(DrawZone.left,DrawZone.bottom-(int)((0-MinVal)/yScale)); 
    dc.LineTo(DrawZone.right,DrawZone.bottom-(int)((0-MinVal)/yScale));//X-axis 
 
	// Draw coordinate scale(VERTICAL) 
	dc.MoveTo(DrawZone.left,DrawZone.top); 
 	dc.LineTo(DrawZone.left,DrawZone.top); 
	dc.MoveTo(DrawZone.left,DrawZone.bottom); 
 	dc.LineTo(DrawZone.left,DrawZone.bottom); 
 
	for	(i=0; i<=24; i++) 
	{ 
	   k=(int)((MaxVal-MinVal)*i/(yScale*24)); 
       dc.MoveTo(xOrg,yOrg-k); 
 	   dc.LineTo(DrawZone.right,yOrg-k); 
	   sprintf(szBuff,"%d-%d",24-i,24-i+1); 
	   if (i>0) 
	     dc.TextOut(xOrg-46,yOrg-k+1,szBuff,strlen(szBuff)); 
	} 
 
 	dc.MoveTo(DrawZone.right,DrawZone.bottom-(int)((0-MinVal)/yScale)); 
 	dc.LineTo(DrawZone.right,DrawZone.bottom-(int)((0-MinVal)/yScale)); 
	for (i=0; im_InfoTable.ycName[i]); 
	  dc.TextOut(xOrg+(int)(xScale*i)+5,DrawZone.top-17,szBuff,strlen(szBuff)); 
    } 
 
	cx=(int)((float)xres*0.3); 
	cy=DrawZone.top-38; 
	dc.SelectObject(&hMyFont); 
 	dc.SetTextColor(RGB(0,0,255)); 
 	strcpy(szBuff,"历史数据差值");	 
  	dc.TextOut(cx,cy,szBuff,strlen(szBuff)); 
  } 
 
 
 if (pDC->IsPrinting()) 
 { 
	xres = pDC->GetDeviceCaps(HORZRES); 
	yres = pDC->GetDeviceCaps(VERTRES); 
   
	DrawZone.left=140; 	DrawZone.right=DrawZone.left+(int)(xres*0.75); 
	DrawZone.top=100;  	DrawZone.bottom=DrawZone.top+(int)(yres*0.75); 
 
	xOrg=DrawZone.left; 
	yOrg=DrawZone.bottom; 
	xScale=(float)((DrawZone.right-DrawZone.left)/95.0); 
	yScale=(float)((MaxVal-MinVal)/(DrawZone.bottom-DrawZone.top)); 
 
	// Draw coordinate axes 
	pDC->MoveTo(DrawZone.left,DrawZone.top); 
	pDC->LineTo(DrawZone.left,DrawZone.bottom); //Y-axis 
	pDC->MoveTo(DrawZone.left,DrawZone.bottom-(int)((0-MinVal)/yScale)); 
    pDC->LineTo(DrawZone.right,DrawZone.bottom-(int)((0-MinVal)/yScale));//X-axis 
	// Draw coordinate scale(VERTICAL) 
	pDC->MoveTo(DrawZone.left-4,DrawZone.top); 
 	pDC->LineTo(DrawZone.left+4,DrawZone.top); 
	pDC->MoveTo(DrawZone.left-4,DrawZone.bottom); 
 	pDC->LineTo(DrawZone.left+4,DrawZone.bottom); 
	for	(i=0; i<=8; i++) 
	{ 
	   k=(int)((MaxVal-MinVal)*i/(yScale*8)); 
	   if (i!=8) 
	   { 
         pDC->MoveTo(xOrg-2,yOrg-k); 
         pDC->LineTo(xOrg,yOrg-k); 
	   } 
	    
	   sprintf(szBuff,"%9.2f",MinVal+(MaxVal-MinVal)*i/8);  
	   pDC->TextOut(xOrg-130,yOrg-k-5,szBuff,strlen(szBuff)); 
	} 
 
  	// Draw coordinate scale(HORIZON) 
	pDC->MoveTo(DrawZone.right,DrawZone.bottom-(int)((0-MinVal)/yScale-4)); 
 	pDC->LineTo(DrawZone.right,DrawZone.bottom-(int)((0-MinVal)/yScale+4)); 
	for (i=0; i<96; i++) 
	{  
		cx=xOrg+(int)(xScale*i); 
		cy=yOrg-(int)((0-MinVal)/yScale); 
		if (i%4==0) 
		{ 
		   wsprintf(szBuff,"%d",i/4); 
		   pDC->TextOut(cx-8,cy+4,szBuff,strlen(szBuff)); 
		} 
		if (i!=95) 
		{ 
	       pDC->MoveTo(cx,cy); 
           pDC->LineTo(cx,cy+4); 
		} 
	} 
 
	for (i=0; iSelectObject(&pen[0]); 
		else  pDC->SelectObject(&pen[i]); 
 
		cx=xOrg; 
	    cy=yOrg-(int)((lpUseDat[i].Val[0]-MinVal)/yScale); 
        pDC->MoveTo(cx,cy); 
		for (k=1; k<96; k++) 
		{ 
	      cx=xOrg+(int)(xScale*k); 
		  cy=yOrg-(int)((lpUseDat[i].Val[k]-MinVal)/yScale); 
          pDC->LineTo(cx,cy); 
		} 
 
		cx=(int)((float)xres*0.80); 
		cy=DrawZone.top+i*24; 
		pDC->MoveTo(cx,cy); 
 		pDC->LineTo(cx+5,cy); 
        RmsSta s; 
		memcpy(&s,Stations[pDoc->m_InfoTable.RtuNum[i]-1],sizeof(RmsSta)); 
		strcat(szBuff,s.RtuName); 
        strcat(szBuff," "); 
		strcat(szBuff,pDoc->m_InfoTable.ycName[i]); 
 
		sprintf(szBuff,"%s%s<%04d-%02d-%02d>", 
						 s.RtuName, 
                         pDoc->m_InfoTable.ycName[i], 
                         pDoc->m_InfoTable.Year[i], 
                         pDoc->m_InfoTable.Month[i], 
                         pDoc->m_InfoTable.Day[i] 
						 ); 
 
		pDC->TextOut(cx+10,cy-10,szBuff,strlen(szBuff)); 
 
		if (i==(iCurveNum-1))  
			pDC->SelectObject(pOldPen); 
	} 
	cx=(int)((float)xres*0.3); 
	cy=DrawZone.top-50; 
	OldFont=pDC->SelectObject(&hMyFont); 
	strcpy(szBuff,"历    史    数    据    曲    线");	 
 	pDC->TextOut(cx,cy,szBuff,strlen(szBuff)); 
	pDC->SelectObject(OldFont); 
 } 
 
	DeleteObject(hMyFont); 
 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CCurveView diagnostics 
 
#ifdef _DEBUG 
void CCurveView::AssertValid() const 
{ 
	CScrollView::AssertValid(); 
} 
 
void CCurveView::Dump(CDumpContext& dc) const 
{ 
	CScrollView::Dump(dc); 
} 
 
CCurveDoc* CCurveView::GetDocument() // non-debug version is inline 
{ 
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CCurveDoc))); 
	return (CCurveDoc*)m_pDocument; 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CCurveView message handlers 
 
void CCurveView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)  
{ 
	if ((nChar == 113)||(nChar == 81)) 
	{ 
		CMainFrame* pFrame = (CMainFrame*) AfxGetMainWnd(); 
		pFrame->EscapeFullScreen(); 
	} 
	 
	CFolderView::OnChar(nChar, nRepCnt, nFlags); 
} 
 
BOOL CCurveView::OnPreparePrinting(CPrintInfo* pInfo)  
{ 
	pInfo->SetMaxPage(1); 
	return DoPreparePrinting(pInfo); 
} 
 
void CCurveView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)  
{ 
} 
 
void CCurveView::OnEndPrinting(CDC* pDC, CPrintInfo* pInfo)  
{ 
} 
 
void CCurveView::OnWindowNew()  
{ 
	// TODO: Add your command handler code here 
	 
} 
 
void CCurveView::OnFileSave()  
{ 
	// TODO: Add your command handler code here 
	 
} 
 
void CCurveView::OnFileSaveAs()  
{ 
	// TODO: Add your command handler code here 
	 
}