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

📄 huatuview.cpp

📁 可以实现画曲线的功能,代码简单而且容易实现
💻 CPP
字号:
// huatuView.cpp : implementation of the CHuatuView class
//

#include "stdafx.h"
#include "huatu.h"

#include "huatuDoc.h"
#include "huatuView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CHuatuView

IMPLEMENT_DYNCREATE(CHuatuView, CView)

BEGIN_MESSAGE_MAP(CHuatuView, CView)
	//{{AFX_MSG_MAP(CHuatuView)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code!
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CHuatuView construction/destruction

CHuatuView::CHuatuView()
{
	// TODO: add construction code here

}

CHuatuView::~CHuatuView()
{
}

BOOL CHuatuView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CHuatuView drawing

void CHuatuView::OnDraw(CDC* pDC)
{
	CHuatuDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here

 
       //初始化坐标值,一般从数据库取得。这里为了示例方便取得比较简单
       const int num=10;
       float initX[num]={1,2,3,4,5,6,7,8,9,10};
       float initY[num]={0.5,2,2.8,4,5.6,6,7,9.4,13.8,23.4};
 
       //分别取得X和Y最大值,最小值
       float maxX=initX[0];
       float minX=initX[0];
       float maxY=initY[0];
       float minY=initY[0];
       for(int i=0;i<num;i++)
       {
              if(initX[i]>maxX)
                     maxX=initX[i];
              if(initX[i]<minX)
                     minX=initX[i];
if(initY[i]>maxY) 
                     maxY=initY[i];
              if(initY[i]<minY)
                     minY=initY[i];
       }
 
       //如果原点必须在X轴上,加上下面2行,否则注释掉
       if(minX>0)
              minX=0;
 
       //如果原点必须在Y轴上,加上下面2行,否则注释掉
       if(minY>0)
              minY=0;
 
 
       //确定图象显示大小
       int width=500;
       int height=300;
 
       //确定坐标图四周预留的空白大小
       const int mytop=10;
    const int mybottom=40;
    const int myleft=80;
    const int myright=50;
 
       //确定X,Y轴每单位显示宽度
       float intervalX=(width-myleft-myright)/(maxX-minX);
       float intervalY=(height-mybottom-mytop)/(maxY-minY);
 
       //绘制曲线。由于绘图坐标的Y轴是向下延升,所以这里每个点的Y值是用
       //图象高度减去y值大小。
       pDC->MoveTo(int(myleft+(initX[0]-minX)*intervalX), 
int(height-(mybottom+(initY[0]-minY)*intervalY)));
       for(i=0;i<num;i++)
       {
              pDC->LineTo(int(myleft+(initX[i]-minX)*intervalX), int(height-(mybottom+(initY[i]-minY)*intervalY))); 
       }
 
       //绘制X,Y轴
       //X轴从图形区域最左端到最右端
       float bottomY=0;
       float leftX=0;
       //bottomY表示X轴的y值,leftX表示Y轴的x值
       if(minY>0)
              bottomY=minY;
       if(minX>0)
              leftX=minX;
 
       pDC->MoveTo(int(myleft),int(height-(mybottom+(bottomY-minY)*intervalY)));
       pDC->LineTo(int(width-myright),int(height-(mybottom+(bottomY-minY)*intervalY)));
       //Y轴从图形区域最底端到最顶端
       pDC->MoveTo(int(myleft+(leftX-minX)*intervalX),int(height-mybottom));
       pDC->LineTo(int(myleft+(leftX-minX)*intervalX),int(mytop));
 
       //确定显示刻度个数
       const int count=5;
 
       //确定每个显示刻度之间的宽度
       float spaceX=(width-myleft-myright)/count;
       float spaceY=(height-mybottom-mytop)/count;
 
       //绘制刻度和刻度值
       CString str;
       //X轴
       for(i=0;i<=count;i++)
       {
              str.Format("%.1f",minX+i*(maxX-minX)/count);
              pDC->MoveTo(int(myleft+spaceX*i),int(height-(mybottom+(bottomY-minY)*intervalY)));
              pDC->LineTo(int(myleft+spaceX*i),int(height-(mybottom+(bottomY-minY)*intervalY+5)));
              pDC->TextOut(int(myleft+spaceX*i-10),int(height-(mybottom+(bottomY-minY)*intervalY-5)),str); 
       }
 
       //Y轴
       for(i=0;i<=count;i++)
       {
              str.Format("%.1f",minY+i*(maxY-minY)/count);
              pDC->MoveTo(int(myleft+(leftX-minX)*intervalX),int(height-(mybottom+spaceY*i)));
              //pDC->LineTo(int(myleft+(leftX-minX*intervalX+5),int(height-(mybottom+spaceY*i)));
              pDC->TextOut(int(myleft+(leftX-minX)*intervalX-30), int(height-(mybottom+spaceY*i+8)),str);
       }
 
    //绘制X,Y轴的变量名
       pDC->TextOut(width/2,height-20,"时间(h)");
       pDC->TextOut(0,height/2,"产量(kg)");
 
}




/////////////////////////////////////////////////////////////////////////////
// CHuatuView printing

BOOL CHuatuView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CHuatuView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CHuatuView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CHuatuView diagnostics

#ifdef _DEBUG
void CHuatuView::AssertValid() const
{
	CView::AssertValid();
}

void CHuatuView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CHuatuDoc* CHuatuView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CHuatuDoc)));
	return (CHuatuDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CHuatuView message handlers

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -