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

📄 view.cpp

📁 MFC编程实例
💻 CPP
字号:
#include "stdafx.h"
#include "Chart.h"
#include <math.h>
#include "ChartDoc.h"
#include "View.h"

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

#define pi		3.1415926535

IMPLEMENT_DYNCREATE(CChartView, CView)

BEGIN_MESSAGE_MAP(CChartView, CView)
	//{{AFX_MSG_MAP(CChartView)
	//}}AFX_MSG_MAP
	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()

CChartView::CChartView()
{
}

CChartView::~CChartView()
{
}

BOOL CChartView::PreCreateWindow(CREATESTRUCT& cs)
{
	return CView::PreCreateWindow(cs);
}

void CChartView::OnDraw(CDC* pDC)
{
	int nA, nB, nC;
	CBrush brush;
	CBrush *pBrOld;
	CRect rect;
	CRect rectSub;

	CChartDoc *pDoc=GetDocument();
	ASSERT_VALID(pDoc);
	pDoc->GetABC(nA, nB, nC);

	GetClientRect(rect);
	rect.left=rect.Width()/4;
	rect.right-=rect.left;
	rect.top=rect.Height()/4;
	rect.bottom-=rect.top;
	pDC->MoveTo(rect.TopLeft());
	pDC->LineTo(rect.left, rect.bottom);
	pDC->LineTo(rect.BottomRight());

	brush.CreateSolidBrush(RGB(255, 0, 0));
	pBrOld=pDC->SelectObject(&brush);
	rectSub=rect;
	rectSub.top=rect.Height()-nA*rect.Height()/100+rect.top;
	rectSub.right=rect.Width()/3+rect.left;
	pDC->Rectangle(rectSub);
	pDC->SelectObject(pBrOld);
	brush.DeleteObject();

	brush.CreateSolidBrush(RGB(0, 255, 0));
	pBrOld=pDC->SelectObject(&brush);
	rectSub=rect;
	rectSub.top=rect.Height()-nB*rect.Height()/100+rect.top;
	rectSub.right=rect.Width()/3+rect.left;
	rectSub.OffsetRect(rectSub.Width(), 0);
	pDC->Rectangle(rectSub);
	pDC->SelectObject(pBrOld);
	brush.DeleteObject();

	brush.CreateSolidBrush(RGB(255, 255, 0));
	pBrOld=pDC->SelectObject(&brush);
	rectSub=rect;
	rectSub.top=rect.Height()-nC*rect.Height()/100+rect.top;
	rectSub.right=rect.Width()/3+rect.left;
	rectSub.OffsetRect(rectSub.Width()*2, 0);
	pDC->Rectangle(rectSub);
	pDC->SelectObject(pBrOld);
	brush.DeleteObject();
}

BOOL CChartView::OnPreparePrinting(CPrintInfo* pInfo)
{
	return DoPreparePrinting(pInfo);
}

void CChartView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
}

void CChartView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
}

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

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

CChartDoc* CChartView::GetDocument()
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CChartDoc)));
	return (CChartDoc*)m_pDocument;
}
#endif

IMPLEMENT_DYNCREATE(CPieView, CView)

CPieView::CPieView()
{
}

CPieView::~CPieView()
{
}


BEGIN_MESSAGE_MAP(CPieView, CView)
	//{{AFX_MSG_MAP(CPieView)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

void CPieView::OnDraw(CDC* pDC)
{
	int nA, nB, nC;
	CPoint ptStart;
	CPoint ptEnd;
	CBrush brush;
	CBrush *pBrOld;
	CRect rect;
	long r=100;

	CChartDoc *pDoc=(CChartDoc *)GetDocument();
	ASSERT_VALID(pDoc);
	pDoc->GetABC(nA, nB, nC);

	pDC->SetMapMode(MM_ISOTROPIC);
	GetClientRect(rect);
	
	pDC->SetWindowExt(100, 100);
	pDC->SetViewportExt
	(
		pDC->GetDeviceCaps(LOGPIXELSX),
		-pDC->GetDeviceCaps(LOGPIXELSY)
	);
	pDC->SetViewportOrg(rect.right/2, rect.bottom/2);
	rect=CRect(-100, 100, 100, -100);

	ptStart.x=rect.right;
	ptStart.y=0;
	ptEnd.x=(long)(r*cos(nA*2*pi/100));
	ptEnd.y=(long)(r*sin(nA*2*pi/100));
	brush.CreateSolidBrush(RGB(255, 0, 0));
	pBrOld=pDC->SelectObject(&brush);
	pDC->Pie(rect, ptStart, ptEnd);
	pDC->SelectObject(pBrOld);
	brush.DeleteObject();

	ptStart=ptEnd;
	ptEnd.x=(long)(r*cos((nA+nB)*2*pi/100));
	ptEnd.y=(long)(r*sin((nA+nB)*2*pi/100));
	brush.CreateSolidBrush(RGB(0, 255, 0));
	pBrOld=pDC->SelectObject(&brush);
	pDC->Pie(rect, ptStart, ptEnd);
	pDC->SelectObject(pBrOld);
	brush.DeleteObject();

	ptStart=ptEnd;
	ptEnd.x=(long)(r*cos((nA+nB+nC)*2*pi/100));
	ptEnd.y=(long)(r*sin((nA+nB+nC)*2*pi/100));
	brush.CreateSolidBrush(RGB(255, 255, 0));
	pBrOld=pDC->SelectObject(&brush);
	pDC->Pie(rect, ptStart, ptEnd);
	pDC->SelectObject(pBrOld);
	brush.DeleteObject();
}

CPoint CPieView::GetPoint(CRect rect, int nAngle)
{
	CPoint pt;

	if(nAngle == 0)
	{
		pt.x=rect.right;
		pt.y=(LONG)((rect.top+rect.bottom)/2);
	}
	if(nAngle >0 && nAngle < 45)
	{
		pt.x=rect.right;
		pt.y=(LONG)((rect.top+rect.bottom)/2-rect.Width()/2*tan(2*pi*nAngle/360));
	}
	if(nAngle == 45)pt=CPoint(rect.right, rect.top);
	if(nAngle > 45 && nAngle < 90)
	{
		pt.y=rect.top;
		pt.x=(LONG)((rect.left+rect.right)/2+rect.Height()/2/tan(2*pi*nAngle/360));
	}
	if(nAngle == 90)
	{
		pt.x=(rect.left+rect.right)/2;
		pt.y=rect.top;
	}
	if(nAngle > 90 && nAngle < 135)
	{
		pt.y=rect.top;
		pt.x=(LONG)((rect.left+rect.right)/2+rect.Height()/2/tan(2*pi*nAngle/360));
	}
	if(nAngle == 135)pt=CPoint(rect.left, rect.top);
	if(nAngle > 135 && nAngle < 180)
	{
		pt.x=rect.left;
		pt.y=(LONG)((rect.top+rect.bottom)/2+rect.Width()/2*tan(2*pi*nAngle/360));
	}
	if(nAngle == 180)
	{
		pt.x=rect.left;
		pt.y=(rect.top+rect.bottom)/2;
	}
	if(nAngle > 180 && nAngle < 225)
	{
		pt.x=rect.left;
		pt.y=(LONG)((rect.top+rect.bottom)/2+rect.Width()/2*tan(2*pi*nAngle/360));
	}
	if(nAngle == 225)pt=CPoint(rect.left, rect.bottom);
	if(nAngle > 225 && nAngle < 270)
	{
		pt.y=rect.bottom;
		pt.x=(LONG)((rect.left+rect.right)/2-rect.Height()/2/tan(2*pi*nAngle/360));
	}
	if(nAngle == 270)
	{
		pt.x=(rect.left+rect.right)/2;
		pt.y=rect.bottom;
	}
	if(nAngle > 270 && nAngle < 315)
	{
		pt.y=rect.bottom;
		pt.x=(LONG)((rect.left+rect.right)/2-rect.Height()/2/tan(2*pi*nAngle/360));
	}
	if(nAngle == 315)pt=CPoint(rect.right, rect.bottom);
	if(nAngle > 315 && nAngle <= 360)
	{
		pt.x=rect.right;
		pt.y=(LONG)((rect.top+rect.bottom)/2-rect.Width()/2*tan(2*pi*nAngle/360));
	}
	return pt;
}

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

void CPieView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}
#endif

⌨️ 快捷键说明

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