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

📄 graphicview.cpp

📁 一个非常完美的工业曲线显示控件。可供学习研究!
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	}
	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, &lt);
				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;

⌨️ 快捷键说明

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