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

📄 graphisc.cpp

📁 一个很好的虚拟示波器!可一直接运行!他通过串口采集信号与系统单片机上的数据
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	    SetCursor(m_hCursor);
	}	
	if(m_bLbuttonFlage2)
	{
		this->m_nonuispointS2.x = m_myPoint.x - 5;
		this->m_nonuispointE2.x = m_myPoint.x + 5;
		LoadCur(IDC_CURSOR2);       
	    SetCursor(m_hCursor);
	}
	if (m_bLbuttonFlage3)
	{
		this->m_nonuispointYS1.y = m_myPoint.y -5;
		this->m_nonuispointYE1.y = m_myPoint.y +5;
		LoadCur(IDC_CURSOR2);       
    	SetCursor(m_hCursor);
	}
	if (m_bLbuttonFlage4)
	{
		this->m_nonuispointYS2.y = m_myPoint.y -5;
		this->m_nonuispointYE2.y = m_myPoint.y +5;
		LoadCur(IDC_CURSOR2);       
		SetCursor(m_hCursor);
	}
	if (((IsINWave(point)==1 || IsINWave(point)==2) && theApp.m_bnoniusx)
		|| ((IsINWave(point)==3 || IsINWave(point)==4) && theApp.m_bnoniusy))
	{
		LoadCur(IDC_CURSOR2);       
		SetCursor(m_hCursor);
	}
			
}            
/**************************************************************
//画视图取背景
***************************************************************/
void CGraphisc::TextShow(CDC *pDC,CPoint PointS, CPoint PointE)
{	
	pOldBrush1 = pDC->SelectObject(pBrush1);
	pDC->Rectangle(PointS.x,PointS.y,PointE.x,PointE.y);
	pDC->SelectObject(pOldBrush);
}

void CGraphisc::ChangCDT(CoordinateRange CdtRange)
{
	this->CdtRange = CdtRange;	
}


void CGraphisc::DrawCustomFuction(CDC *pDC)
{	

}

// 计算CH1和CH2通道的的各种数据
void CGraphisc::ComputeValueCH1()
{
	int m = 0;
	int i = 0;
	int j = 0;
	float m_mMax1 = 0.0f;
	float m_mMin1 = 0.0f;
	float m_mMax2 = 0.0f;
	float m_mMin2 = 0.0f;
	float m_nAverage1 = 0.0f;
	float m_nAverage2 = 0.0f;

	float ValLeftDat[1000];
	float ValRightDat[1000];

	memset(ValLeftDat,0,sizeof(ValLeftDat));
	memset(ValRightDat,0,sizeof(ValRightDat));
	
    // 得到一波数据中的左通道和右的数据
	for (i=0; i<1000; i++)
	{
		j = 4 * i + 1;
		ValLeftDat[i] = ((float)(theApp.m_aryReceDat[j])*0.256);
		ValLeftDat[i] = (ValLeftDat[i]*1000)+(float)(theApp.m_aryReceDat[j+1]);
		ValLeftDat[i] = ValLeftDat[i]/65536.0 * 2.42 ;

		ValRightDat[i] = ((float)(theApp.m_aryReceDat[j+2])*0.256);
		ValRightDat[i] = (ValRightDat[i]*1000)+(float)(theApp.m_aryReceDat[j+3]);
		ValRightDat[i] = ValRightDat[i]/65536.0 * 2.42 ;
	}
	
	
	for (i=0;i<MY_POINT;i++)
	{
		ValLeftDat[i] = 82 * (1.24 - ValLeftDat[i]);
		ValRightDat[i] = 82 * (1.24 - ValRightDat[i]);
		
		// 得到CH1的最大和最小值
		if (ValLeftDat[i]>m_mMax1)
		{
			m_mMax1 = ValLeftDat[i];
		}
		if (ValLeftDat[i]<m_mMin1)
		{
			m_mMin1 = ValLeftDat[i];
		}

		// 得到CH2的最大和最小值
		if (ValRightDat[i]>m_mMax2)
		{
			m_mMax2 = ValRightDat[i];
		}
		if (ValRightDat[i]<m_mMin2)
		{
			m_mMin2 = ValRightDat[i];
		}

		// 得到CH1和CH2的值的总和
		m_nAverage1 += ValLeftDat[i];
		m_nAverage2 += ValRightDat[i];
	}

	for (i=0; i<MY_POINT; i++)
	{
		// 计算出每个通道画图的点(Y坐标)
		if (theApp.m_strModeApp == "CH1+CH2")
		{
			ValLeftDat[i] = (ValLeftDat[i] + ValRightDat[i]) * (5.0/theApp.m_fVoleteVal1)
				+ (EndPoint.y + StartPoint.y)/2;
			theApp.m_aryLeftDat[i] = (int)ValLeftDat[i];
			pPointArrayL[i].y = theApp.m_aryLeftDat[i];
		}
		else if (theApp.m_strModeApp == "CH1  CH2")
		{
			ValLeftDat[i] = ValLeftDat[i] * (5.0/theApp.m_fVoleteVal1)
				+ StartPoint.y + (EndPoint.y - StartPoint.y)/4;
			theApp.m_aryLeftDat[i] = (int)ValLeftDat[i];
			pPointArrayL[i].y = theApp.m_aryLeftDat[i];

			ValRightDat[i] = ValRightDat[i] * (5.0/theApp.m_fVoleteVal2) 
				+ (3*EndPoint.y + StartPoint.y)/4;
			theApp.m_aryRightDat[i] = ValRightDat[i];
			pPointArrayR[i].y = theApp.m_aryRightDat[i];
		}
		else
		{
			ValLeftDat[i] = ValLeftDat[i] * (5.0/theApp.m_fVoleteVal1)
				+ (EndPoint.y + StartPoint.y)/2;
			theApp.m_aryLeftDat[i] = (int)ValLeftDat[i];
			pPointArrayL[i].y = theApp.m_aryLeftDat[i];

			ValRightDat[i] = ValRightDat[i] * (5.0/theApp.m_fVoleteVal2) 
				+ (EndPoint.y + StartPoint.y)/2;
			theApp.m_aryRightDat[i] = ValRightDat[i];
			pPointArrayR[i].y = theApp.m_aryRightDat[i];
		}
		
	}
	
	// 计算通道的平均值
	theApp.m_nAverageCH1 = m_nAverage1/(MY_POINT*8);
	theApp.m_nAverageCH2 = m_nAverage2/(MY_POINT*8);
	
	// 计算通道的电压值
	theApp.m_numVoleteCh1 = (m_mMax1 - m_mMin1)/8.1;
	theApp.m_numVoleteCh2 = (m_mMax2 - m_mMin2)/8.1;
	::PostMessage(theApp.m_hWndLeftView, UM_SHOEMESSAGE, 0, 0);
}

//波形文件保存
void CGraphisc::OnWaveFileSave()
{
 
}

//波形文件打开
void CGraphisc::OnWaveFileOpen()
{

}

//画函数图象
void CGraphisc::DrawWave(CDC *pDC, BOOL m_bPrintFlage)
{
	CPen pen(PS_SOLID,1,RGB(245,255,20));
	CPen pen1(PS_SOLID,1,RGB(0,255,245));
	BOOL m_bFlagem = FALSE;
	float m_nSpring = 0;
	int num = 0;
	int m = 0;
	int i = 0;
	int j = 0; 
	int x = 0;
	int m_nbzdig = 0;
	
	// CH1通道是否同步触发
	if (theApp.m_strModeApp != "CH2")
	{
		if (theApp.m_bIsochronous1)
		{
			for (i=0;i<1000;i++)
			{
				if (theApp.m_strModeApp == "CH1+CH2")
				{
					m_nSpring = 2.46+ (StartPoint.y + EndPoint.y)/2;
				}
				else if (theApp.m_strModeApp == "CH1  CH2")
				{
					m_nSpring = 1.23+ StartPoint.y + (EndPoint.y - StartPoint.y)/4;
				}
				else
				{
					m_nSpring = 1.23+ (StartPoint.y + EndPoint.y)/2;
				}

				if (pPointArrayL[i].y>=m_nSpring)
				{
					if (pPointArrayL[i].y >= pPointArrayL[i+1].y)
					{
						m_nbzdig = i;
						if (pPointArrayL[i+1].y <= m_nSpring)
						{
							break;
						}
					}
				}
			}
			for (i=0;i<1000-m_nbzdig;i++)
			{
				pPointArrayL[i].y = pPointArrayL[i+m_nbzdig].y;
			}

			if (m_nbzdig>0)
			{
				if (pPointArrayL[1000-m_nbzdig-1].y>pPointArrayL[1000-m_nbzdig-5].y)
				{
					m_bFlagem = TRUE;
				}
				else
				{
					m_bFlagem = FALSE;
				}
						
				for(m=0; m<=500; m++)
				{		
					if ((pPointArrayL[1000-m_nbzdig-1].y == pPointArrayL[m].y && m_bFlagem && pPointArrayL[m].y>pPointArrayL[m-4].y)
						|| (pPointArrayL[1000-m_nbzdig-1].y == pPointArrayL[m].y && !m_bFlagem && pPointArrayL[m].y<=pPointArrayL[m-4].y))
					{
						for (i=0; i<m_nbzdig; i++)
						{
							pPointArrayL[1000-m_nbzdig+i].y = pPointArrayL[m+i].y;
					
						}
					}
					else
					{
						continue;
					}
				}
			}
		}
	}
	

	// CH2通道是否同步触发
	if (theApp.m_strModeApp != "CH1")
	{
		if (theApp.m_bIsochronous2)
		{
			for (i=0;i<1000;i++)
			{
				if (theApp.m_strModeApp == "CH1+CH2")
				{
					m_nSpring = 2.46+ (StartPoint.y + EndPoint.y)/2;
				}
				else if (theApp.m_strModeApp == "CH1  CH2")
				{
					m_nSpring = 1.23+ (3*EndPoint.y + StartPoint.y)/4;;
				}
				else
				{
					m_nSpring = 1.23+ (StartPoint.y + EndPoint.y)/2;
				}

				if (pPointArrayR[i].y>=m_nSpring)
				{
					if (pPointArrayR[i].y >= pPointArrayR[i+1].y)
					{
						m_nbzdig = i;
						if (pPointArrayR[i+1].y <= m_nSpring)
						{
							break;
						}
					}
				}
			}
			for (i=0;i<1000-m_nbzdig;i++)
			{
				pPointArrayR[i].y = pPointArrayR[i+m_nbzdig].y;
			}

			if (m_nbzdig>0)
			{
				if (pPointArrayR[1000-m_nbzdig-1].y>pPointArrayR[1000-m_nbzdig-5].y)
				{
					m_bFlagem = TRUE;
				}
				else
				{
					m_bFlagem = FALSE;
				}
						
				for(m=0; m<=500; m++)
				{		
					if ((pPointArrayR[1000-m_nbzdig-1].y == pPointArrayR[m].y && m_bFlagem && pPointArrayR[m].y>pPointArrayR[m-4].y)
						|| (pPointArrayR[1000-m_nbzdig-1].y == pPointArrayR[m].y && !m_bFlagem && pPointArrayR[m].y<=pPointArrayR[m-4].y))
					{
						for (i=0; i<m_nbzdig; i++)
						{
							pPointArrayR[1000-m_nbzdig+i].y = pPointArrayR[m+i].y;
						}
					}
					else
					{
						continue;
					}
				}
			}
		}
	}
	

	//是否移动波形
	if (theApp.m_bLeftBtn)
	{
		for (i=0; i<1000; i++)
		{
			pPointArrayL[i].y +=  theApp.m_nChannelLeft;
		}
	}
	if (theApp.m_bRightBtn)
	{
		for (i=0; i<1000; i++)
		{
			pPointArrayR[i].y += theApp.m_nChannelRight;
		}
			
	}

	
	//CH1当波形长度超过1000个点时,计算波形相衔接的点
	if (theApp.m_nTimer>1000)
	{
		if (pPointArrayL[999].y>pPointArrayL[995].y)
		{
			m_bFlagem = TRUE;
		}
		else
		{
			m_bFlagem = FALSE;
		}
				
		for(m=0; m<600; m++)
		{		
			if ((pPointArrayL[999].y == pPointArrayL[m].y && m_bFlagem && pPointArrayL[m].y>pPointArrayL[m-4].y)
				|| (pPointArrayL[999].y == pPointArrayL[m].y && !m_bFlagem && pPointArrayL[m].y<=pPointArrayL[m-4].y))
			{
				for (j=0; j<1000; j++)
				{
					pPointArrayLeft[j].y = pPointArrayL[j].y;
				}
				for (j=0; j<1000-m; j++)
				{
					pPointArrayLeft[1000+j].y = pPointArrayL[m+j].y;
					num = j;
				}
				for (j=0; j<1000-m && num+j<2000; j++)
				{
					pPointArrayLeft[1000+num+j].y = pPointArrayL[m+j].y;
				}
			}
			else
			{
				continue;
			}
		}
		
	}

	//CH2当波形长度超过1000个点时,计算波形相衔接的点
	if (theApp.m_nTimer>1000)
	{
		if (pPointArrayR[999].y>pPointArrayR[995].y)
		{
			m_bFlagem = TRUE;
		}
		else
		{
			m_bFlagem = FALSE;
		}
				
		for(m=0; m<500; m++)
		{		
			if ((pPointArrayR[999].y == pPointArrayR[m].y && m_bFlagem && pPointArrayR[m].y>pPointArrayR[m-4].y)
				|| (pPointArrayR[999].y == pPointArrayR[m].y && !m_bFlagem && pPointArrayR[m].y<=pPointArrayR[m-4].y))
			{
				for (j=0; j<1000; j++)
				{
					pPointArrayRight[j].y = pPointArrayR[j].y;
				}
				for (j=0; j<1000-m; j++)
				{
					pPointArrayRight[1000+j].y = pPointArrayR[m+j].y;
					num = j;
				}
				for (j=0; j<1000-m && num+j<1000; j++)
				{
					pPointArrayRight[1000+num+j].y = pPointArrayR[m+j].y;
				}
			}
			else
			{
				continue;
			}
		}
		
	}

	// 得到X坐标
	for (i = 0; i<theApp.m_nTimer; i++)
		{	
			pPointArrayL[i].x = pPointArrayR[i].x = x * ((fabs(EndPoint.x - StartPoint.x))/(theApp.m_nTimer)) 
				+ StartPoint.x;
			if (pPointArrayL[i].x > EndPoint.x + 5)
			{
				pPointArrayL[i].x = EndPoint.x + 5;
			}
			if (pPointArrayR[i].x > EndPoint.x + 5)
			{
				pPointArrayR[i].x = EndPoint.x + 5;
			}
			x++;
		}


	
	// 画X-Y模式时的波形
	if (theApp.m_strModeApp == "X-Y")
	{
		for (i = 0; i<theApp.m_nTimer; i++)
		{
            pPointArrayR[i].x = pPointArrayL[i].y;
		}
		pDC->Polyline(pPointArrayR, theApp.m_nTimer);
	}
	//画当波形大于1000个点时的波形
	else if(theApp.m_nTimer>1000)
	{
		if (theApp.m_strModeApp == "CH1  CH2")
		{
			for (j=0; j<theApp.m_nTimer; j++)
			{
				pPointArrayLeft[j].x = pPointArrayL[j].x;
				pPointArrayRight[j].x = pPointArrayR[j].x;
			}
			if (!m_bPrintFlage)
			{
				pDC->SelectObject(pen);
			}	
			pDC->Polyline(pPointArrayLeft, theApp.m_nTimer);

			if (!m_bPrintFlage)
			{
				pDC->SelectObject(pen1);
			}
			pDC->Polyline(pPointArrayRight, theApp.m_nTimer);
		}
		else if (theApp.m_strModeApp == "CH1" || theApp.m_strModeApp == "CH1+CH2")
		{
			for (j=0; j<theApp.m_nTimer; j++)
			{
				pPointArrayLeft[j].x = pPointArrayL[j].x;
			}
			if (!m_bPrintFlage)
			{
				pDC->SelectObject(pen);
			}
			pDC->Polyline(pPointArrayLeft, theApp.m_nTimer);
		}
		else if(theApp.m_strModeApp == "CH2")
		{
			for (j=0; j<theApp.m_nTimer; j++)
			{
				pPointArrayRight[j].x = pPointArrayR[j].x;
			}
			if (!m_bPrintFlage)
			{
				pDC->SelectObject(pen1);
			}
			pDC->Polyline(pPointArrayRight, theApp.m_nTimer);
		}
		
	}
	// 画小于或等于1000个点时的波形
	else
	{
		if (theApp.m_strModeApp == "CH1  CH2")
		{
			if (!m_bPrintFlage)
			{
				pDC->SelectObject(pen);
			}
			pDC->Polyline(pPointArrayL, theApp.m_nTimer);
			
			if (!m_bPrintFlage)
			{
				pDC->SelectObject(pen1);
			}
			pDC->Polyline(pPointArrayR, theApp.m_nTimer);
		}
		else if (theApp.m_strModeApp == "CH1" || theApp.m_strModeApp == "CH1+CH2")
		{
			if (!m_bPrintFlage)
			{
				pDC->SelectObject(pen);
			}
			pDC->Polyline(pPointArrayL, theApp.m_nTimer);
		}
		else if (theApp.m_strModeApp == "CH2")
		{
			if (!m_bPrintFlage)
			{
				pDC->SelectObject(pen1);
			}
			pDC->Polyline(pPointArrayR, theApp.m_nTimer);
		}
		
	}
	
	theApp.m_count = 0;
   
}

void CGraphisc::SaveWave(CString str)
{

}

⌨️ 快捷键说明

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