www.pudn.com > 20041019221133_Graphic.rar > GraphicView.cpp


// 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(); 
	} 
	CreateSimpleGraph();  
	DWORD color;  
	for (int s=0;s<=3;s++)  //4-1 
	{     
		for (int p=0;p<=11;p++) 
		{ 
			switch(s) 
			{     
			case 0: 
				color = RGB(15 + ((p + 1) * 20), 0, 0);   
				PEvsetcellEx(m_hPE, PEP_dwaPOINTCOLORS, s, p, &color); 
				break; 
			case 1: 
				color = RGB(0, 15 + ((p + 1) * 20), 0); 
				PEvsetcellEx(m_hPE, PEP_dwaPOINTCOLORS, s, p, &color); 
				break; 
			case 2: 
				color =  RGB(0, 0, 15 + ((p + 1) * 20)); 
				PEvsetcellEx(m_hPE, PEP_dwaPOINTCOLORS, s, p, &color); 
				break; 
			case 3: 
				color = RGB(0, 15 + ((p + 1) * 20), 15 + ((p + 1) * 20)); 
				PEvsetcellEx(m_hPE, PEP_dwaPOINTCOLORS, s, p, &color); 
				break; 
			default: 
				break; 
			} 
		} 
	}  
	color = RGB(198, 0, 0); 
	PEvsetcell(m_hPE, PEP_dwaSUBSETCOLORS, 0, &color);  
	color = RGB(0, 198, 0); 
	PEvsetcell(m_hPE, PEP_dwaSUBSETCOLORS, 1, &color);  
	color = RGB(0, 0, 198); 
	PEvsetcell(m_hPE, PEP_dwaSUBSETCOLORS, 2, &color);  
	color = RGB(0, 198, 198); 
	PEvsetcell(m_hPE, PEP_dwaSUBSETCOLORS, 3, &color);  
	PEnset(m_hPE, PEP_nSCROLLINGSUBSETS, 1); 
	PEnset(m_hPE, PEP_nTABLEWHAT, PETW_ALLSUBSETS); 
	PEnset(m_hPE, PEP_nFONTSIZE, PEFS_LARGE);  
	PEnset(m_hPE, PEP_dwGRAPHBACKCOLOR, 1); 
	PEnset(m_hPE, PEP_nGRAPHGRADIENTSTYLE, 0);  
	PEnset(m_hPE, PEP_dwSHADOWCOLOR, RGB(0, 0, 0));  
	PEnset(m_hPE, PEP_nGRAPHPLUSTABLE, PEGPT_BOTH); 
	PEnset(m_hPE, PEP_nDATAPRECISION, 0);  
	PEnset(m_hPE, PEP_nFORCEVERTICALPOINTS, PEFVP_SLANTED);  
	PEnset(m_hPE, PEP_nPLOTTINGMETHOD, PEGPM_BAR); 
	PEnset(m_hPE, PEP_nBORDERTYPES, PETAB_NO_BORDER);  
} 
 
void CGraphicView::OnDrawWhisker()  
{  
	if(m_hPE) 
	{ 
		PEdestroy(m_hPE); 
		Invalidate(); 
	} 
	//! Try this... Right Click chart and change the Plotting Method to Horizontal Bar Stacked. // 
	 
	// This example builds upon the basic CreateSimpleGraph '000' example chart // 
	CreateSimpleGraph(); 
	 
	// Enable Stacked type charts // 
	PEnset(m_hPE, PEP_bNOSTACKEDDATA, FALSE); 
	 
	// Set plotting method // 
	PEnset(m_hPE, PEP_nPLOTTINGMETHOD, PEGPM_BARSTACKED); 
	 
	// Add a table // 
	PEnset(m_hPE, PEP_nGRAPHPLUSTABLE, PEGPT_BOTH); 
	PEnset(m_hPE, PEP_nDATAPRECISION, 2); 
	 
	PEnset(m_hPE, PEP_bALLOWHORZBARSTACKED, TRUE); 
	 
} 
 
 
void CGraphicView::OnDrawStackedBar()  
{  
	if(m_hPE) 
	{ 
		PEdestroy(m_hPE); 
		Invalidate(); 
	} 
	//! 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. //  
	 
	// This example builds upon the basic CreateSimpleGraph '000' example chart // 
	CreateSimpleGraph(); 
	 
	// Now sub-divide subsets into 4 individual axes // 
	// Each axis with one subset in each // 
	int nArray[4] = {1,1,1,1}; 
	PEvset (m_hPE, PEP_naMULTIAXESSUBSETS, nArray, 4); 
	 
	// Set first axis parameters // 
	PEnset(m_hPE, PEP_nWORKINGAXIS, 0); 
	PEszset(m_hPE, PEP_szYAXISLABEL, "标度1"); 
	PEnset(m_hPE, PEP_nPLOTTINGMETHOD, PEGPM_BAR); 
	 
	// Set second axis parameters // 
	PEnset(m_hPE, PEP_nWORKINGAXIS, 1); 
	PEszset(m_hPE, PEP_szYAXISLABEL, "标度2"); 
	PEnset(m_hPE, PEP_nPLOTTINGMETHOD, PEGPM_BAR); 
	 
	// Set third axis parameters // 
	PEnset(m_hPE, PEP_nWORKINGAXIS, 2); 
	PEszset(m_hPE, PEP_szYAXISLABEL, "标度3"); 
	PEnset(m_hPE, PEP_nPLOTTINGMETHOD, PEGPM_BAR); 
	 
	// Set fourth axis parameters // 
	PEnset(m_hPE, PEP_nWORKINGAXIS, 3); 
	PEszset(m_hPE, PEP_szYAXISLABEL, "标度4"); 
	PEnset(m_hPE, PEP_nPLOTTINGMETHOD, PEGPM_BAR); 
	 
	// Reset WorkingAxis when done // 
	PEnset(m_hPE, PEP_nWORKINGAXIS, 0); 
	 
	// Add Axis Separator // 
	PEnset(m_hPE, PEP_nMULTIAXESSEPARATORS, PEMAS_THICKPLUSTICK); 
	 
	// Axis Sizing // 
	PEnset(m_hPE, PEP_nMULTIAXESSIZING, TRUE); 
	 
	// Get rid of 3d stuff // 
	PEnset(m_hPE, PEP_nDATASHADOWS, PEDS_NONE); 
	 
	// Other various properties // 
	PEnset(m_hPE, PEP_bBITMAPGRADIENTMODE, TRUE); 
	PEnset(m_hPE, PEP_nQUICKSTYLE, PEQS_DARK_NO_BORDER); 
	PEnset(m_hPE, PEP_bMARKDATAPOINTS, TRUE); 
	 
} 
 
 
void CGraphicView::OnDrawXyLine()  
{ 
	if(m_hPE) 
	{ 
		PEdestroy(m_hPE); 
		Invalidate(); 
	} 
	RECT rect; 
	GetClientRect( &rect ); 
	 
	m_canReal=TRUE;  
	m_Real=TRUE; 
	 
	char szSubsets[] = "电流\t电压\t频率\t"; 
	PEvset (m_hPE, PEP_szaSUBSETLABELS, szSubsets, 3); 
 
	// Set Various Other Properties /// 
	PEnset(m_hPE, PEP_bBITMAPGRADIENTMODE, TRUE); 
	PEnset(m_hPE, PEP_nQUICKSTYLE, PEQS_DARK_INSET); 
	 
	m_hPE = PEcreate(PECONTROL_GRAPH, WS_VISIBLE, &rect, m_hWnd, 1001); 
	PEnset(m_hPE, PEP_bPREPAREIMAGES, TRUE); 
	PEnset(m_hPE, PEP_bCACHEBMP, TRUE);  
	PEnset(m_hPE, PEP_nSUBSETS, 2);		// set number of subsets 
	PEnset(m_hPE, PEP_nPOINTS, 200);	// number of data points	 
	PEnset(m_hPE, PEP_nPOINTSTOGRAPH, 20); 
	PEnset(m_hPE, PEP_nPOINTSTOGRAPHINIT, PEPTGI_LASTPOINTS);	   		 
	PEnset(m_hPE, PEP_nPLOTTINGMETHOD, PEGPM_POINTSPLUSLINE);	   
	PEszset(m_hPE, PEP_szMAINTITLE, "实时曲线示例"); 
	PEszset(m_hPE, PEP_szSUBTITLE, "编程设计实现-戚高"); // no subtitle 
	PEnset(m_hPE, PEP_nMANUALSCALECONTROLY, PEMSC_MINMAX); 
	double manminY = 1.0F; 
	PEvset(m_hPE, PEP_fMANUALMINY, &manminY, 1); 
	double manmaxY = 100.0F; 
	PEvset(m_hPE, PEP_fMANUALMAXY, &manmaxY, 1); 
	PEszset(m_hPE, PEP_szMANUALMAXPOINTLABEL, "000.000" ); 
	PEszset(m_hPE, PEP_szMANUALMAXDATASTRING, "00:00:00xx"); 
	PEnset(m_hPE, PEP_bNOSTACKEDDATA, TRUE);  
	PEnset(m_hPE, PEP_bNORANDOMPOINTSTOGRAPH, TRUE); 
	PEnset(m_hPE, PEP_bALLOWHISTOGRAM, FALSE);	 
	PEnset(m_hPE, PEP_bFOCALRECT, FALSE); 
	PEnset(m_hPE, PEP_nGRIDLINECONTROL, FALSE); 
	PEnset(m_hPE, PEP_nDATAPRECISION, 1);									   
	PEszset(m_hPE, PEP_szaPOINTLABELS, ""); 
	float f1 = 0.0F; 
	PEvsetcellEx(m_hPE, PEP_faYDATA, 0, 0, &f1); 
	PEvsetcellEx(m_hPE, PEP_faYDATA, 0, 1, &f1); 
	PEvsetcellEx(m_hPE, PEP_faYDATA, 0, 2, &f1); 
	PEvsetcellEx(m_hPE, PEP_faYDATA, 0, 3, &f1); 
	PEnset(m_hPE, PEP_bBITMAPGRADIENTMODE, FALSE); 
	PEnset(m_hPE, PEP_nQUICKSTYLE, PEQS_LIGHT_SHADOW); 
	PEnset(m_hPE, PEP_bFIXEDFONTS, TRUE); 
	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_nFONTSIZE, PEFS_LARGE);  
}			 
 
 
void CGraphicView::OnTimer(UINT nIDEvent)  
{  
	CString ttext;   
	double newx2; 
	float YData[250]; 
	double XData[250];  
	double dx;  
	CTime t; 
	TM petm;  
	if(m_canReal) 
	{ 
		if(nIDEvent==2) 
		{ 
			if(m_Real) 
			{ 
				float newy = 50.0F + float(sin((double) m_nSinCounter * 0.075F) * 30.0F) + GetRandom(1, 15); 
				float newy1,newy2; 
				newy1 = 50.0F - float(sin((double) m_nSinCounter * 0.075F) * 30.0F) + GetRandom(1, 15); 
				newy2 = 50.0F + float(sin((double) m_nSinCounter * 0.075F) * 30.0F) - GetRandom(1, 15); 
				// Determine newx2 as current date and time in VB format // 
				t = CTime::GetCurrentTime(); 
				petm.nDay = t.GetDay(); 
				petm.nMonth = t.GetMonth(); 
				petm.nYear = t.GetYear() - 1900; 
				petm.nHour = t.GetHour(); 
				petm.nMinute = t.GetMinute(); 
				petm.nSecond = t.GetSecond(); 
				PEcreateserialdate(&newx2, &petm, PEDTM_VB); 
				 
				// Shift data when counter reaches end of data // 
				if(m_nRealTimeCounter >= 1999) 
				{ 
					memset(YData, 0, 250 * sizeof(float)); 
					memset(XData, 0, 250 * sizeof(double)); 
					// Shift Data by 250 data points, oldest 250 will be lost. 
					m_nRealTimeCounter = m_nRealTimeCounter - 250; 
					PEvset(m_hPE, PEP_faAPPENDYDATA, YData, 250); 
					PEvset(m_hPE, PEP_faAPPENDXDATAII, XData, 250); 
				} 
				 
				// Store new values at current index // 
				PEvsetcellEx(m_hPE, PEP_faXDATAII, 0, m_nRealTimeCounter, &newx2); 
				PEvsetcellEx(m_hPE, PEP_faYDATA, 0, m_nRealTimeCounter, &newy); 
				 
				// Store new values at current index // 
				PEvsetcellEx(m_hPE, PEP_faXDATAII, 1, m_nRealTimeCounter, &newx2); 
				PEvsetcellEx(m_hPE, PEP_faYDATA, 1, m_nRealTimeCounter, &newy1); 
				 
				// Store new values at current index // 
				PEvsetcellEx(m_hPE, PEP_faXDATAII, 2, m_nRealTimeCounter, &newx2); 
				PEvsetcellEx(m_hPE, PEP_faYDATA, 2, m_nRealTimeCounter, &newy2); 
				 
				// Increment index counter // 
				m_nRealTimeCounter += 1; 
				 
				// SinCounter is only to produce sin wave data // 
				m_nSinCounter += 1; 
				if (m_nSinCounter > 30000)  
					m_nSinCounter = 1; 
				 
				// If current time is beyond zoom max, the re-adjust zoom max // 
				if (newx2 > ZoomEnd) 
				{ 
					ZoomEnd = ZoomEnd + ZoomSmallInterval; 
					ZoomStart = ZoomEnd - ZoomInterval; 
					PEvset(m_hPE, PEP_fZOOMMINX, &ZoomStart, 1); 
					PEvset(m_hPE, PEP_fZOOMMAXX, &ZoomEnd, 1); 
					 
					PEvgetcellEx(m_hPE, PEP_faXDATAII, 0, 1, &dx); 
					PEvset(m_hPE, PEP_fMANUALMINX, &dx, 1); 
					PEvset(m_hPE, PEP_fMANUALMAXX, &ZoomEnd, 1); 
				} 
				 
				// Update image and force paint // 
				PEreinitialize( m_hPE ); 
				PEresetimage( m_hPE, 0, 0 ); 
				::InvalidateRect(m_hPE, NULL, FALSE); 
			} 
		} 
		else 
		{ 
			if(m_Real) 
			{ 
				/*PEvset(m_hPE, PEP_szaAPPENDPOINTLABELDATA, NULL, 1); 
				 
				// make some random data // 
				float r1,r2,fNew[2]; 
				r1 = (float) GetRandom(1, 20); 
				r2 = (float) GetRandom(1, 100); 
				 
				fNew[0] = r1 + (r2 * .0001F); 
				fNew[1] = fNew[0] * 4; 
				PEvset(m_hPE, PEP_faAPPENDYDATA, &fNew[0], 1);*/ 
				///////////////////////////////////   
				float newy = 50.0F + float(sin((double) m_nSinCounter * 0.075F) * 30.0F) + GetRandom(1, 15); 
				float newx = (float)m_nRealTimeCounter;  
				 
				// Append new values  // 
				PEvset(m_hPE, PEP_faAPPENDYDATA, &newy, 1); 
				PEvset(m_hPE, PEP_faAPPENDXDATA, &newx, 1);  
				m_nRealTimeCounter = m_nRealTimeCounter + 1; 
				 
				// Switch to AutoScaling x axis after receiving 100 data points // 
				if (m_nRealTimeCounter == 100) 
					PEnset(m_hPE, PEP_nMANUALSCALECONTROLX, PEMSC_NONE); 
				 
				// SinCounter is only to produce sin wave data // 
				m_nSinCounter = m_nSinCounter + 1; 
				if (m_nSinCounter > 30000)  
					m_nSinCounter = 1; 
				 
				// Update image and force paint // 
				PEreinitialize( m_hPE ); 
				PEresetimage( m_hPE, 0, 0 ); 
				::InvalidateRect(m_hPE, NULL, FALSE); 
			} 
			else 
			{ 
				////********************************************** 
				float newy,newx; 
				newy = 50.0F + float(sin((double) m_nSinCounter * 0.075F) * 30.0F) + GetRandom(1, 15); 
				newx = float(m_nRealTimeCounter); 
				 
				// Update new data at current index // 
				PEvsetcellEx(m_hPE, PEP_faYDATA, 0, m_nRealTimeCounter, &newy); 
				PEvsetcellEx(m_hPE, PEP_faXDATA, 0, m_nRealTimeCounter, &newx); 
				newy = 50.0F - float(sin((double) m_nSinCounter * 0.075F) * 30.0F) + GetRandom(1, 15); 
				newx = float(m_nRealTimeCounter); 
				PEvsetcellEx(m_hPE, PEP_faYDATA, 1, m_nRealTimeCounter, &newy); 
				PEvsetcellEx(m_hPE, PEP_faXDATA, 1, m_nRealTimeCounter, &newx); 
				newy = 50.0F + float(sin((double) m_nSinCounter * 0.075F) * 12.0F) - GetRandom(1, 15); 
				newx = float(m_nRealTimeCounter); 
				PEvsetcellEx(m_hPE, PEP_faYDATA, 2, m_nRealTimeCounter, &newy); 
				PEvsetcellEx(m_hPE, PEP_faXDATA, 2, m_nRealTimeCounter, &newx); 
				 
				double dx; 
				dx = (double) newx; 
				PEvsetcell(m_hPE, PEP_faVERTLINEANNOTATION, 0, &dx); 
				PEvsetcell(m_hPE, PEP_faVERTLINEANNOTATION, 2, &dx); 
				PEvsetcell(m_hPE, PEP_faVERTLINEANNOTATION, 3, &dx); 
				int lt = PELT_MEDIUMSOLID; 
				PEvsetcell(m_hPE, PEP_naVERTLINEANNOTATIONTYPE, 0, <); 
				COLORREF col; 
				col = RGB(0,0,198); 
				PEvsetcell(m_hPE, PEP_dwaVERTLINEANNOTATIONCOLOR, 0, &col); 
				col = RGB(0,198,0); 
				PEvsetcell(m_hPE, PEP_dwaVERTLINEANNOTATIONCOLOR, 1, &col); 
				col = RGB(255,198,0); 
				PEvsetcell(m_hPE, PEP_dwaVERTLINEANNOTATIONCOLOR, 2, &col); 
				// Increment counter // 
				m_nRealTimeCounter = m_nRealTimeCounter + 1; 
				 
				// Reset counter at end of data // 
				if (m_nRealTimeCounter == 100) 
					m_nRealTimeCounter = 0; 
				 
				// SinCounter is only to produce sin wave data // 
				m_nSinCounter = m_nSinCounter + 1; 
				if (m_nSinCounter > 30000)  
					m_nSinCounter = 1; 
				 
				// Update image and force paint // 
				PEreinitialize( m_hPE ); 
				//	PEresetimage( m_hPE, 0, 0 ); 
				//	PEresetimage( m_hPE, 1, 0 ); 
				PEresetimage( m_hPE, 2, 0 ); 
				::InvalidateRect(m_hPE, NULL, FALSE); 
			} 
		} 
	} 
	CView::OnTimer(nIDEvent); 
} 
 
void CGraphicView::OnDraw3dBar()  
{  
	if(m_hPE) 
	{ 
		PEdestroy(m_hPE); 
		Invalidate(); 
	} 
	//! This shows how to place extra text inside table and within an axis. // 
	//! Maximize to allow room for textual data which is drawn as fixed font size. // 
	// This example builds upon the basic CreateSimpleGraph '000' example chart // 
	CreateSimpleGraph(); 
	 
	// Create two y axes // 
	int nMAS[] = {2, 2}; 
	PEvset(m_hPE, PEP_naMULTIAXESSUBSETS, nMAS, 2); 
	 
	// Construct a simple table annotation // 
	PEnset(m_hPE, PEP_nWORKINGTABLE, 0); 
	PEnset(m_hPE, PEP_nTAROWS, 6); 
	PEnset(m_hPE, PEP_nTACOLUMNS, 12);  // 12 is same number as PEP_nPOINTS 
	 
	// Pass the table text // 
	char szTmp[48]; 
	float fp; 
	int r, c; 
	DWORD dwColor; 
	BOOL b = TRUE; 
	 
	for (r=0; r<6; r++) 
	{ 
		if (b) 
			dwColor = RGB(175,175,175); 
		else 
			dwColor = RGB(255,255,255); 
		b = !b; 
		 
		for (c=0; c<12; c++) 
		{ 
			fp = float(sin(0.03F * (double) c + 1.0F + r) * 500.0F) + (float) GetRandom(2, 50); 
			sprintf(szTmp, "%.3f ", fp); 
			PEvsetcellEx(m_hPE, PEP_szaTATEXT, r, c, szTmp); 
			PEvsetcellEx(m_hPE, PEP_dwaTACOLOR, r, c, &dwColor); 
		} 
	} 
	 
	// Set Table Location // 
	PEnset(m_hPE, PEP_nTALOCATION, PETAL_INSIDE_AXIS_1); 
	PEnset(m_hPE, PEP_nTAAXISLOCATION, PETAAL_BOTTOM_TABLE_SPACED); 
	 
	// Other Table Related Properties /// 
	PEnset(m_hPE, PEP_bSHOWTABLEANNOTATION, TRUE); 
	PEnset(m_hPE, PEP_nTABORDER, PETAB_NO_BORDER); 
	PEnset(m_hPE, PEP_dwTABACKCOLOR, 1); 
	PEnset(m_hPE, PEP_dwTAFORECOLOR, 1); 
	 
	// Construct a second simple table annotation // 
	PEnset(m_hPE, PEP_nWORKINGTABLE, 1);  
	PEnset(m_hPE, PEP_nTAROWS, 6); 
	PEnset(m_hPE, PEP_nTACOLUMNS, 12); 
	 
	// Pass the table text // 
	b = TRUE; 
	for (r=0; r<6; r++) 
	{ 
		if (b) 
			dwColor = RGB(175,175,175); 
		else 
			dwColor = RGB(255,255,255); 
		b = !b; 
		 
		for (c=0; c<12; c++) 
		{ 
			fp = float(sin(0.03F * (double) c + 1.0F + (2 * r)) * 500.0F) + (float) GetRandom(2, 50); 
			sprintf(szTmp, "%.3f ", fp); 
			PEvsetcellEx(m_hPE, PEP_szaTATEXT, r, c, szTmp); 
			PEvsetcellEx(m_hPE, PEP_dwaTACOLOR, r, c, &dwColor); 
		} 
	} 
	 
	// Set Table Location // 
	PEnset(m_hPE, PEP_nTALOCATION, PETAL_INSIDE_AXIS); 
	PEnset(m_hPE, PEP_nTAAXISLOCATION, PETAAL_BOTTOM_TABLE_SPACED); 
	 
	// Other Table Related Properties /// 
	PEnset(m_hPE, PEP_bSHOWTABLEANNOTATION, TRUE); 
	PEnset(m_hPE, PEP_nTABORDER, PETAB_NO_BORDER); 
	PEnset(m_hPE, PEP_dwTABACKCOLOR, 1); 
	PEnset(m_hPE, PEP_dwTAFORECOLOR, 1); 
	 
	// Construct a third simple table annotation // 
	PEnset(m_hPE, PEP_nWORKINGTABLE, 2);  
	PEnset(m_hPE, PEP_nTAROWS, 2); 
	PEnset(m_hPE, PEP_nTACOLUMNS, 13); 
	 
	// Pass the table text // 
	for (r=0; r<2; r++) 
	{ 
		for (c=1; c<13; c++) 
		{ 
			fp = float(sin(0.03F * (double) c + 1.0F) * 500.0F) + (float) GetRandom(2, 50); 
			sprintf(szTmp, "%.3f ", fp); 
			PEvsetcellEx(m_hPE, PEP_szaTATEXT, r, c, szTmp); 
		} 
	} 
	 
	// Set Table Location // 
	PEnset(m_hPE, PEP_nTALOCATION, PETAL_INSIDE_TABLE); 
	PEnset(m_hPE, PEP_nTAAXISLOCATION, PETAAL_TOP_TABLE_SPACED); 
	 
	// Other Table Related Properties /// 
	PEnset(m_hPE, PEP_bSHOWTABLEANNOTATION, TRUE); 
	PEnset(m_hPE, PEP_dwTABACKCOLOR, RGB(0,198,198)); 
	PEnset(m_hPE, PEP_bTAHEADERCOLUMN, TRUE); 
	 
	// Set Text for Header Column // 
	strcpy(szTmp, "Table Annotation Line 1"); 
	PEvsetcellEx(m_hPE, PEP_szaTATEXT, 0, 0, szTmp); 
	strcpy(szTmp, "Table Annotation Line 2"); 
	PEvsetcellEx(m_hPE, PEP_szaTATEXT, 1, 0, szTmp); 
	 
	// Done setting Table Annotations /// 
	 
	// Set Various Other Properties /// 
	PEnset(m_hPE, PEP_bBITMAPGRADIENTMODE, TRUE); 
	PEnset(m_hPE, PEP_nQUICKSTYLE, PEQS_DARK_SHADOW); 
	PEnset(m_hPE, PEP_nDATAPRECISION, 0); 
	PEnset(m_hPE, PEP_nGRAPHPLUSTABLE, PEGPT_BOTH); 
	PEnset(m_hPE, PEP_nLEGENDSTYLE, PELS_1_LINE_INSIDE_AXIS); 
	PEnset(m_hPE, PEP_nGRIDLINECONTROL, PEGLC_YAXIS); 
	PEnset(m_hPE, PEP_bMARKDATAPOINTS, TRUE); 
	PEnset(m_hPE, PEP_nFONTSIZE, PEFS_SMALL); 
	PEnset(m_hPE, PEP_nDATASHADOWS, PEDS_SHADOWS); 
	PEnset(m_hPE, PEP_bSHOWLEGEND, FALSE); 
	 
	PEnset(m_hPE, PEP_nWORKINGAXIS, 0); 
	PEnset(m_hPE, PEP_nPLOTTINGMETHOD, PEGPM_BAR); 
	PEnset(m_hPE, PEP_nRYAXISCOMPARISONSUBSETS, 1); 
	PEnset(m_hPE, PEP_dwRYAXISCOLOR, RGB(0, 198,198)); 
	PEszset(m_hPE, PEP_szYAXISLABEL, ""); 
	PEszset(m_hPE, PEP_szRYAXISLABEL, ""); 
	 
	PEnset(m_hPE, PEP_nWORKINGAXIS, 1); 
	PEnset(m_hPE, PEP_nPLOTTINGMETHOD, PEGPM_BAR); 
	PEnset(m_hPE, PEP_nRYAXISCOMPARISONSUBSETS, 1); 
	PEnset(m_hPE, PEP_dwRYAXISCOLOR, RGB(0, 198,0)); 
	PEszset(m_hPE, PEP_szYAXISLABEL, ""); 
	PEszset(m_hPE, PEP_szRYAXISLABEL, ""); 
	 
	DWORD dwArray[4] = { RGB(138,0,0), RGB(0, 198, 198), RGB(138,138,0), RGB(0,198,0) }; 
	PEvsetEx(m_hPE, PEP_dwaSUBSETCOLORS, 0, 4, dwArray, 0); 
	 
	PEnset(m_hPE, PEP_nSHOWTABLEANNOTATIONSMENU, PEMC_SHOW); 
	 
} 
 
 
 
void CGraphicView::OnDraw3dStackedBar()  
{ 
	if(m_hPE) 
	{ 
		PEdestroy(m_hPE); 
		Invalidate(); 
	} 
	//! Chart fills 100 points and once 100 points have 
	//! been passed, old data is over-written as more 
	//! data is passed to chart. 
	m_canReal=TRUE; 
	m_Real=FALSE; 
	RECT rect; 
	GetClientRect( &rect );  
	 
	// Construct Object // 
	m_hPE = PEcreate(PECONTROL_SGRAPH, WS_VISIBLE, &rect, m_hWnd, 1001); 
	 
	PEnset(m_hPE, PEP_nSUBSETS, 3); 
	PEnset(m_hPE, PEP_nPOINTS, 100); 
	 
	// Set Manual Y scale // 
	PEnset(m_hPE, PEP_nMANUALSCALECONTROLY, PEMSC_MINMAX); 
	double arg = 1.0F;// 
	PEvset(m_hPE, PEP_fMANUALMINY, &arg, 1); 
	arg = 100.0F; 
	PEvset(m_hPE, PEP_fMANUALMAXY, &arg, 1); 
	 
	// Set Manual X scale // 
	PEnset(m_hPE, PEP_nMANUALSCALECONTROLX, PEMSC_MINMAX); 
	arg = 1.0F; 
	PEvset(m_hPE, PEP_fMANUALMINX, &arg, 1); 
	arg = 100.0F; 
	PEvset(m_hPE, PEP_fMANUALMAXX, &arg, 1); 
	 
	// Show Annotations // 
	PEnset(m_hPE, PEP_bSHOWANNOTATIONS, TRUE); 
	 
	// Clear out default data // 
	float val = 0; 
	PEvsetcellEx(m_hPE, PEP_faXDATA, 0, 0, &val); 
	PEvsetcellEx(m_hPE, PEP_faXDATA, 0, 1, &val); 
	PEvsetcellEx(m_hPE, PEP_faXDATA, 0, 2, &val); 
	PEvsetcellEx(m_hPE, PEP_faXDATA, 0, 3, &val);  
	 
	PEvsetcellEx(m_hPE, PEP_faXDATA, 1, 0, &val); 
	PEvsetcellEx(m_hPE, PEP_faXDATA, 1, 1, &val); 
	PEvsetcellEx(m_hPE, PEP_faXDATA, 1, 2, &val); 
	PEvsetcellEx(m_hPE, PEP_faXDATA, 1, 3, &val); 
	 
	PEvsetcellEx(m_hPE, PEP_faXDATA, 2, 0, &val); 
	PEvsetcellEx(m_hPE, PEP_faXDATA, 2, 1, &val); 
	PEvsetcellEx(m_hPE, PEP_faXDATA, 2, 2, &val); 
	PEvsetcellEx(m_hPE, PEP_faXDATA, 2, 3, &val); 
	 
	int nTmpStyle; 
	nTmpStyle = PELT_THINSOLID; 
	PEvsetcell(m_hPE, PEP_naSUBSETLINETYPES, 0, &nTmpStyle);  
	PEvsetcell(m_hPE, PEP_naSUBSETLINETYPES, 1, &nTmpStyle);  
	PEvsetcell(m_hPE, PEP_naSUBSETLINETYPES, 2, &nTmpStyle); 
	//	PEvset(m_hPE, PEP_naSUBSETLINETYPES, PELT_THINSOLID, 0); 
	 
	char szSubsets[] = "电流\t电压\t频率\t"; 
	PEvset (m_hPE, PEP_szaSUBSETLABELS, szSubsets, 3); 
	 
	 
	 
	// Set Various Other Properties /// 
	PEnset(m_hPE, PEP_bBITMAPGRADIENTMODE, TRUE); 
	PEnset(m_hPE, PEP_nQUICKSTYLE, PEQS_DARK_LINE); 
	 
	PEszset(m_hPE, PEP_szMAINTITLE, "工业控制实时曲线示例"); 
	PEszset(m_hPE, PEP_szSUBTITLE, "编程设计实现--戚高"); 
	PEnset(m_hPE, PEP_bNORANDOMPOINTSTOEXPORT, TRUE); 
	PEnset(m_hPE, PEP_bFOCALRECT, FALSE); 
	PEnset(m_hPE, PEP_bALLOWBAR, FALSE); 
	PEnset(m_hPE, PEP_bALLOWPOPUP, FALSE); 
	PEnset(m_hPE, PEP_bPREPAREIMAGES, TRUE); 
	PEnset(m_hPE, PEP_bCACHEBMP, TRUE); 
	PEnset(m_hPE, PEP_bFIXEDFONTS, TRUE); 
	 
	DWORD col = RGB(0, 198, 198); 
	PEvsetcell(m_hPE, PEP_dwaSUBSETCOLORS, 0, &col);  
	 
	col = RGB(0,198,0); 
	PEvsetcell(m_hPE, PEP_dwaSUBSETCOLORS, 1, &col); 
	 
	col = RGB(255,0,0); 
	PEvsetcell(m_hPE, PEP_dwaSUBSETCOLORS, 2, &col); 
	 
	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); 
	 
	PEreinitialize(m_hPE); 
	PEresetimage(m_hPE, 2, 0); 
	::InvalidateRect(m_hPE, NULL, FALSE); 
	 
	//Initialize Counters and Timer  
	m_nRealTimeCounter = 1; 
	m_nSinCounter = 1; 
	SetTimer( 1, 100, NULL );  
} 
 
 
void CGraphicView::OnDraw3dLine()  
{    
	if(m_hPE) 
	{ 
		PEdestroy(m_hPE); 
		Invalidate(); 
	} 
	m_canReal=FALSE;  
	RECT rect; 
	GetClientRect( &rect ); 
	 
	// Construct Object // 
	m_hPE = PEcreate(PECONTROL_PGRAPH, WS_VISIBLE, &rect, m_hWnd, 1001); 
	 
	PEnset(m_hPE, PEP_nSUBSETS, 2); 
	PEnset(m_hPE, PEP_nPOINTS, 360); 
	 
	int p; 
	float f1, f2; 
	for (p=0; p<360; p++) 
	{ 
		f1 = (float) p; 
		f2 = (float) 150 * (float)sin((double) p * 0.054F); 
		PEvsetcellEx(m_hPE, PEP_faXDATA, 0, p, &f1); 
		PEvsetcellEx(m_hPE, PEP_faYDATA, 0, p, &f2); 
	} 
	 
	for (p=0; p<360; p++) 
	{ 
		f1 = (float) p; 
		f2 = (float) 150 * (float)sin(((double) p * 0.044F)) * 2; 
		PEvsetcellEx(m_hPE, PEP_faXDATA, 1, p, &f1); 
		PEvsetcellEx(m_hPE, PEP_faYDATA, 1, p, &f2); 
	} 
	 
	PEnset(m_hPE, PEP_nPLOTTINGMETHOD, PEGPM_LINE); 
	PEnset(m_hPE, PEP_nALLOWZOOMING, 1); 
	PEszset(m_hPE, PEP_szMAINTITLE, "Polar Chart"); 
	PEszset(m_hPE, PEP_szSUBTITLE, ""); // no subtitle 
	float ftmp = .9F; 
	PEvset(m_hPE, PEP_fFONTSIZELEGENDCNTL, &ftmp, 1 ); 
	PEnset(m_hPE, PEP_bPREPAREIMAGES, TRUE); 
	PEnset(m_hPE, PEP_bCACHEBMP, TRUE); 
	PEnset(m_hPE, PEP_bFOCALRECT, FALSE); 
	 
	// Set line types 
	int nTypes[] = { PELT_MEDIUMSOLID, PELT_MEDIUMSOLID }; 
	PEvset(m_hPE, PEP_naSUBSETLINETYPES, nTypes, 2); 
	 
	// Set point types 
	int nPTypes[] = { PEPT_DOTSOLID, PEPT_PLUS }; 
	PEvset(m_hPE, PEP_naSUBSETPOINTTYPES, nTypes, 2); 
	 
	// subset colors 
	DWORD dwArray[2] = { RGB(198,0,0), RGB(0, 198, 0) }; 
	PEvset( m_hPE, PEP_dwaSUBSETCOLORS, dwArray, 2); 
	 
	// subset labels 
	PEvsetcell( m_hPE, PEP_szaSUBSETLABELS, 0, "Signal #1" ); 
	PEvsetcell( m_hPE, PEP_szaSUBSETLABELS, 1, "Signal #2" ); 
	 
	double dnull = -99999.0F; 
	PEvset(m_hPE, PEP_fNULLDATAVALUEX, &dnull, 1); 
	PEvset(m_hPE, PEP_fNULLDATAVALUE, &dnull, 1); 
	 
	// Set Various other features // 
	PEnset(m_hPE, PEP_bFIXEDFONTS, TRUE); 
	PEnset(m_hPE, PEP_bBITMAPGRADIENTMODE, TRUE); 
	PEnset(m_hPE, PEP_nQUICKSTYLE, PEQS_MEDIUM_NO_BORDER); 
	PEnset(m_hPE, PEP_bSIMPLEPOINTLEGEND, TRUE); 
	PEnset(m_hPE, PEP_bSIMPLELINELEGEND, TRUE); 
	PEnset(m_hPE, PEP_nLEGENDSTYLE, PELS_1_LINE); 
	PEnset(m_hPE, PEP_nZOOMSTYLE, PEZS_RO2_NOT); 
	PEnset(m_hPE, PEP_nPOINTSIZE, PEPS_SMALL); 
	 
	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); 
	PEnset(m_hPE, PEP_nGRADIENTBARS, 8); 
	PEnset(m_hPE, PEP_nDATASHADOWS, PEDS_SHADOWS); 
	float f = 1.2F; 
	PEvset(m_hPE, PEP_fFONTSIZEGNCNTL, &f, 1);  
	// Enable Smith Mode // 
	PEnset(m_hPE, PEP_nSMITHCHART, PESC_SMITH); 
	PEszset(m_hPE, PEP_szMAINTITLE, "Smith Chart"); 
	 
	// Change the data to something more appropriate // 
	PEnset(m_hPE, PEP_nSUBSETS, 2); 
	PEnset(m_hPE, PEP_nPOINTS, 40); 
	 
	// Set first subset's data //  
	int s = 0; 
	for (p=0; p<=39; p++) 
	{ 
		f = (float) p * 0.1F; 
		PEvsetcellEx(m_hPE, PEP_faXDATA, s, p, &f); 
		f = (float) sin((double) p * 0.54F) * 0.2F; 
		PEvsetcellEx(m_hPE, PEP_faYDATA, s, p, &f); 
	} 
	 
	// Set second subset's data // 
	s = 1; 
	for (p=0; p<=39; p++) 
	{ 
		f = (float) p * 0.5F; 
		PEvsetcellEx(m_hPE, PEP_faXDATA, s, p, &f); 
		f = (float) sin((double) p * 0.44F) * 0.5F; 
		PEvsetcellEx(m_hPE, PEP_faYDATA, s, p, &f); 
	} 
	 
	// Set Various other features // 
	PEnset(m_hPE, PEP_bBITMAPGRADIENTMODE, TRUE); 
	PEnset(m_hPE, PEP_nQUICKSTYLE, PEQS_DARK_SHADOW); 
	 
	// Add Some Padding on Right and Bottom // 
	PEnset(m_hPE, PEP_nIMAGEADJUSTLEFT, 400); 
	PEnset(m_hPE, PEP_nIMAGEADJUSTRIGHT, 400); 
	PEnset(m_hPE, PEP_nIMAGEADJUSTBOTTOM, 400); 
} 
 
 
 
 
void CGraphicView::OnDraw3dPie()  
{   
	if(m_hPE) 
	{ 
		PEdestroy(m_hPE); 
		Invalidate(); 
	} 
	RECT rect; 
	GetClientRect( &rect );  
	m_canReal=FALSE; 
	m_hPE = PEcreate(PECONTROL_PIE, WS_VISIBLE, &rect, m_hWnd, 1001); 
	PEnset(m_hPE, PEP_nSUBSETS, 5); 
	PEnset(m_hPE, PEP_nPOINTS, 12); 
	int s,p;           
	for (s=0; s<5; s++) 
	{ 
		for (p=0; p<12; p++) 
		{ 
			float f1 = (float) GetRandom(1, 5) + ((float) GetRandom(1, 150) / 100.0F); 
			PEvsetcellEx(m_hPE, PEP_faXDATA, s, p, &f1); 
		} 
	} 
	float f1= 0.0F; 
	PEvsetcellEx(m_hPE, PEP_faXDATA, 0, 3, &f1);  
	PEvsetcell( m_hPE, PEP_szaSUBSETLABELS, 0, "北京" ); 
	PEvsetcell( m_hPE, PEP_szaSUBSETLABELS, 1, "上海" ); 
	PEvsetcell( m_hPE, PEP_szaSUBSETLABELS, 2, "广州"  ); 
	PEvsetcell( m_hPE, PEP_szaSUBSETLABELS, 3, "长沙" ); 
	PEvsetcell( m_hPE, PEP_szaSUBSETLABELS, 4, "重庆" );  
	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, "十二月"    );  
	DWORD c[12]; 
	c[0] = RGB(198, 0, 0); 
	c[1] = RGB(0, 198, 0); 
	c[2] = RGB(198, 198, 0); 
	c[3] = RGB(0, 0, 198); 
	c[4] = RGB(198, 0, 198); 
	c[5] = RGB(0, 198, 198); 
	c[6] = RGB(192, 192, 192); 
	c[7] = RGB(148, 0, 0); 
	c[8] = RGB(0, 148, 0); 
	c[9] = RGB(148, 148, 0); 
	c[10] = RGB(0, 148, 148); 
	c[11] = RGB(122, 122, 122); 
	PEvset(m_hPE, PEP_dwaSUBSETCOLORS, c, 12);  
	PEszset(m_hPE, PEP_szMAINTITLE, "3D PIE图表显示编程"); 
	PEszset(m_hPE, PEP_szSUBTITLE, "编程设计实现-戚高"); // no subtitle  
	PEnset(m_hPE, PEP_nDATAPRECISION, 1);				    
	PEnset(m_hPE, PEP_nGROUPINGPERCENT, 4); 
	PEnset(m_hPE, PEP_nDATASHADOWS, PEDS_3D);					  
	PEnset(m_hPE, PEP_bDISABLE3DSHADOW, FALSE); 
	PEnset(m_hPE, PEP_nAUTOEXPLODE, PEAE_ALLSUBSETS); 
	PEnset(m_hPE, PEP_bFOCALRECT, FALSE); 
	PEnset(m_hPE, PEP_bPREPAREIMAGES, TRUE); 
	PEnset(m_hPE, PEP_bCACHEBMP, TRUE); 
	PEnset(m_hPE, PEP_nFONTSIZE, PEFS_LARGE); 
	PEnset(m_hPE, PEP_bFIXEDFONTS, TRUE);  
	PEnset(m_hPE, PEP_bBITMAPGRADIENTMODE, TRUE); 
	PEnset(m_hPE, PEP_nQUICKSTYLE, PEQS_MEDIUM_NO_BORDER);  
	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_nFONTSIZE, PEFS_LARGE);  
} 
 
 
void CGraphicView::OnBkLine()  
{  
	if(m_hPE) 
	{ 
		PEdestroy(m_hPE); 
		Invalidate(); 
	} 
	OnDraw3dPie();  
	float f1 = 1;  
	PEvsetcellEx(m_hPE, PEP_faYDATA, 0, 3, &f1); 
	PEvsetcellEx(m_hPE, PEP_faYDATA, 0, 5, &f1);  
	PEnset(m_hPE, PEP_bBITMAPGRADIENTMODE, FALSE); 
	PEnset(m_hPE, PEP_nQUICKSTYLE, PEQS_MEDIUM_SHADOW);  
	PEnset(m_hPE, PEP_nIMAGEADJUSTLEFT, 400); 
	PEnset(m_hPE, PEP_nIMAGEADJUSTRIGHT, 400); 
	PEnset(m_hPE, PEP_nIMAGEADJUSTBOTTOM, 400); 
	//*********************************************** 
	OnDraw3dPie(); 
	f1 = 1; 
	PEvsetcellEx(m_hPE, PEP_faYDATA, 0, 3, &f1); 
	PEvsetcellEx(m_hPE, PEP_faYDATA, 0, 5, &f1);  
	PEnset(m_hPE, PEP_bBITMAPGRADIENTMODE, FALSE); 
	PEnset(m_hPE, PEP_nQUICKSTYLE, PEQS_MEDIUM_SHADOW);  
	PEnset(m_hPE, PEP_nIMAGEADJUSTLEFT, 400); 
	PEnset(m_hPE, PEP_nIMAGEADJUSTRIGHT, 400); 
	PEnset(m_hPE, PEP_nIMAGEADJUSTBOTTOM, 400);  
} 
 
 
void CGraphicView::OnBkXy()  
{  
	if(m_hPE) 
	{ 
		PEdestroy(m_hPE); 
		Invalidate(); 
	} 
	RECT rect; 
	GetClientRect( &rect ); 
	 
	// Construct Object // 
	m_hPE = PEcreate(PECONTROL_PGRAPH, WS_VISIBLE, &rect, m_hWnd, 100); 
	 
	// Set to rose mode //	 
	PEnset(m_hPE, PEP_nSMITHCHART, PESC_ROSE);  // Select Rose Plot Mode 
	 
	// Set titles // 
	PEszset(m_hPE, PEP_szMAINTITLE, "Wind Rose Example"); 
	PEszset(m_hPE, PEP_szSUBTITLE, " "); 
	 
	// Set data // 
	PEnset(m_hPE, PEP_nSUBSETS, 13); 
	PEnset(m_hPE, PEP_nPOINTS, 16); 
	 
	float tempxdata[] = 
	{  
		90.0F, 	67.5F,	45.0F,	22.5F,	0.0F,	337.5F,	315.0F,	292.5F,	270.0F,	247.5F,	225.0F,	202.5F,	180.0F,	157.5F,	135.0F,	112.5F, 
			90.0F, 	67.5F,	45.0F,	22.5F,	0.0F,	337.5F,	315.0F,	292.5F,	270.0F,	247.5F,	225.0F,	202.5F,	180.0F,	157.5F,	135.0F,	112.5F, 
			90.0F, 	67.5F,	45.0F,	22.5F,	0.0F,	337.5F,	315.0F,	292.5F,	270.0F,	247.5F,	225.0F,	202.5F,	180.0F,	157.5F,	135.0F,	112.5F, 
			90.0F, 	67.5F,	45.0F,	22.5F,	0.0F,	337.5F,	315.0F,	292.5F,	270.0F,	247.5F,	225.0F,	202.5F,	180.0F,	157.5F,	135.0F,	112.5F, 
			90.0F, 	67.5F,	45.0F,	22.5F,	0.0F,	337.5F,	315.0F,	292.5F,	270.0F,	247.5F,	225.0F,	202.5F,	180.0F,	157.5F,	135.0F,	112.5F, 
			90.0F, 	67.5F,	45.0F,	22.5F,	0.0F,	337.5F,	315.0F,	292.5F,	270.0F,	247.5F,	225.0F,	202.5F,	180.0F,	157.5F,	135.0F,	112.5F, 
			90.0F, 	67.5F,	45.0F,	22.5F,	0.0F,	337.5F,	315.0F,	292.5F,	270.0F,	247.5F,	225.0F,	202.5F,	180.0F,	157.5F,	135.0F,	112.5F, 
			90.0F, 	67.5F,	45.0F,	22.5F,	0.0F,	337.5F,	315.0F,	292.5F,	270.0F,	247.5F,	225.0F,	202.5F,	180.0F,	157.5F,	135.0F,	112.5F, 
			90.0F, 	67.5F,	45.0F,	22.5F,	0.0F,	337.5F,	315.0F,	292.5F,	270.0F,	247.5F,	225.0F,	202.5F,	180.0F,	157.5F,	135.0F,	112.5F, 
			90.0F, 	67.5F,	45.0F,	22.5F,	0.0F,	337.5F,	315.0F,	292.5F,	270.0F,	247.5F,	225.0F,	202.5F,	180.0F,	157.5F,	135.0F,	112.5F, 
			90.0F, 	67.5F,	45.0F,	22.5F,	0.0F,	337.5F,	315.0F,	292.5F,	270.0F,	247.5F,	225.0F,	202.5F,	180.0F,	157.5F,	135.0F,	112.5F, 
			90.0F, 	67.5F,	45.0F,	22.5F,	0.0F,	337.5F,	315.0F,	292.5F,	270.0F,	247.5F,	225.0F,	202.5F,	180.0F,	157.5F,	135.0F,	112.5F, 
			90.0F, 	67.5F,	45.0F,	22.5F,	0.0F,	337.5F,	315.0F,	292.5F,	270.0F,	247.5F,	225.0F,	202.5F,	180.0F,	157.5F,	135.0F,	112.5F	}; 
		PEvset(m_hPE, PEP_faXDATA, tempxdata, 208); 
		 
		float tempydata[] =  
		{	.77F, .75F, .78F, .88F, 1.07F, .98F, .69F, .51F, .38F, .50F, .56F, .65F, .72F, .70F, .62F, .63F, 
		1.04F, 1.72F, 2.68F, 4.76F, 4.58F, 2.59F, 1.29F, .99F, 1.19F, 1.77F, 2.34F, 2.89F, 2.05F, 1.31F, 1.16F, 1.08F, 
		.43F, 1.05F, 3.41F, 7.40F, 5.97F, 1.48F, .30F, .39F, .73F, 1.68F, 3.53F, 2.73F, 1.24F, .55F, .25F, .27F, 
		.20F, 1.07F, 3.71F, 4.49F, 2.08F, .23F, .10F, .11F, .29F, 1.16F, 2.32F, 1.26F, .54F, .18F, .09F, .22F, 
		.05F, .48F, .66F, 1.31F, .26F, .01F, .02F, .04F, .14F, .33F, .75F, .46F, .18F, .05F, .07F, .03F, 
		.04F, .10F, .07F, .02F, .02F, .02F, .01F, .01F, .01F, .05F, .12F, .09F, .04F, .02F, .03F, .04F, 
		.01F, 0.0F, .01F, .01F,	0.0F, .01F,	.01F, .01F,	.01F, .01F,	.01F, .03F,	0.0F, 0.0F,	.02F, .01F, 
		.01F, 0.0F, .01F, 0.0F,	.01F, 0.0F,	.01F, 0.0F,	0.0F, .01F,	0.0F, .01F,	.02F, .01F,	.01F, 0.0F, 
		.01F, 0.0F, 0.0F, 0.0F,	0.0F, 0.0F,	0.0F, .01F,	0.0F, 0.0F,	0.0F, 0.1F,	0.0F, 0.0F,	0.0F, 0.0F, 
		0.0F, 0.0F, .01F, 0.0F,	0.0F, 0.0F,	0.0F, .01F,	0.0F, 0.0F,	0.0F, 0.0F,	0.0F, 0.0F,	0.0F, 0.0F, 
		0.0F, 0.0F, .01F, 0.0F,	0.0F, 0.0F,	0.0F, .01F,	0.0F, 0.0F,	0.0F, 0.0F,	0.0F, 0.0F,	0.0F, 0.0F, 
		0.0F, 0.0F, .01F, 0.0F,	0.0F, 0.0F,	0.0F, 0.0F,	0.0F, 0.0F,	0.0F, 0.0F,	0.0F, 0.0F,	0.0F, 0.0F, 
		0.0F, 0.0F, .01F, 0.0F,	0.0F, 0.0F,	0.0F, 0.0F,	0.0F, 0.0F,	0.0F,0.0F,	0.0F, 0.0F,	0.0F, 0.0F	}; 
		PEvset(m_hPE, PEP_faYDATA, tempydata, 208); 
		 
		char tempptlabels[] = "E\tENE\tNE\tNNE\tN\tNNW\tNW\tWNW\tW\tWSW\tSW\tSSW\tS\tSSE\tSE\tESE\t"; 
		char tempsslabels[] = "3.75\t6.25\t8.75\t11.25\t13.75\t16.25\t18.75\t21.25\t23.75\t26.25\t28.75\t31.25\t33.75\t"; 
		PEvset(m_hPE, PEP_szaPOINTLABELS, tempptlabels, 16); 
		PEvset(m_hPE, PEP_szaSUBSETLABELS, tempsslabels, 13); 
		 
		// Manually control degree line frequency // 
		PEnset(m_hPE, PEP_bMANUALXAXISTICKNLINE, TRUE); 
		double d = 22.5F; 
		PEvset(m_hPE, PEP_fMANUALXAXISLINE, &d, 1); 
		PEvset(m_hPE, PEP_fMANUALXAXISTICK, &d, 1); 
		 
		// Make it so monochrome image is just black and white // 
		DWORD bwc[2]; 
		bwc[0] = 0L; 
		bwc[1] = RGB(255,255,255); 
		PEvset(m_hPE, PEP_dwaSUBSETSHADES, bwc, 2); 
		 
		// Remove standard legend, rose has a special legend // 
		int stl = -1; 
		PEvset(m_hPE, PEP_naSUBSETSTOLEGEND, &stl, 1); 
		 
		// Set inner circle label // 
		PEszset(m_hPE, PEP_szMANUALMAXDATASTRING, "1.25|1.1%"); 
		 
		// Get rid of radius labels // 
		PEnset(m_hPE, PEP_bGRIDINFRONT, FALSE); 
		 
		// Enable zooming // 
		PEnset(m_hPE, PEP_nALLOWZOOMING, PEAZ_HORZANDVERT); 
		PEnset(m_hPE, PEP_nZOOMSTYLE, PEZS_RO2_NOT); 
		 
		PEnset(m_hPE, PEP_bPREPAREIMAGES, TRUE); 
		PEnset(m_hPE, PEP_bCACHEBMP, TRUE); 
		PEnset(m_hPE, PEP_bFIXEDFONTS, TRUE); 
		PEnset(m_hPE, PEP_bBITMAPGRADIENTMODE, FALSE); 
		PEnset(m_hPE, PEP_nQUICKSTYLE, PEQS_MEDIUM_NO_BORDER); 
		PEnset(m_hPE, PEP_bSIMPLEPOINTLEGEND, TRUE); 
		PEnset(m_hPE, PEP_bSIMPLELINELEGEND, TRUE); 
		PEnset(m_hPE, PEP_nLEGENDSTYLE, PELS_1_LINE); 
		 
		// Add Some Padding on Right and Bottom // 
		PEnset(m_hPE, PEP_nIMAGEADJUSTLEFT, 400); 
		PEnset(m_hPE, PEP_nIMAGEADJUSTRIGHT, 400); 
		PEnset(m_hPE, PEP_nIMAGEADJUSTBOTTOM, 400); 
		 
		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); 
		PEnset(m_hPE, PEP_nGRADIENTBARS, 8); 
		PEnset(m_hPE, PEP_nDATASHADOWS, PEDS_SHADOWS); 
		float f = 1.2F; 
		PEvset(m_hPE, PEP_fFONTSIZEGNCNTL, &f, 1); 
		 
} 
 
 
 
void CGraphicView::OnBkArea()  
{  
	if(m_hPE) 
	{ 
		PEdestroy(m_hPE); 
		Invalidate(); 
	} 
	// This example builds upon the basic CreateSimpleGraph '000' example chart // 
	CreateSimpleGraph(); 
	 
	///////////////////////////////////////// 
	// Construct a simple table annotation // 
	///////////////////////////////////////// 
	PEnset(m_hPE, PEP_nWORKINGTABLE, 0); 
	PEnset(m_hPE, PEP_nTAROWS, 1); 
	PEnset(m_hPE, PEP_nTACOLUMNS, 2); 
	PEnset(m_hPE, PEP_nTATEXTSIZE, 85); 
	 
	// Pass the table text // 
	char szTmp[48]; 
	strcpy(szTmp, "Category 1"); 
	PEvsetcellEx(m_hPE, PEP_szaTATEXT, 0, 0, szTmp); 
	strcpy(szTmp, "Category 2"); 
	PEvsetcellEx(m_hPE, PEP_szaTATEXT, 0, 1, szTmp); 
	 
	// Set column widths /// 
	int nWidth = 28; 
	PEvsetcell(m_hPE, PEP_naTACOLUMNWIDTH, 0, &nWidth); 
	PEvsetcell(m_hPE, PEP_naTACOLUMNWIDTH, 1, &nWidth); 
	 
	PEnset(m_hPE, PEP_bSHOWTABLEANNOTATION, TRUE); 
	 
	PEnset(m_hPE, PEP_nTALOCATION, PETAL_INSIDE_AXIS_0); 
	PEnset(m_hPE, PEP_nTAAXISLOCATION, PETAAL_TOP_LEFT); 
	PEnset(m_hPE, PEP_nTABORDER, PETAB_SINGLE_LINE); 
	PEnset(m_hPE, PEP_dwTABACKCOLOR, RGB(255,255,255)); 
	 
	int nJust = PETAJ_CENTER; 
	PEvsetcell(m_hPE, PEP_naTAJUSTIFICATION, 0, &nJust); 
	PEvsetcell(m_hPE, PEP_naTAJUSTIFICATION, 1, &nJust); 
	 
	///////////////////////////////////////// 
	// Construct a simple table annotation // 
	///////////////////////////////////////// 
	PEnset(m_hPE, PEP_nWORKINGTABLE, 1); 
	PEnset(m_hPE, PEP_nTAROWS, 1); 
	PEnset(m_hPE, PEP_nTACOLUMNS, 4); 
	PEnset(m_hPE, PEP_nTATEXTSIZE, 85); 
	 
	strcpy(szTmp, "Sub Cat 1"); 
	PEvsetcellEx(m_hPE, PEP_szaTATEXT, 0, 0, szTmp); 
	strcpy(szTmp, "Sub Cat 2"); 
	PEvsetcellEx(m_hPE, PEP_szaTATEXT, 0, 1, szTmp); 
	strcpy(szTmp, "Sub Cat 3"); 
	PEvsetcellEx(m_hPE, PEP_szaTATEXT, 0, 2, szTmp); 
	strcpy(szTmp, "Sub Cat 4"); 
	PEvsetcellEx(m_hPE, PEP_szaTATEXT, 0, 3, szTmp); 
	 
	nWidth = 14; 
	PEvsetcell(m_hPE, PEP_naTACOLUMNWIDTH, 0, &nWidth); 
	PEvsetcell(m_hPE, PEP_naTACOLUMNWIDTH, 1, &nWidth); 
	PEvsetcell(m_hPE, PEP_naTACOLUMNWIDTH, 2, &nWidth); 
	PEvsetcell(m_hPE, PEP_naTACOLUMNWIDTH, 3, &nWidth); 
	 
	nJust = PETAJ_CENTER; 
	PEvsetcell(m_hPE, PEP_naTAJUSTIFICATION, 0, &nJust); 
	PEvsetcell(m_hPE, PEP_naTAJUSTIFICATION, 1, &nJust); 
	PEvsetcell(m_hPE, PEP_naTAJUSTIFICATION, 2, &nJust); 
	PEvsetcell(m_hPE, PEP_naTAJUSTIFICATION, 3, &nJust); 
	 
	PEnset(m_hPE, PEP_dwTABACKCOLOR, RGB(240,240,240)); 
	PEnset(m_hPE, PEP_bSHOWTABLEANNOTATION, TRUE); 
	 
	PEnset(m_hPE, PEP_nTALOCATION, PETAL_INSIDE_AXIS_0); 
	PEnset(m_hPE, PEP_nTAAXISLOCATION, PETAAL_TOP_LEFT + PETAAL_NEW_ROW); 
	 
	PEnset(m_hPE, PEP_nTABORDER, PETAB_SINGLE_LINE); 
	 
	///////////////////////////////////////// 
	// Construct a simple table annotation // 
	///////////////////////////////////////// 
	PEnset(m_hPE, PEP_nWORKINGTABLE, 2); 
	PEnset(m_hPE, PEP_nTAROWS, 4); 
	PEnset(m_hPE, PEP_nTACOLUMNS, 8); 
	PEnset(m_hPE, PEP_nTATEXTSIZE, 85); 
	 
	// Set Column Widths // 
	nWidth = 7; 
	PEvsetcell(m_hPE, PEP_naTACOLUMNWIDTH, 0, &nWidth); 
	PEvsetcell(m_hPE, PEP_naTACOLUMNWIDTH, 1, &nWidth); 
	PEvsetcell(m_hPE, PEP_naTACOLUMNWIDTH, 2, &nWidth); 
	PEvsetcell(m_hPE, PEP_naTACOLUMNWIDTH, 3, &nWidth); 
	PEvsetcell(m_hPE, PEP_naTACOLUMNWIDTH, 4, &nWidth); 
	PEvsetcell(m_hPE, PEP_naTACOLUMNWIDTH, 5, &nWidth); 
	PEvsetcell(m_hPE, PEP_naTACOLUMNWIDTH, 6, &nWidth); 
	PEvsetcell(m_hPE, PEP_naTACOLUMNWIDTH, 7, &nWidth); 
	 
	// Pass the table text // 
	float fp; 
	int nTmp; 
	for (int r=0; r<4; r++) 
	{ 
		for (int c=0; c<8; c++) 
		{ 
			fp = float(sin(0.3F * (double) c + 1) * 500.0F) + GetRandom(2, 50); 
			sprintf(szTmp, "%.2f ", fp); 
			PEvsetcellEx(m_hPE, PEP_szaTATEXT, r, c, szTmp); 
			 
			if (c > 5) 
				nTmp = RGB(0, 148, 0); 
			else if (c > 3) 
				nTmp = RGB(148, 148, 0); 
			else if (c > 1) 
				nTmp = RGB(0, 148, 148); 
			else 
				nTmp = RGB(198, 0, 0); 
			 
			PEvsetcellEx(m_hPE, PEP_dwaTACOLOR, r, c, &nTmp);  
			 
			nJust = PETAJ_CENTER; 
			PEvsetcellEx(m_hPE, PEP_naTAJUSTIFICATION, r, c, &nJust); 
		} 
	} 
	 
	// Other Table Related Properties /// 
	PEnset(m_hPE, PEP_bSHOWTABLEANNOTATION, TRUE); 
	 
	PEnset(m_hPE, PEP_nTALOCATION, PETAL_INSIDE_AXIS_0); 
	PEnset(m_hPE, PEP_nTAAXISLOCATION, PETAAL_TOP_LEFT + PETAAL_NEW_ROW + PETAAL_NEW_ROW); 
	PEnset(m_hPE, PEP_nTABORDER, PETAB_SINGLE_LINE); 
	PEnset(m_hPE, PEP_dwTABACKCOLOR, RGB(200, 200, 200)); 
	 
	// Done setting Table Annotations /// 
	 
	// Set Various Other Properties /// 
	PEnset(m_hPE, PEP_bBITMAPGRADIENTMODE, TRUE); 
	PEnset(m_hPE, PEP_nQUICKSTYLE, PEQS_MEDIUM_SHADOW); 
	PEnset(m_hPE, PEP_nGRIDLINECONTROL, PEGLC_BOTH); 
	PEnset(m_hPE, PEP_nDATAPRECISION, 0); 
	 
	double f = 1.5F; 
	PEvset(m_hPE, PEP_fAXISNUMBERSPACING, &f, 1); 
	 
} 
 
 
void CGraphicView::OnBkBar()  
{  
	if(m_hPE) 
	{ 
		PEdestroy(m_hPE); 
		Invalidate(); 
	} 
	// This example builds upon the basic CreateSimpleGraph '000' example chart // 
	CreateSimpleGraph(); 
	 
	// Construct a simple table annotation // 
	PEnset(m_hPE, PEP_nWORKINGTABLE, 0); 
	PEnset(m_hPE, PEP_nTAROWS, 4); 
	PEnset(m_hPE, PEP_nTACOLUMNS, 7); 
	 
	// Pass the table text // 
	char szTmp[48]; 
	PEvsetcellEx(m_hPE, PEP_szaTATEXT, 1, 0, "Row 2 "); 
	PEvsetcellEx(m_hPE, PEP_szaTATEXT, 2, 0, "Row 3 "); 
	PEvsetcellEx(m_hPE, PEP_szaTATEXT, 3, 0, "Row 4 "); 
	 
	PEvsetcellEx(m_hPE, PEP_szaTATEXT, 0, 1, "Column 2 "); 
	PEvsetcellEx(m_hPE, PEP_szaTATEXT, 0, 2, "Column 3 "); 
	PEvsetcellEx(m_hPE, PEP_szaTATEXT, 0, 3, "Column 4 "); 
	PEvsetcellEx(m_hPE, PEP_szaTATEXT, 0, 4, "Column 5 "); 
	PEvsetcellEx(m_hPE, PEP_szaTATEXT, 0, 5, "Column 6 "); 
	PEvsetcellEx(m_hPE, PEP_szaTATEXT, 0, 6, "Column 7 "); 
	 
	float fp; 
	int nTmp; 
	for (int r=1; r<4; r++) 
	{ 
		for (int c=1; c<7; c++) 
		{ 
			fp = float(sin(0.3F * (double) c + 1) * 500.0F) + GetRandom(2, 50); 
			sprintf(szTmp, "%.5f ", fp); 
			PEvsetcellEx(m_hPE, PEP_szaTATEXT, r, c, szTmp); 
			nTmp = RGB(198, 0, 0); 
			PEvsetcellEx(m_hPE, PEP_dwaTACOLOR, r, c, &nTmp);  
		} 
	} 
	 
	// Other Table Related Properties /// 
	PEnset(m_hPE, PEP_bSHOWTABLEANNOTATION, TRUE); 
	PEnset(m_hPE, PEP_nTALOCATION, PETAL_INSIDE_TOP_LEFT); 
	PEnset(m_hPE, PEP_dwTABACKCOLOR, RGB(255,255,255)); 
	PEnset(m_hPE, PEP_nTAHEADERROWS, 1); 
	PEnset(m_hPE, PEP_bTAHEADERCOLUMN, TRUE); 
	PEnset(m_hPE, PEP_nTATEXTSIZE, 85); 
	 
	// Construct a second simple table annotation // 
	PEnset(m_hPE, PEP_nWORKINGTABLE, 1);  // Note WorkingTable goes to 1 
	PEnset(m_hPE, PEP_nTAROWS, 15); 
	PEnset(m_hPE, PEP_nTACOLUMNS, 2); 
	 
	// // Pass the table text // 
	PEvsetcellEx(m_hPE, PEP_szaTATEXT, 0, 0, ""); 
	PEvsetcellEx(m_hPE, PEP_szaTATEXT, 0, 1, "Data"); 
	nTmp = PETAJ_CENTER; 
	PEvsetcellEx(m_hPE, PEP_naTAJUSTIFICATION, 0, 0, &nTmp); 
	PEvsetcellEx(m_hPE, PEP_naTAJUSTIFICATION, 0, 1, &nTmp); 
	 
	// First Column Text // 
	for (r=1; r<15; r++) 
	{ 
		sprintf(szTmp, "%2d", r); 
		PEvsetcellEx(m_hPE, PEP_szaTATEXT, r, 0, szTmp); 
	} 
	 
	// // Second Column Text // 
	for (r=1; r<15; r++) 
	{ 
		fp = float(sin(0.3F * (double) r + 1) * 500.0F) + GetRandom(2, 50); 
		sprintf(szTmp, "%.2f", fp); 
		PEvsetcellEx(m_hPE, PEP_szaTATEXT, r, 1, szTmp); 
	} 
	 
	// Other Table Related Properties /// 
	PEnset(m_hPE, PEP_bSHOWTABLEANNOTATION, TRUE); 
	PEnset(m_hPE, PEP_nTALOCATION, PETAL_LEFT_CENTER); 
	PEnset(m_hPE, PEP_dwTABACKCOLOR, RGB(255,255,255)); 
	PEnset(m_hPE, PEP_nTAHEADERROWS, 1); 
	PEnset(m_hPE, PEP_bTAHEADERCOLUMN, TRUE); 
	 
	// Done setting Table Annotations /// 
	 
	// Set Various Other Properties /// 
	PEnset(m_hPE, PEP_bBITMAPGRADIENTMODE, TRUE); 
	PEnset(m_hPE, PEP_nQUICKSTYLE, PEQS_LIGHT_INSET); 
	PEnset(m_hPE, PEP_nDATAPRECISION, 0); 
	 
} 
 
 
void CGraphicView::OnBkBarGroup()  
{  
	if(m_hPE) 
	{ 
		PEdestroy(m_hPE); 
		Invalidate(); 
	} 
	RECT rect; 
	GetClientRect( &rect ); 
	m_canReal=FALSE; 
	// Construct Object // 
	m_hPE = PEcreate(PECONTROL_SGRAPH, WS_VISIBLE, &rect, m_hWnd, 1000); 
	 
	PEnset(m_hPE, PEP_nSUBSETS, 4); 
	PEnset(m_hPE, PEP_nPOINTS, 12); 
	 
	// Change Data to match example scales which are manually configured // 
	for (int s=0; s<=3; s++) 
	{ 
		for (int p=0; p<=11; p++) 
		{ 
			float f; 
			f =  (p + 1) * 10.0F; 
			PEvsetcellEx(m_hPE, PEP_faXDATA, s, p, &f); 
			 
			switch (s) 
			{ 
			case 0: 
				f = 0.01F + GetRandom(1, 4); 
				break; 
			case 1: 
				f = 400.0F + GetRandom(1, 450); 
				break; 
			case 2: 
				f = 0.01F + GetRandom(1, 25); 
				break; 
			case 3: 
				f = 0.01F + GetRandom(1, 65); 
				break; 
			} 
			PEvsetcellEx(m_hPE, PEP_faYDATA, s, p, &f); 
		} 
	} 
	 
	// Now sub-divide subsets into 4 individual axes // 
	// Each axis with one subset in each // 
	int nArray[4] = {1,1,1,1}; 
	PEvset (m_hPE, PEP_naMULTIAXESSUBSETS, nArray, 4); 
	 
	// Create Overlapped Axes // 
	int nOMA[3] = {1,1,2}; 
	PEvset (m_hPE, PEP_naOVERLAPMULTIAXES, nOMA, 3); 
	 
	// Set Proportions of Axes  // 
	float fMAP[3] = {.2F, .5F, .3F}; 
	PEvset (m_hPE, PEP_faMULTIAXESPROPORTIONS, fMAP, 3); 
	 
	// Set up First axis parameters //   
	PEnset(m_hPE, PEP_nWORKINGAXIS, 0); 
	PEnset(m_hPE, PEP_nMANUALSCALECONTROLY, PEMSC_MINMAX); 
	double dMin = 0.0F; 
	PEvset(m_hPE, PEP_fMANUALMINY, &dMin, 1); 
	double dMax = 5.0F; 
	PEvset(m_hPE, PEP_fMANUALMAXY, &dMax, 1); 
	PEnset(m_hPE, PEP_bMANUALYAXISTICKNLINE, TRUE); 
	double dLine = 2.5F; 
	PEvset(m_hPE, PEP_fMANUALYAXISLINE, &dLine, 1); 
	double dTick = 0.5F; 
	PEvset(m_hPE, PEP_fMANUALYAXISTICK, &dTick, 1); 
	PEnset(m_hPE, PEP_nSHOWTICKMARKY, PESTM_TICKS_HIDE);  
	PEszset(m_hPE, PEP_szYAXISLABEL, "NPSHR (feet)"); 
	PEnset(m_hPE, PEP_nPLOTTINGMETHOD, PEGPM_BAR); 
	 
	// Set up Second axis parameters //   
	PEnset(m_hPE, PEP_nWORKINGAXIS, 1); 
	PEnset(m_hPE, PEP_nRYAXISCOMPARISONSUBSETS, 1); 
	PEnset(m_hPE, PEP_nMANUALSCALECONTROLRY, PEMSC_MINMAX); 
	dMin = 400.0F; 
	PEvset(m_hPE, PEP_fMANUALMINRY, &dMin, 1); 
	dMax = 900.0F; 
	PEvset(m_hPE, PEP_fMANUALMAXRY, &dMax, 1); 
	PEnset(m_hPE, PEP_bMANUALRYAXISTICKNLINE, TRUE); 
	dLine = 100.0F; 
	PEvset(m_hPE, PEP_fMANUALRYAXISLINE, &dLine, 1); 
	dTick = 20.0F; 
	PEvset(m_hPE, PEP_fMANUALRYAXISTICK, &dTick, 1); 
	PEnset(m_hPE, PEP_nSHOWTICKMARKRY, PESTM_TICKS_HIDE);  
	PEszset(m_hPE, PEP_szRYAXISLABEL, "Total Head (feet)"); 
	PEnset(m_hPE, PEP_nPLOTTINGMETHODII, PEGPM_POINTSPLUSSPLINE); 
	 
	// Set up Third axis parameters //   
	PEnset(m_hPE, PEP_nWORKINGAXIS, 2); 
	PEnset(m_hPE, PEP_nMANUALSCALECONTROLY, PEMSC_MINMAX); 
	dMin = 0.0F; 
	PEvset(m_hPE, PEP_fMANUALMINY, &dMin, 1); 
	dMax = 30.0F; 
	PEvset(m_hPE, PEP_fMANUALMAXY, &dMax, 1); 
	PEnset(m_hPE, PEP_bMANUALYAXISTICKNLINE, TRUE); 
	dLine = 10.0F; 
	PEvset(m_hPE, PEP_fMANUALYAXISLINE, &dLine, 1); 
	dTick = 2.0F; 
	PEvset(m_hPE, PEP_fMANUALYAXISTICK, &dTick, 1); 
	PEnset(m_hPE, PEP_nSHOWTICKMARKY, PESTM_TICKS_HIDE);  
	PEszset(m_hPE, PEP_szYAXISLABEL, "Efficiency (%)"); 
	PEnset(m_hPE, PEP_nPLOTTINGMETHOD, PEGPM_POINTSPLUSSPLINE); 
	 
	// Set up Fourth axis parameters //   
	PEnset(m_hPE, PEP_nWORKINGAXIS, 3); 
	PEnset(m_hPE, PEP_nMANUALSCALECONTROLY, PEMSC_MINMAX); 
	dMin = 0.0F; 
	PEvset(m_hPE, PEP_fMANUALMINY, &dMin, 1); 
	dMax = 75.0F; 
	PEvset(m_hPE, PEP_fMANUALMAXY, &dMax, 1); 
	PEnset(m_hPE, PEP_bMANUALYAXISTICKNLINE, TRUE); 
	dLine = 25.0F; 
	PEvset(m_hPE, PEP_fMANUALYAXISLINE, &dLine, 1); 
	dTick = 5.0F; 
	PEvset(m_hPE, PEP_fMANUALYAXISTICK, &dTick, 1); 
	PEnset(m_hPE, PEP_nSHOWTICKMARKY, PESTM_TICKS_HIDE);  
	PEszset(m_hPE, PEP_szYAXISLABEL, "Power(HP)"); 
	PEnset(m_hPE, PEP_nPLOTTINGMETHOD, PEGPM_POINTSPLUSSPLINE); 
	 
	// Done Setting Y Axis Parameters, reset WorkingAxis // 
	PEnset(m_hPE, PEP_nWORKINGAXIS, 0); 
	 
	// Set various other properties // 
	PEnset(m_hPE, PEP_nGRIDLINECONTROL, PEGLC_BOTH); 
	PEnset(m_hPE, PEP_nMULTIAXISSTYLE, PEMAS_GROUP_ALL_AXES); 
	PEnset(m_hPE, PEP_nLEGENDSTYLE, PELS_1_LINE_INSIDE_OVERLAP); 
	 
	PEszset(m_hPE, PEP_szXAXISLABEL, "Flow (gpm)"); 
	 
	PEnset(m_hPE, PEP_nBORDERTYPES, PETAB_SINGLE_LINE); 
	PEnset(m_hPE, PEP_bFIXEDFONTS, TRUE); 
	PEnset(m_hPE, PEP_nFONTSIZE, PEFS_MEDIUM);  
	PEszset(m_hPE, PEP_szMAINTITLE, ""); 
	PEszset(m_hPE, PEP_szSUBTITLE, ""); 
	PEszset(m_hPE, PEP_szSUBTITLEFONT, "Courier New"); 
	 
	float fSize = 1.1F; 
	PEvset(m_hPE, PEP_fFONTSIZEMSCNTL, &fSize, 1); 
	PEvset(m_hPE, PEP_fFONTSIZEMBCNTL, &fSize, 1); 
	 
	 
	PEvsetcell(m_hPE, PEP_szaMULTISUBTITLES, 0, "PUMP PREDICTED PERFORMANCE|Units: US Customary|Date: 06/07/2002"); 
	PEvsetcell(m_hPE, PEP_szaMULTISUBTITLES, 1, "Impeller Diameter (in): Max = 11.875, Rated = 11.72, Min =11.062||"); 
	 
	PEvsetcell(m_hPE, PEP_szaMULTIBOTTOMTITLES, 1, "Customer:  Since fixed length courier font, you can create rows by number of spaces, ||"); 
	PEvsetcell(m_hPE, PEP_szaMULTIBOTTOMTITLES, 0, "Pump Model:  or, v5 has a table annotation feature which could be used to add text here. ||"); 
	 
	PEnset(m_hPE, PEP_bYAXISONRIGHT, TRUE); 
	 
	PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, 0, "NPSHR"); 
	PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, 1, "Head"); 
	PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, 2, "Efficiency"); 
	PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, 3, "Power"); 
	 
	PEnset(m_hPE, PEP_nMULTIAXISSTYLEMENU, PEMC_SHOW); 
	PEnset(m_hPE, PEP_nDATASHADOWS, PEDS_NONE); 
	PEnset(m_hPE, PEP_nALLOWZOOMING, PEAZ_HORZANDVERT); 
	PEnset(m_hPE, PEP_nZOOMSTYLE, PEZS_RO2_NOT); 
	 
	PEnset(m_hPE, PEP_bSIMPLELINELEGEND, TRUE); 
	PEnset(m_hPE, PEP_bSIMPLEPOINTLEGEND, TRUE); 
	 
	DWORD dwArray[4] = { RGB(198,0,0), RGB( 0, 198, 198 ), RGB( 198,198,0 ), RGB( 0,198,0 ) }; 
	PEvset(m_hPE, PEP_dwaSUBSETCOLORS, dwArray, 4); 
	 
	PEnset(m_hPE, PEP_bBITMAPGRADIENTMODE, TRUE); 
	PEnset(m_hPE, PEP_nQUICKSTYLE, PEQS_DARK_NO_BORDER); 
	 
	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); 
	PEnset(m_hPE, PEP_nGRADIENTBARS, 8); 
	PEnset(m_hPE, PEP_nDATASHADOWS, PEDS_SHADOWS); 
	 
} 
 
 
 
 
void CGraphicView::OnBkPie()  
{ 
	if(m_hPE) 
	{ 
		PEdestroy(m_hPE); 
		Invalidate(); 
	} 
	//! Double Click to start and stop Auto Rotation. // 
	//! Click and drag scroll bar thumb tabs to quickly rotate. //  
	//! Right button click to show popup menu. // 
	 
	RECT rect; 
	GetClientRect( &rect ); 
	m_hPE = PEcreate(PECONTROL_3D, WS_VISIBLE, &rect, m_hWnd, 1001); 
	 
	// Non-Surface chart, set PolyMode // 
	PEnset(m_hPE, PEP_nPOLYMODE, PEPM_3DBAR); 
	 
	// Pass Data // 
	double sMin, sMax; 
	long Row, Col, o, s, e, nQ; 
	long nStartRow, nEndRow, nStartCol, nEndCol, nTargetRows, nTargetCols; 
	 
	nStartRow = 216; 
	nEndRow = 230; 
	nTargetRows = nEndRow - nStartRow + 1; 
	 
	nStartCol = 156; 
	nEndCol = 170; 
	nTargetCols = nEndCol - nStartCol + 1; 
	 
	nQ = nTargetRows * nTargetCols; 
	 
	long* pElevData = NULL; 
	float* pMyXData = NULL;     
	float* pMyYData = NULL; 
	float* pMyZData = NULL; 
	 
	char szFile[] = "terrain.bin"; 
	FILE * pFile = NULL; 
	pFile = fopen(szFile, "rb"); 
	 
	if (pFile) 
	{ 
		pElevData = new long[202500]; 
		// Transfer entire data file into memory // 
		size_t cnt; 
		e = 0; 
		for (s = 0; s < 45; s++) 
		{ 
			cnt = fread(&pElevData[e], sizeof(long), 4500, pFile); 
			e += 4500; 
		} 
		fclose(pFile); 
	} 
	else 
	{ 
		MessageBox("Data File [terrain.bin] not found in program directory."); 
		return; 
	} 
	 
	pMyXData = new float[nQ]; 
	pMyYData = new float[nQ]; 
	pMyZData = new float[nQ]; 
	 
	long rowcounter, colcounter; 
	BOOL foundtargetindex = FALSE; 
	rowcounter = 0; 
	colcounter = 0; 
	 
	sMax = -9999999.9F; 
	sMin = 9999999.9F; 
	for (Row=0; Row<450; Row++) 
	{ 
		for (Col=0; Col<450; Col++) 
		{ 
			foundtargetindex = FALSE; 
			 
			if (Row >= nStartRow && Row <= nEndRow)  
			{ 
				if (Col >= nStartCol && Col <= nEndCol) 
				{ 
					foundtargetindex = TRUE; 
					o = (rowcounter * nTargetRows) + colcounter; 
					pMyXData[o] = (float) Col + 1; 
					pMyZData[o] = (float) Row + 1; 
					pMyYData[o] = pElevData[(Row * 450) + Col] * 0.1F; 
				} 
			} 
			if (foundtargetindex)  
				colcounter++; 
		} 
		if (foundtargetindex) 
			rowcounter++; 
	} 
	 
	PEnset(m_hPE, PEP_nSUBSETS, nTargetRows); 
	PEnset(m_hPE, PEP_nPOINTS, nTargetCols); 
	 
	// Perform the actual transfer of data // 
	PEvset(m_hPE, PEP_faXDATA, pMyXData, nQ); 
	PEvset(m_hPE, PEP_faYDATA, pMyYData, nQ); 
	PEvset(m_hPE, PEP_faZDATA, pMyZData, nQ); 
	 
	if (pElevData) 
		delete pElevData; 
	if (pMyXData) 
		delete pMyXData; 
	if (pMyYData) 
		delete pMyYData; 
	if (pMyZData) 
		delete pMyZData; 
	 
	// Set Various Other Properties // 
	PEnset(m_hPE, PEP_bFIXEDFONTS, TRUE); 
	PEnset(m_hPE, PEP_bBITMAPGRADIENTMODE, TRUE); 
	PEnset(m_hPE, PEP_nQUICKSTYLE, PEQS_DARK_SHADOW); 
	 
	DWORD dwColor[] = {RGB(0, 148, 0), RGB(148, 0, 0), RGB(0, 0, 148), 
		RGB(148, 148, 0), RGB(0, 148, 148), 
		RGB(0, 182, 0), RGB(182, 0, 0), RGB(0, 0, 182), 
		RGB(182, 182, 0), RGB(0, 182, 182), 
		RGB(0, 198, 0), RGB(198, 0, 0), RGB(0, 0, 198), 
		RGB(198, 198, 0), RGB(0, 198, 148)  }; 
	PEvset(m_hPE, PEP_dwaSUBSETCOLORS, dwColor, 15); 
	 
	// Set subset labels for z axis** 
	PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, 0, "Row 1"); 
	PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, 1, "Row 2"); 
	PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, 2, "Row 3"); 
	PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, 3, "Row 4"); 
	PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, 4, "Row 5"); 
	PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, 5, "Row 6"); 
	PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, 6, "Row 7"); 
	PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, 7, "Row 8"); 
	PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, 8, "Row 9"); 
	PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, 9, "Row 10"); 
	PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, 10, "Row 11"); 
	PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, 11, "Row 12"); 
	PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, 12, "Row 13"); 
	PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, 13, "Row 14"); 
	PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, 14, "Row 15"); 
	 
	// Set point labels for x axis // 
	PEvsetcell(m_hPE, PEP_szaPOINTLABELS, 0, "Col 1"); 
	PEvsetcell(m_hPE, PEP_szaPOINTLABELS, 1, "Col 2"); 
	PEvsetcell(m_hPE, PEP_szaPOINTLABELS, 2, "Col 3"); 
	PEvsetcell(m_hPE, PEP_szaPOINTLABELS, 3, "Col 4"); 
	PEvsetcell(m_hPE, PEP_szaPOINTLABELS, 4, "Col 5"); 
	PEvsetcell(m_hPE, PEP_szaPOINTLABELS, 5, "Col 6"); 
	PEvsetcell(m_hPE, PEP_szaPOINTLABELS, 6, "Col 7"); 
	PEvsetcell(m_hPE, PEP_szaPOINTLABELS, 7, "Col 8"); 
	PEvsetcell(m_hPE, PEP_szaPOINTLABELS, 8, "Col 9"); 
	PEvsetcell(m_hPE, PEP_szaPOINTLABELS, 9, "Col 10"); 
	PEvsetcell(m_hPE, PEP_szaPOINTLABELS, 10, "Col 11"); 
	PEvsetcell(m_hPE, PEP_szaPOINTLABELS, 11, "Col 12"); 
	PEvsetcell(m_hPE, PEP_szaPOINTLABELS, 12, "Col 13"); 
	PEvsetcell(m_hPE, PEP_szaPOINTLABELS, 13, "Col 14"); 
	PEvsetcell(m_hPE, PEP_szaPOINTLABELS, 14, "Col 15"); 
	 
	// Set Titles // 
	PEszset(m_hPE, PEP_szMAINTITLE, "3D Bar"); 
	PEszset(m_hPE, PEP_szSUBTITLE, ""); 
	 
	// Set camera position // 
	PEnset(m_hPE, PEP_nVIEWINGHEIGHT, 15); 
	PEnset(m_hPE, PEP_nDEGREEOFROTATION, 314); 
	 
	// Set Plotting methods // 
	PEnset(m_hPE, PEP_nPLOTTINGMETHOD, 2);   // ' Shading 
	 
	// Full rotation detail // 
	PEnset(m_hPE, PEP_nROTATIONDETAIL, PERD_FULLDETAIL); 
	 
	// Set small font size // 
	PEnset(m_hPE, PEP_nFONTSIZE, PEFS_SMALL); 
	 
	// Prepare images in memory // 
	PEnset(m_hPE, PEP_bPREPAREIMAGES, TRUE); 
	PEnset(m_hPE, PEP_bCACHEBMP, TRUE); 
	PEnset(m_hPE, PEP_bFOCALRECT, FALSE); 
	PEnset(m_hPE, PEP_bALLOWSTYLEPAGE, FALSE); 
	PEnset(m_hPE, PEP_nROTATIONINCREMENT, PERI_INCBY2); 
	 
	// Add Some Padding on Right and Bottom // 
	PEnset(m_hPE, PEP_nIMAGEADJUSTLEFT, 400); 
	PEnset(m_hPE, PEP_nIMAGEADJUSTRIGHT, 400); 
	PEnset(m_hPE, PEP_nIMAGEADJUSTBOTTOM, 400); 
	 
	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_nFONTSIZE, PEFS_LARGE); 
	PEnset(m_hPE, PEP_dwGRAPHFORECOLOR, RGB(192,192,192)); 
	 
} 
 
 
 
void CGraphicView::OnButton32781()  
{  
	if(m_hPE) 
	{ 
		PEdestroy(m_hPE); 
		Invalidate(); 
	} 
	//! Double Click to start and stop Auto Rotation. // 
	//! Click and drag scroll bar thumb tabs to quickly rotate. //  
	//! Right button click to show popup menu. // 
	 
	RECT rect; 
	GetClientRect( &rect ); 
	m_hPE = PEcreate(PECONTROL_3D, WS_VISIBLE, &rect, m_hWnd, 1001); 
	 
	// Non-Surface chart, set PolyMode // 
	PEnset(m_hPE, PEP_nPOLYMODE, PEPM_SCATTER); 
	 
	// Set the amount of data // 
	PEnset(m_hPE, PEP_nSUBSETS, 10); 
	PEnset(m_hPE, PEP_nPOINTS, 50); 
	 
	// Pass data, First two subsets // 
	float f, f2; 
	for (int s=0; s<=1; s++) 
	{ 
		for (int p=0; p<=49; p++) 
		{ 
			f2 = 5.0F * (float)cos(p * .24); 
			PEvsetcellEx(m_hPE, PEP_faXDATA, s, p, &f2); 
			 
			if (s == 0) 
				f = (35.0F * (float)cos(p * 0.22F)) + (10.0F * (float)sin((s * .1F) * .94F)); 
			else 
				f = (35.0F * (float)cos(p * 0.08F)) + (10.0F * (float)cos((s * .25F) * .6F)); 
			PEvsetcellEx(m_hPE, PEP_faYDATA, s, p, &f); 
			 
			f = 5.0F * (float)(sin(p * .08F)); 
			PEvsetcellEx(m_hPE, PEP_faZDATA, s, p, &f); 
		} 
	} 
	 
	// Pass more data, Second two subsets // 
	for (s=0; s<=1; s++) 
	{ 
		for (int p=0; p<=49; p++) 
		{ 
			f2 = 5.0F * (float)cos(p * .14); 
			f2 += 20; 
			PEvsetcellEx(m_hPE, PEP_faXDATA, s + 2, p, &f2); 
			 
			if (s == 0) 
				f = (35.0F * (float)cos(p * 0.2F)) + (10.0F * (float)sin((s * .1F) * .74F)); 
			else 
				f = (35.0F * (float)cos(p * 0.1F)) + (10.0F * (float)cos((s * .25F) * .74F)); 
			f += 40; 
			PEvsetcellEx(m_hPE, PEP_faYDATA, s + 2, p, &f); 
			 
			f = 5.0F * (float)(sin(p * .16F)); 
			f += 20; 
			PEvsetcellEx(m_hPE, PEP_faZDATA, s + 2, p, &f); 
		} 
	} 
	 
	// Pass more data, Third two subsets // 
	for (s=0; s<=1; s++) 
	{ 
		for (int p=0; p<=49; p++) 
		{ 
			f2 = 5.0F * (float)cos(p * .07); 
			f2 -= 20; 
			PEvsetcellEx(m_hPE, PEP_faXDATA, s + 4, p, &f2); 
			 
			if (s == 0) 
				f = (35.0F * (float)cos(p * 0.08F)) + (10.0F * (float)sin((s * .07F) * .64F)); 
			else 
				f = (35.0F * (float)cos(p * 0.2F)) + (10.0F * (float)cos((s * .15F) * 1.94F)); 
			f += 40; 
			PEvsetcellEx(m_hPE, PEP_faYDATA, s + 4, p, &f); 
			 
			f = 5.0F * (float)(sin(p * .09F)); 
			f += 20; 
			PEvsetcellEx(m_hPE, PEP_faZDATA, s + 4, p, &f); 
		} 
	} 
	 
	// Pass more data, Fourth two subsets // 
	for (s=0; s<=1; s++) 
	{ 
		for (int p=0; p<=49; p++) 
		{ 
			f2 = 5.0F * (float)cos(p * .12); 
			f2 -= 20; 
			PEvsetcellEx(m_hPE, PEP_faXDATA, s + 6, p, &f2); 
			 
			if (s == 0) 
				f = (35.0F * (float)cos(p * 0.3F)) + (10.0F * (float)sin((s * .08F) * 1.74F)); 
			else 
				f = (35.0F * (float)cos(p * 0.2F)) + (10.0F * (float)cos((s * .75F) * .774F)); 
			f -= 40; 
			PEvsetcellEx(m_hPE, PEP_faYDATA, s + 6, p, &f); 
			 
			f = 5.0F * (float)(sin(p * .36F)); 
			f -= 20; 
			PEvsetcellEx(m_hPE, PEP_faZDATA, s + 6, p, &f); 
		} 
	} 
	 
	// Pass more data, Fifth two subsets // 
	for (s=0; s<=1; s++) 
	{ 
		for (int p=0; p<=49; p++) 
		{ 
			f2 = 5.0F * (float)cos(p * .14); 
			f2 += 20; 
			PEvsetcellEx(m_hPE, PEP_faXDATA, s + 8, p, &f2); 
			 
			if (s == 0) 
				f = (25.0F * (float)cos(p * 0.1F)) + (10.0F * (float)sin((s * .02F) * 3.74F)); 
			else 
				f = (55.0F * (float)cos(p * 0.2F)) + (10.0F * (float)cos((s * .05F) * 5.74F)); 
			f += 40; 
			PEvsetcellEx(m_hPE, PEP_faYDATA, s + 8, p, &f); 
			 
			f = 5.0F * (float)(sin(p * .16F)); 
			f -= 20; 
			PEvsetcellEx(m_hPE, PEP_faZDATA, s + 8, p, &f); 
		} 
	} 
	 
	// Set Various Other Properties // 
	PEnset(m_hPE, PEP_bBITMAPGRADIENTMODE, FALSE); 
	PEnset(m_hPE, PEP_nQUICKSTYLE, PEQS_DARK_INSET); 
	 
	DWORD dwColor[] = {RGB(198, 198, 0), RGB(0, 198, 198), RGB(0, 198, 0), RGB(198, 0, 0), RGB(0, 0, 198),  
		RGB(192,192,192), RGB(198, 0, 198), RGB(200, 198, 150), RGB(200, 200, 140), RGB(150, 0, 198)}; 
	PEvset(m_hPE, PEP_dwaSUBSETCOLORS, dwColor, 10); 
	 
	int nPTypes[] = {PEPT_PLUS, PEPT_PLUS, PEPT_PLUS, PEPT_PLUS, PEPT_PLUS, PEPT_PLUS, PEPT_PLUS, PEPT_PLUS, PEPT_PLUS, PEPT_PLUS}; 
	PEvset(m_hPE, PEP_naSUBSETPOINTTYPES, nPTypes, 10); 
	 
	// Set subset labels and titles // 
	PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, 0, "Data 1"); 
	PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, 1, "Data 2"); 
	PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, 2, "Data 3"); 
	PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, 3, "Data 4"); 
	PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, 4, "Data 5"); 
	PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, 5, "Data 6"); 
	PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, 6, "Data 7"); 
	PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, 7, "Data 8"); 
	PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, 8, "Data 9"); 
	PEvsetcell(m_hPE, PEP_szaSUBSETLABELS, 9, "Data 10"); 
	 
	PEszset(m_hPE, PEP_szMAINTITLE, "3D Scatter"); 
	PEszset(m_hPE, PEP_szSUBTITLE, ""); 
	 
	// Set camera position // 
	PEnset(m_hPE, PEP_nVIEWINGHEIGHT, 15); 
	PEnset(m_hPE, PEP_nDEGREEOFROTATION, 145); 
	 
	// Set Plotting methods // 
	PEnset(m_hPE, PEP_nPLOTTINGMETHOD, 0);   // ' Points 
	 
	// Set small font size // 
	PEnset(m_hPE, PEP_nFONTSIZE, PEFS_MEDIUM); 
	PEnset(m_hPE, PEP_bFIXEDFONTS, TRUE); 
	 
	// Set legend location // 
	PEnset(m_hPE, PEP_nLEGENDLOCATION, PELL_LEFT); 
	 
	// Prepare images in memory // 
	PEnset(m_hPE, PEP_bPREPAREIMAGES, TRUE); 
	PEnset(m_hPE, PEP_bFOCALRECT, FALSE); 
	PEnset(m_hPE, PEP_bCACHEBMP, TRUE); 
	 
	PEnset(m_hPE, PEP_nROTATIONDETAIL, PERD_FULLDETAIL); 
	PEnset(m_hPE, PEP_nROTATIONSPEED, 50); 
	PEnset(m_hPE, PEP_nROTATIONINCREMENT, PERI_INCBY1); 
	PEnset(m_hPE, PEP_bAUTOROTATION, TRUE); 
	PEnset(m_hPE, PEP_bSHOWLEGEND, FALSE); 
	 
	// Add Some Padding around image // 
	PEnset(m_hPE, PEP_nIMAGEADJUSTLEFT, 400); 
	PEnset(m_hPE, PEP_nIMAGEADJUSTRIGHT, 400); 
	PEnset(m_hPE, PEP_nIMAGEADJUSTBOTTOM, 400); 
	 
	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_nFONTSIZE, PEFS_LARGE); 
	PEnset(m_hPE, PEP_dwGRAPHFORECOLOR, RGB(192,192,192)); 
	 
} 
 
 
void CGraphicView::OnSize(UINT nType, int cx, int cy)  
{ 
	CView::OnSize(nType, cx, cy); 
	if(m_hPE) 
		PEdestroy(m_hPE); 
	CreateSimpleGraph();  
	// TODO: Add your message handler code here 
	 
} 
 
void CGraphicView::OnDrawNew()  
{  
	if(m_hPE) 
		PEdestroy(m_hPE); 
	// This example builds upon the basic CreateSimpleGraph '000' example chart // 
	CreateSimpleGraph(); 
	 
	int nHatchType[4]; 
	nHatchType[0] = PEHS_BDIAGONAL; 
	nHatchType[1] = PEHS_CROSS; 
	nHatchType[2] = PEHS_DIAGCROSS; 
	nHatchType[3] = PEHS_FDIAGONAL; 
	PEvset(m_hPE, PEP_naSUBSETHATCH, nHatchType, 4); 
	 
	// Set Other Various Properties /// 
	PEnset(m_hPE, PEP_bBITMAPGRADIENTMODE, TRUE); 
	PEnset(m_hPE, PEP_nQUICKSTYLE, PEQS_MEDIUM_INSET); 
	 
	// Enable Stacked type charts // 
	PEnset(m_hPE, PEP_bNOSTACKEDDATA, FALSE); 
	 
	// Set plotting method // 
	PEnset(m_hPE, PEP_nPLOTTINGMETHOD, PEGPM_BARSTACKED); 
	PEnset(m_hPE, PEP_dwHATCHBACKCOLOR, RGB(100,100,100)); 
	PEnset(m_hPE, PEP_bDATASHADOWS, PEDS_SHADOWS);  
	 
	// Add a table // 
	PEnset(m_hPE, PEP_nGRAPHPLUSTABLE, PEGPT_BOTH); 
	PEnset(m_hPE, PEP_nDATAPRECISION, 0); 
} 
 
 
void CGraphicView::OnDrawSile()  
{  
	if(m_hPE) 
		PEdestroy(m_hPE); 
	//! Cross-Hair inside chart is a cursor giving a datapoint the focus // 
	//! Use arrow keys or mouse to move cursor to a new location // 
	//! You must click the control to give it the focus before key strokes will work. // 
	//! Right and Left arrow keys move cursor up and down points // 
	//! Up and Down arrow keys move cursor up and down subsets // 
	 
	// This example builds upon the basic CreateSimpleSGraph '100' example chart // 
	CreateSimpleSGraph(); 
	 
	// Set up cursor // 
	PEnset(m_hPE, PEP_nCURSORMODE, PECM_DATACROSS); 
	 
	// Help see data points // 
	PEnset(m_hPE, PEP_bMARKDATAPOINTS, TRUE); 
	 
	// This will allow you to move cursor by clicking data point // 
	PEnset(m_hPE, PEP_bMOUSECURSORCONTROL, TRUE); 
	PEnset(m_hPE, PEP_bALLOWDATAHOTSPOTS, TRUE); 
	 
	// Cursor prompting in top left corner // 
	PEnset(m_hPE, PEP_bCURSORPROMPTTRACKING, TRUE); 
	PEnset(m_hPE, PEP_nCURSORPROMPTSTYLE, PECPS_XYVALUES); 
	PEnset(m_hPE, PEP_nCURSORPROMPTLOCATION, PECPL_TOP_RIGHT); 
	 
	// Disable Zooming // 
	PEnset(m_hPE, PEP_nALLOWZOOMING, PEAZ_NONE); 
	 
	// Other possible values for cursor mode are below, // 
	// PECM_NOCURSOR = 0 
	// PECM_POINT = 1 
	// PECM_DATACROSS = 2 
	// PECM_DATASQUARE = 3 
	// PECM_FLOATINGY = 4 
	// PECM_FLOATINGXY = 5 
	 
	// Uncomment to start cursor at different location //	 
	// NOTE: You must reinitialize before setting cursor location // 
	// PEreinitialize(m_hPE); 
	// PEresetimage(m_hPE, 0, 0); 
	// PEnset(m_hPE, PEP_nCURSORSUBSET, 0); 
	// PEnset(m_hPE, PEP_nCURSORPOINT, 2); 
	 
	//////////////////////////////////////////////////////////////////////// 
	// Look in OnCommand handler to see how to respond to cursor movement // 
	//////////////////////////////////////////////////////////////////////// 
	/* 
	 
	  else if ((m_nLastSelection == 105) && (HIWORD(wp) == PEWN_CURSORMOVE)) 
	  { 
	  int nSubset, nPoint; 
	  float xvalue, yvalue; 
	  char buffer[64]; 
	   
		nSubset = PEnget(m_hPE, PEP_nCURSORSUBSET); 
		nPoint = PEnget(m_hPE, PEP_nCURSORPOINT); 
		 
		  PEvgetcellEx(m_hPE, PEP_faXDATA, nSubset, nPoint, &xvalue); 
		  PEvgetcellEx(m_hPE, PEP_faYDATA, nSubset, nPoint, &yvalue); 
		   
			sprintf(buffer, "Cursor at %d,%d=(%.2f, %.2f)", nSubset, nPoint, xvalue, yvalue); 
			 
			  CWnd* pParent = GetParent()->GetParent(); 
			  if (pParent) {pParent->SetWindowText(buffer);} 
			   
				pParent = AfxGetMainWnd(); 
				if (pParent) {pParent->SetWindowText("PEWN_CURSORMOVE");} 
				 
				  return TRUE; 
				  } 
	*/ 
	 
	 
} 
 
 
void CGraphicView::CreateSimpleSGraph() 
{ 
	 
	if(m_hPE) 
		PEdestroy(m_hPE); 
	 
	m_Real=FALSE; 
	m_canReal=FALSE; 
	//! 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 scientific graph object. // 
	// Scientific Graph's contain both YData and XData and thus data 
	// is not plotted equally spaced as the graph object does. 
	 
	RECT rect; 
	GetClientRect( &rect ); 
	m_hPE = PEcreate(PECONTROL_SGRAPH, WS_VISIBLE, &rect, m_hWnd, 1001); 
	if( m_hPE ) 
	{ 
		float fY; 
		float fX; 
		 
		// Set number of Subsets and Points // 
		PEnset(m_hPE, PEP_nSUBSETS, 4);	 
		PEnset(m_hPE, PEP_nPOINTS, 12);	 
		 
		for( int s=0; s<=3; s++ ) 
		{ 
			for( int p=0; p<=11; p++ ) 
			{										   
				fX = ((float) (p+1)) * 100.0F; 
				PEvsetcellEx (m_hPE, PEP_faXDATA, s, p, &fX); 
				fY = ((float) (p+1) * 1.0F) + GetRandom(1, 250); 
				PEvsetcellEx (m_hPE, PEP_faYDATA, s, p, &fY); 
			} 
		} 
		 
		// Set DataShadows to show shadows 
		PEnset(m_hPE, PEP_nDATASHADOWS, PEDS_SHADOWS); 
		 
		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_bPREPAREIMAGES, TRUE); 
		PEnset(m_hPE, PEP_bCACHEBMP, TRUE); 
		PEnset(m_hPE, PEP_nPLOTTINGMETHOD, PEGPM_POINTSPLUSSPLINE); 
		PEnset(m_hPE, PEP_nGRIDLINECONTROL, PEGLC_NONE); 
		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, "广州" ); 
		 
		// 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 }; 
		PEvset(m_hPE, PEP_naSUBSETLINETYPES, nLineTypes, 4); 
		 
		// subset point types 
		int nPointTypes[] = { PEPT_DOTSOLID, PEPT_UPTRIANGLESOLID, PEPT_SQUARESOLID, PEPT_DOWNTRIANGLESOLID }; 
		PEvset(m_hPE, PEP_naSUBSETPOINTTYPES, nPointTypes, 4); 
		 
		// Version 4.0 Features // 
		PEnset(m_hPE, PEP_bFIXEDFONTS, TRUE); 
		PEnset(m_hPE, PEP_bSIMPLEPOINTLEGEND, TRUE); 
		PEnset(m_hPE, PEP_bSIMPLELINELEGEND, TRUE); 
		PEnset(m_hPE, PEP_nLEGENDSTYLE, PELS_1_LINE); 
		PEnset(m_hPE, PEP_nMULTIAXISSTYLE, PEMAS_SEPARATE_AXES); 
		 
		// Set Various Other Properties // 
		PEnset(m_hPE, PEP_bBITMAPGRADIENTMODE, TRUE); 
		PEnset(m_hPE, PEP_nQUICKSTYLE, PEQS_MEDIUM_NO_BORDER); 
		 
		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); 
		PEnset(m_hPE, PEP_bSCROLLINGHORZZOOM, TRUE); 
		 
		 
	} 
} 
 
 
 
void CGraphicView::OnReal()  
{ 
	KillTimer(1); 
	if(m_hPE) 
		PEdestroy(m_hPE); 
	 
	m_canReal=TRUE; 
	m_Real=TRUE; 
	 
	//! Chart holds 2000 points.  Data is fed into 
	//! data arrays at current data index.  Once 2000 
	//! points have been passed, 250 are truncated as 
	//! data is shifted to make room for 250 more data 
	//! points. 
	 
	//! Depending upon ZoomMode property, this example with 
	//! either show most current 3 minutes or all data in 
	//! object. 
	 
	 
	RECT rect; 
	GetClientRect( &rect ); 
	 
	// Construct Object // 
	m_hPE = PEcreate(PECONTROL_SGRAPH, WS_CHILD|WS_VISIBLE, &rect, m_hWnd, 1001); 
	 
	PEnset(m_hPE, PEP_nSUBSETS, 3); 
	PEnset(m_hPE, PEP_nPOINTS, 2000); 
	 
	PEnset(m_hPE, PEP_nDATETIMEMODE, PEDTM_VB);	// Date/Time Mode 
	PEnset(m_hPE, PEP_bUSINGXDATAII, TRUE);     // Using Double Precision XDataII 
	 
	// Some functional attributes            // 1440 is minutes in a day 
	ZoomInterval = (3.0F / 1440.0F);         // 3 minute scale zoom interval 
	ZoomSmallInterval = (0.5F / 1440.0F);    // 30 second scale adjustment 
	 
	// Determine current date and time in VB's format // 
	CTime t = CTime::GetCurrentTime(); 
	TM petm; 
	petm.nDay = t.GetDay(); 
	petm.nMonth = t.GetMonth(); 
	petm.nYear = t.GetYear() - 1900; 
	petm.nHour = t.GetHour(); 
	petm.nMinute = t.GetMinute(); 
	petm.nSecond = t.GetSecond(); 
	PEcreateserialdate(&StartTime, &petm, PEDTM_VB); 
	 
	// Extents to show all data points  
	double manmaxx; 
	PEnset(m_hPE, PEP_nMANUALSCALECONTROLX, PEMSC_MINMAX); 
	PEvset(m_hPE, PEP_fMANUALMINX, &StartTime, 1); 
	manmaxx = StartTime + ZoomInterval; 
	PEvset(m_hPE, PEP_fMANUALMAXX, &manmaxx, 1); 
	 
	PEnset(m_hPE, PEP_nMANUALSCALECONTROLY, PEMSC_MINMAX); 
	double d = 1.0F; 
	PEvset(m_hPE, PEP_fMANUALMINY, &d, 1); 
	d = 100.0F; 
	PEvset(m_hPE, PEP_fMANUALMAXY, &d, 1); 
	 
	// Set Zoomed partial Range of X Scale // 
	ZoomStart = StartTime; 
	ZoomEnd = ZoomStart + ZoomInterval; 
	 
	PEvset(m_hPE, PEP_fZOOMMINX, &ZoomStart, 1); 
	PEvset(m_hPE, PEP_fZOOMMAXX, &ZoomEnd, 1); 
	d = 1.0F; 
	PEvset(m_hPE, PEP_fZOOMMINY, &d, 1); 
	d = 100.0F; 
	PEvset(m_hPE, PEP_fZOOMMAXY, &d, 1); 
	 
	PEnset(m_hPE, PEP_bZOOMMODE, TRUE); 
	// If ZoomMode is True, you will see 3 minutes of data // 
	// If ZoomMode is False, you will see all data in object // 
	 
	// Clear out default data ' 
	// No need to clear out XData since using XDataII ' 
	float f = 0.0F; 
	PEvsetcellEx(m_hPE, PEP_faYDATA, 0, 0, &f); 
	PEvsetcellEx(m_hPE, PEP_faYDATA, 0, 1, &f); 
	PEvsetcellEx(m_hPE, PEP_faYDATA, 0, 2, &f); 
	PEvsetcellEx(m_hPE, PEP_faYDATA, 0, 3, &f); 
	 
	PEvsetcellEx(m_hPE, PEP_faYDATA, 1, 0, &f); 
	PEvsetcellEx(m_hPE, PEP_faYDATA, 1, 1, &f); 
	PEvsetcellEx(m_hPE, PEP_faYDATA, 1, 2, &f); 
	PEvsetcellEx(m_hPE, PEP_faYDATA, 1, 3, &f); 
	 
	PEvsetcellEx(m_hPE, PEP_faYDATA, 2, 0, &f); 
	PEvsetcellEx(m_hPE, PEP_faYDATA, 2, 1, &f); 
	PEvsetcellEx(m_hPE, PEP_faYDATA, 2, 2, &f); 
	PEvsetcellEx(m_hPE, PEP_faYDATA, 2, 3, &f); 
	 
	// Show Annotations // 
	PEnset(m_hPE, PEP_bSHOWANNOTATIONS, TRUE); 
	 
	// Set Various Other Properties /// 
	PEnset(m_hPE, PEP_bBITMAPGRADIENTMODE, TRUE); 
	PEnset(m_hPE, PEP_nQUICKSTYLE, PEQS_DARK_INSET); 
	 
	int nTmpStyle; 
	nTmpStyle = PELT_THINSOLID; 
	PEvsetcell(m_hPE, PEP_naSUBSETLINETYPES, 0, &nTmpStyle);  
	PEvsetcell(m_hPE, PEP_naSUBSETLINETYPES, 1, &nTmpStyle);  
	PEvsetcell(m_hPE, PEP_naSUBSETLINETYPES, 2, &nTmpStyle); 
	// PEvset(m_hPE, PEP_naSUBSETLINETYPES, PELT_THINSOLID, 0); 
	 
	char szSubsets[] = "电流\t电压\t频率\t"; 
	PEvset (m_hPE, PEP_szaSUBSETLABELS, szSubsets, 3); 
	 
	PEszset(m_hPE, PEP_szMAINTITLE, "工业用实时曲线"); 
	PEszset(m_hPE, PEP_szSUBTITLE, "编程设计实现-戚高"); 
	PEnset(m_hPE, PEP_bNORANDOMPOINTSTOEXPORT, TRUE); 
	PEnset(m_hPE, PEP_bFOCALRECT, FALSE); 
	PEnset(m_hPE, PEP_bALLOWBAR, FALSE); 
	PEnset(m_hPE, PEP_bALLOWPOPUP, FALSE); 
	PEnset(m_hPE, PEP_bPREPAREIMAGES, TRUE); 
	PEnset(m_hPE, PEP_bCACHEBMP, TRUE); 
	PEnset(m_hPE, PEP_bFIXEDFONTS, TRUE); 
	 
	DWORD col = RGB(0, 198, 198); 
	PEvsetcell(m_hPE, PEP_dwaSUBSETCOLORS, 0, &col);  
	 
	col = RGB(0,198,0); 
	PEvsetcell(m_hPE, PEP_dwaSUBSETCOLORS, 1, &col); 
	 
	col = RGB(255,0,0); 
	PEvsetcell(m_hPE, PEP_dwaSUBSETCOLORS, 2, &col); 
	 
	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); 
	 
	PEreinitialize(m_hPE); 
	PEresetimage(m_hPE, 0, 0); 
	::InvalidateRect(m_hPE, NULL, FALSE); 
	 
	// Initialize Counters and Timer // 
	m_nRealTimeCounter = 1; 
	m_nSinCounter = 1; 
	SetTimer( 2, 250, NULL );  
} 
 
 
 
void CGraphicView::OnDrawgraph()  
{   
	if(m_hPE) 
	{ 
		PEdestroy(m_hPE); 
		Invalidate(); 
	} 
	m_Real=TRUE; 
	m_canReal=TRUE; 
   //! Chart fills 100 points but x axis is initially 
   //! manually scaled.  Once 100 point have been passed, 
   //! the chart switches to autoscaling the x axis. 
 
   RECT rect; 
   GetClientRect( &rect ); 
 
   // Construct Object // 
   m_hPE = PEcreate(PECONTROL_SGRAPH, WS_VISIBLE, &rect, m_hWnd, 1001); 
 
   PEnset(m_hPE, PEP_nSUBSETS, 1); 
   PEnset(m_hPE, PEP_nPOINTS, 100); 
 
   // Set Manual Y scale // 
   PEnset(m_hPE, PEP_nMANUALSCALECONTROLY, PEMSC_MINMAX); 
   double arg = 1.0F; 
   PEvset(m_hPE, PEP_fMANUALMINY, &arg, 1); 
   arg = 100.0F; 
   PEvset(m_hPE, PEP_fMANUALMAXY, &arg, 1); 
 
   // Set Manual X scale // 
   PEnset(m_hPE, PEP_nMANUALSCALECONTROLX, PEMSC_MINMAX); 
   arg = 1.0F; 
   PEvset(m_hPE, PEP_fMANUALMINX, &arg, 1); 
   arg = 100; 
   PEvset(m_hPE, PEP_fMANUALMAXX, &arg, 1); 
 
   // Clear out default data // 
   float val = 0; 
   PEvsetcellEx(m_hPE, PEP_faXDATA, 0, 0, &val); 
   PEvsetcellEx(m_hPE, PEP_faXDATA, 0, 1, &val); 
   PEvsetcellEx(m_hPE, PEP_faXDATA, 0, 2, &val); 
   PEvsetcellEx(m_hPE, PEP_faXDATA, 0, 3, &val); 
 
   PEvsetcellEx(m_hPE, PEP_faYDATA, 0, 0, &val); 
   PEvsetcellEx(m_hPE, PEP_faYDATA, 0, 1, &val); 
   PEvsetcellEx(m_hPE, PEP_faYDATA, 0, 2, &val); 
   PEvsetcellEx(m_hPE, PEP_faYDATA, 0, 3, &val); 
 
   PEvsetcellEx(m_hPE, PEP_faXDATA, 1, 0, &val); 
   PEvsetcellEx(m_hPE, PEP_faXDATA, 1, 1, &val); 
   PEvsetcellEx(m_hPE, PEP_faXDATA, 1, 2, &val); 
   PEvsetcellEx(m_hPE, PEP_faXDATA, 1, 3, &val); 
 
   PEvsetcellEx(m_hPE, PEP_faYDATA, 1, 0, &val); 
   PEvsetcellEx(m_hPE, PEP_faYDATA, 1, 1, &val); 
   PEvsetcellEx(m_hPE, PEP_faYDATA, 1, 2, &val); 
   PEvsetcellEx(m_hPE, PEP_faYDATA, 1, 3, &val); 
 
   PEvsetcellEx(m_hPE, PEP_faXDATA, 2, 0, &val); 
   PEvsetcellEx(m_hPE, PEP_faXDATA, 2, 1, &val); 
   PEvsetcellEx(m_hPE, PEP_faXDATA, 2, 2, &val); 
   PEvsetcellEx(m_hPE, PEP_faXDATA, 2, 3, &val); 
 
   PEvsetcellEx(m_hPE, PEP_faYDATA, 2, 0, &val); 
   PEvsetcellEx(m_hPE, PEP_faYDATA, 2, 1, &val); 
   PEvsetcellEx(m_hPE, PEP_faYDATA, 2, 2, &val); 
   PEvsetcellEx(m_hPE, PEP_faYDATA, 2, 3, &val); 
 
   int nTmpStyle; 
   nTmpStyle = PELT_THINSOLID; 
   PEvsetcell(m_hPE, PEP_naSUBSETLINETYPES, 0, &nTmpStyle);  
   PEvsetcell(m_hPE, PEP_naSUBSETLINETYPES, 1, &nTmpStyle);  
   PEvsetcell(m_hPE, PEP_naSUBSETLINETYPES, 2, &nTmpStyle); 
   //	PEvset(m_hPE, PEP_naSUBSETLINETYPES, PELT_THINSOLID, 0); 
    
   char szSubsets[] = "电流\t电压\t频率\t"; 
   PEvset (m_hPE, PEP_szaSUBSETLABELS, szSubsets, 3); 
    
   // Set Various Other Properties /// 
   PEnset(m_hPE, PEP_bBITMAPGRADIENTMODE, TRUE); 
   PEnset(m_hPE, PEP_nQUICKSTYLE, PEQS_MEDIUM_INSET); 
    
   PEszset(m_hPE, PEP_szMAINTITLE, "工业用实时曲线程序"); 
    
   PEszset(m_hPE, PEP_szSUBTITLE, "编程设计实现-戚高"); 
   PEnset(m_hPE, PEP_bNORANDOMPOINTSTOEXPORT, TRUE); 
   PEnset(m_hPE, PEP_bFOCALRECT, FALSE); 
   PEnset(m_hPE, PEP_bALLOWBAR, FALSE); 
   PEnset(m_hPE, PEP_bALLOWPOPUP, FALSE); 
   PEnset(m_hPE, PEP_bPREPAREIMAGES, TRUE); 
   PEnset(m_hPE, PEP_bCACHEBMP, TRUE); 
   PEnset(m_hPE, PEP_bFIXEDFONTS, TRUE); 
 
   DWORD col = RGB(255, 0, 0); 
   PEvsetcell(m_hPE, PEP_dwaSUBSETCOLORS, 0, &col);  
    
   col = RGB(0,198,0); 
   PEvsetcell(m_hPE, PEP_dwaSUBSETCOLORS, 1, &col); 
    
   col = RGB(255,0,0); 
   PEvsetcell(m_hPE, PEP_dwaSUBSETCOLORS, 2, &col); 
    
   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); 
 
   PEreinitialize(m_hPE); 
   PEresetimage(m_hPE, 0, 0); 
 
   // Initialize Counters and Timer  
   m_nRealTimeCounter = 1; 
   m_nSinCounter = 1; 
   SetTimer( 1, 100, NULL ); 
  
}