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
}