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

📄 graphicview.cpp

📁 一个完美的工业曲线显示控件
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// GraphicView.cpp : implementation of the CGraphicView class
//

#include "stdafx.h"
#include "Graphic.h"
#include "Pegrpapi.h"
#include "GraphicDoc.h"
#include "GraphicView.h"
#include "math.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#include "CoolControlsManager.h"
#define GetRandom(min,max) ((rand()%(int)(((max)+1)-(min)))+(min))

/////////////////////////////////////////////////////////////////////////////
// CGraphicView

IMPLEMENT_DYNCREATE(CGraphicView, CView)

BEGIN_MESSAGE_MAP(CGraphicView, CView)
//{{AFX_MSG_MAP(CGraphicView)
ON_COMMAND(ID_DRAW_BAR, OnDrawBar)
ON_WM_ERASEBKGND()
ON_COMMAND(ID_DRAW_LINE, OnDrawLine)
ON_COMMAND(ID_DRAW_PIE, OnDrawPie)
ON_COMMAND(ID_DRAW_SCATTER, OnDrawScatter)
ON_COMMAND(ID_DRAW_WHISKER, OnDrawWhisker)
ON_COMMAND(ID_DRAW_STACKED_BAR, OnDrawStackedBar)
ON_COMMAND(ID_DRAW_XY_LINE, OnDrawXyLine)
ON_WM_TIMER()
ON_COMMAND(ID_DRAW_3D_BAR, OnDraw3dBar)
ON_COMMAND(ID_DRAW_3D_STACKED_BAR, OnDraw3dStackedBar)
ON_COMMAND(ID_DRAW_3D_LINE, OnDraw3dLine)
ON_COMMAND(ID_DRAW_3D_PIE, OnDraw3dPie)
ON_COMMAND(ID_BK_LINE, OnBkLine)
ON_COMMAND(ID_BK_XY, OnBkXy)
ON_COMMAND(ID_BK_AREA, OnBkArea)
ON_COMMAND(ID_BK_BAR, OnBkBar)
ON_COMMAND(ID_BK_BAR_GROUP, OnBkBarGroup)
ON_COMMAND(ID_BK_PIE, OnBkPie)
ON_COMMAND(ID_BUTTON32781, OnButton32781)
ON_WM_SIZE()
ON_COMMAND(ID_DRAW_NEW, OnDrawNew)
ON_COMMAND(ID_DRAW_SILE, OnDrawSile)
ON_COMMAND(ID_REAL, OnReal)
ON_COMMAND(ID_DRAWGRAPH, OnDrawgraph)
//}}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()

/////////////////////////////////////////////////////////////////////////////
// CGraphicView construction/destruction

CGraphicView::CGraphicView()
{
	// TODO: add construction code here
	m_nRealTimeCounter = 0;
	m_nSinCounter = 0;
}

CGraphicView::~CGraphicView()
{
}

BOOL CGraphicView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs
	
	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CGraphicView drawing

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

/////////////////////////////////////////////////////////////////////////////
// CGraphicView printing

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CGraphicView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CGraphicView message handlers

void CGraphicView::OnInitialUpdate() 
{
	CView::OnInitialUpdate(); 
	AfxGetApp()->GetMainWnd()->SetWindowText(_T("曲线显示完整版 V1.0"));
	GetCtrlManager().InstallHook();//使所有控件浮动
	//	OnDraw3dStackedBar();
	// TODO: Add your specialized code here and/or call the base class
	
}

void CGraphicView::OnDrawBar() 
{
	if(m_hPE)
	{
		PEdestroy(m_hPE);
		Invalidate();
	}
	if(m_hPE)
		m_hPE=NULL;
	//! Right button click to show popup menu. //
	//! Double Click to show customization dialog. //
	
	// This example builds upon the basic CreateSimpleGraph '000' example chart //
	CreateSimpleGraph();
	
	// Below tells object to automatically generate statistical
	// comparison subsets, object will actually have
	// 6 subsets when finished initializing.
	int nArray[2];
	nArray[0] = PEAS_AVGAP;
	nArray[1] = PEAS_AVGPP; 
	PEvset (m_hPE, PEP_naAUTOSTATSUBSETS, nArray, 2);
	
	// Other various properties //
	PEnset(m_hPE, PEP_bBITMAPGRADIENTMODE, TRUE);
	PEnset(m_hPE, PEP_nQUICKSTYLE, PEQS_DARK_LINE);
	PEnset(m_hPE, PEP_nLEGENDSTYLE, PELS_1_LINE_INSIDE_AXIS);
	PEnset(m_hPE, PEP_nPLOTTINGMETHOD, PEGPM_BAR);
	PEnset(m_hPE, PEP_bMARKDATAPOINTS, TRUE); 
	
} 

void CGraphicView::CreateSimpleGraph()
{ 
	//! Right button click to show popup menu. //
	//! Double Click to show customization dialog. //
	//! Left-Click and drag to draw zoom box. Use popup memu or 'z' to undo zoom. // 
	
	// Simple example show the basics of a graph object. //
	// Graph's generally only contain YData because we assume
	// data is plotted equally spaced left to right.
	m_canReal=FALSE;
	CRect rect;
	GetClientRect( rect ); 
	m_hPE = PEcreate(PECONTROL_GRAPH, WS_CHILD|WS_VISIBLE, &rect, m_hWnd, 1001);
	if (m_hPE) 
	{
		// Prepare images in memory //
		PEnset(m_hPE, PEP_bPREPAREIMAGES, TRUE);
		
		// Pass Data //
		PEnset(m_hPE, PEP_nSUBSETS, 4);
		PEnset(m_hPE, PEP_nPOINTS, 12);
		
		float fY;
		for (int s=0; s<=3; s++)
		{
			for (int p=0; p<=11; p++)
			{
				fY = float((p + 1) * 50) + GetRandom(2, 250);
				PEvsetcellEx(m_hPE, PEP_faYDATA, s, p, &fY);
			}
		}
		
		// Set DataShadows to show 3D //
		PEnset(m_hPE, PEP_nDATASHADOWS, PEDS_SHADOWS);
		PEnset(m_hPE, PEP_nBORDERTYPES, PETAB_DROP_SHADOW);
		
		PEszset(m_hPE, PEP_szMAINTITLE, "历史线性统计曲线");
		PEszset(m_hPE, PEP_szSUBTITLE, "程序设计与实现--戚高"); 
		PEszset(m_hPE, PEP_szYAXISLABEL, "最大应用量");
		PEszset(m_hPE, PEP_szXAXISLABEL, "月份");
		PEnset(m_hPE, PEP_bFOCALRECT, FALSE);
		PEnset(m_hPE, PEP_nPLOTTINGMETHOD, PEGPM_BAR);//现实类型
		PEnset(m_hPE, PEP_nGRIDLINECONTROL, PEGLC_NONE);//是否有X,Y
		PEnset(m_hPE, PEP_bALLOWRIBBON, TRUE);
		PEnset(m_hPE, PEP_nALLOWZOOMING, PEAZ_HORZANDVERT);
		PEnset(m_hPE, PEP_nZOOMSTYLE, PEZS_RO2_NOT);
		
		// subset labels //
		PEvsetcell( m_hPE, PEP_szaSUBSETLABELS, 0, "长沙" );
		PEvsetcell( m_hPE, PEP_szaSUBSETLABELS, 1, "上海" );
		PEvsetcell( m_hPE, PEP_szaSUBSETLABELS, 2, "北京" );
		PEvsetcell( m_hPE, PEP_szaSUBSETLABELS, 3, "广州" );
		
		// point labels //
		PEvsetcell( m_hPE, PEP_szaPOINTLABELS, 0, "一月" );
		PEvsetcell( m_hPE, PEP_szaPOINTLABELS, 1, "二月" );
		PEvsetcell( m_hPE, PEP_szaPOINTLABELS, 2, "三月" );
		PEvsetcell( m_hPE, PEP_szaPOINTLABELS, 3, "四月" );
		PEvsetcell( m_hPE, PEP_szaPOINTLABELS, 4, "五月" );
		PEvsetcell( m_hPE, PEP_szaPOINTLABELS, 5, "六月" );
		PEvsetcell( m_hPE, PEP_szaPOINTLABELS, 6, "七月" );
		PEvsetcell( m_hPE, PEP_szaPOINTLABELS, 7, "八月" );
		PEvsetcell( m_hPE, PEP_szaPOINTLABELS, 8, "九月" );
		PEvsetcell( m_hPE, PEP_szaPOINTLABELS, 9, "十月" );
		PEvsetcell( m_hPE, PEP_szaPOINTLABELS, 10, "十一月" );
		PEvsetcell( m_hPE, PEP_szaPOINTLABELS, 11, "十二月" );
		
		// subset colors //
		DWORD dwArray[4] = { RGB(198,0,0), RGB( 0, 198, 198 ), RGB( 198,198,0 ), RGB( 0,198,0 ) };
		PEvsetEx(m_hPE, PEP_dwaSUBSETCOLORS, 0, 4, dwArray, 0);
		
		// subset line types //
		int nLineTypes[] = { PELT_MEDIUMSOLID, PELT_MEDIUMSOLID, 
			PELT_MEDIUMSOLID, PELT_MEDIUMSOLID, PELT_MEDIUMSOLID, 
			PELT_MEDIUMSOLID, PELT_MEDIUMSOLID, PELT_MEDIUMSOLID};
		PEvset(m_hPE, PEP_naSUBSETLINETYPES, nLineTypes, 8);
		
		// subset point types //
		int nPointTypes[] = { PEPT_DOTSOLID, PEPT_UPTRIANGLESOLID, 
			PEPT_SQUARESOLID, PEPT_DOWNTRIANGLESOLID, PEPT_DOT, 
			PEPT_UPTRIANGLE, PEPT_SQUARE, PEPT_DOWNTRIANGLE };
		PEvset(m_hPE, PEP_naSUBSETPOINTTYPES, nPointTypes, 8);
		
		// Allow stacked type graphs //
		PEnset(m_hPE, PEP_bNOSTACKEDDATA, FALSE);
		
		// Various other features //
		PEnset(m_hPE, PEP_bFIXEDFONTS, TRUE);
		PEnset(m_hPE, PEP_bBITMAPGRADIENTMODE, TRUE);
		PEnset(m_hPE, PEP_nQUICKSTYLE, PEQS_MEDIUM_LINE);
		PEnset(m_hPE, PEP_bSIMPLEPOINTLEGEND, TRUE);
		PEnset(m_hPE, PEP_bSIMPLELINELEGEND, TRUE);
		PEnset(m_hPE, PEP_nLEGENDSTYLE, PELS_1_LINE);
		PEnset(m_hPE, PEP_nGRAPHPLUSTABLE, PEGPT_BOTH);
		
		PEnset(m_hPE, PEP_nGRADIENTBARS, 8);
		PEnset(m_hPE, PEP_nTEXTSHADOWS, PETS_BOLD_TEXT);
		PEnset(m_hPE, PEP_bMAINTITLEBOLD, TRUE);
		PEnset(m_hPE, PEP_bSUBTITLEBOLD, TRUE);
		PEnset(m_hPE, PEP_bLABELBOLD, TRUE);
		PEnset(m_hPE, PEP_bLINESHADOWS, TRUE);
		PEnset(m_hPE, PEP_nFONTSIZE, PEFS_LARGE);
		
	}
}

BOOL CGraphicView::OnEraseBkgnd(CDC* pDC) 
{
	return TRUE;
}

void CGraphicView::OnDrawLine() 
{ 
	if(m_hPE)
	{
		PEdestroy(m_hPE);
		Invalidate();
	}
	if(m_hPE)
		m_hPE=NULL;
	CreateSimpleGraph();  
	int nArray[2];
	nArray[0] = PEAS_AVGAP;
	nArray[1] = PEAS_AVGPP; 
	PEvset (m_hPE, PEP_naAUTOSTATSUBSETS, nArray, 2); 
	nArray[0] = 4;  // fourth subset
	nArray[1] = 5;  // fifth subset
	PEvset(m_hPE, PEP_naRANDOMSUBSETSTOGRAPH, nArray, 2); 
	PEnset(m_hPE, PEP_nSCROLLINGSUBSETS, 1);
	PEnset(m_hPE, PEP_nTABLEWHAT, PETW_ALLSUBSETS); 
	PEnset(m_hPE, PEP_nGRAPHPLUSTABLE, PEGPT_BOTH);
	PEnset(m_hPE, PEP_nDATAPRECISION, 0);
	PEnset(m_hPE, PEP_nFONTSIZE, PEFS_LARGE); 
	PEnset(m_hPE, PEP_bBITMAPGRADIENTMODE, TRUE);
	PEnset(m_hPE, PEP_nQUICKSTYLE, PEQS_MEDIUM_NO_BORDER);
	PEnset(m_hPE, PEP_nLEGENDSTYLE, PELS_1_LINE_INSIDE_AXIS);
	PEnset(m_hPE, PEP_nPLOTTINGMETHOD, PEGPM_BAR);
	PEnset(m_hPE, PEP_nBESTFITDEGREE, PEBFD_4TH);
	PEnset(m_hPE, PEP_bMARKDATAPOINTS, TRUE);
	PEnset(m_hPE, PEP_nLEGENDSTYLE, PELS_1_LINE);  
}



void CGraphicView::OnDrawPie() 
{
	if(m_hPE)
	{
		PEdestroy(m_hPE);
		Invalidate();
	}
	// This example builds upon the basic CreateSimpleGraph '000' example chart //
	CreateSimpleGraph();
	
	// Disable default scale //
	PEnset(m_hPE, PEP_nSHOWYAXIS, PESA_EMPTY);
	
	// Generally, a custom y axis will need manual range control //
	PEnset(m_hPE, PEP_nMANUALSCALECONTROLY, PEMSC_MINMAX);
	
	double manminY = 0.0F;
	PEvset(m_hPE, PEP_fMANUALMINY, &manminY, 1);
	
	double manmaxY = 1000.0F;
	PEvset(m_hPE, PEP_fMANUALMAXY, &manmaxY, 1);
	
	// Create custom grid lines with HorzLineAnnotations //
	// Note that GridLineControl will control these annotations //
	double horzlineannot = 200.0F;
	PEvsetcell(m_hPE, PEP_faHORZLINEANNOTATION, 0, &horzlineannot);
	int horzlinetyp = PELAT_GRIDLINE;
	PEvsetcell(m_hPE, PEP_naHORZLINEANNOTATIONTYPE, 0, &horzlinetyp);
	PEvsetcell(m_hPE, PEP_szaHORZLINEANNOTATIONTEXT, 0, "|LLow Value");
	
	horzlineannot = 500.0F;
	PEvsetcell(m_hPE, PEP_faHORZLINEANNOTATION, 1, &horzlineannot);
	horzlinetyp = PELAT_GRIDLINE;
	PEvsetcell(m_hPE, PEP_naHORZLINEANNOTATIONTYPE, 1, &horzlinetyp);
	PEvsetcell(m_hPE, PEP_szaHORZLINEANNOTATIONTEXT, 1, "|LMedium Value");
	
	horzlineannot = 800.0F;
	PEvsetcell(m_hPE, PEP_faHORZLINEANNOTATION, 2, &horzlineannot);
	horzlinetyp = PELAT_GRIDLINE;
	PEvsetcell(m_hPE, PEP_naHORZLINEANNOTATIONTYPE, 2, &horzlinetyp);
	PEvsetcell(m_hPE, PEP_szaHORZLINEANNOTATIONTEXT, 2, "|LHigh Value");
	
	horzlineannot = 350.0F;
	PEvsetcell(m_hPE, PEP_faHORZLINEANNOTATION, 3, &horzlineannot);
	horzlinetyp = PELAT_GRIDTICK;
	PEvsetcell(m_hPE, PEP_naHORZLINEANNOTATIONTYPE, 3, &horzlinetyp);
	PEvsetcell(m_hPE, PEP_szaHORZLINEANNOTATIONTEXT, 3, "");
	
	horzlineannot = 650.0F;
	PEvsetcell(m_hPE, PEP_faHORZLINEANNOTATION, 4, &horzlineannot);
	horzlinetyp = PELAT_GRIDTICK;
	PEvsetcell(m_hPE, PEP_naHORZLINEANNOTATIONTYPE, 4, &horzlinetyp);
	PEvsetcell(m_hPE, PEP_szaHORZLINEANNOTATIONTEXT, 4, "");
	
	// Set LeftMargin to allocate space for line annotation text //
	// Use the longest string used in annotations.
	PEszset(m_hPE, PEP_szLEFTMARGIN, "Medium Value ");
	
	// Set this to see annotations //
	PEnset(m_hPE, PEP_bSHOWANNOTATIONS, TRUE);
	
	// Increase line annotation text size //
	PEnset(m_hPE, PEP_nLINEANNOTATIONTEXTSIZE, 100);
	
	// Put Grid In Front of Bars //
	PEnset(m_hPE, PEP_bGRIDINFRONT, TRUE);
	
	// Other various properties //
	PEnset(m_hPE, PEP_bBITMAPGRADIENTMODE, TRUE);
	PEnset(m_hPE, PEP_nQUICKSTYLE, PEQS_LIGHT_INSET);
	
}


void CGraphicView::OnDrawScatter() 
{ 
	if(m_hPE)
	{
		PEdestroy(m_hPE);
		Invalidate();

⌨️ 快捷键说明

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