📄 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();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -