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

📄 oscilloscopedlg.cpp

📁 模拟了现实中的示波器
💻 CPP
📖 第 1 页 / 共 3 页
字号:

void COscilloscopeDlg::OnChannel(UINT nID)
{
	// TODO: Add your control notification handler code here
	int index = nID-IDC_CHONE;
	if (index == 0)
		m_ChOneRndBtn.SetLighted(!m_ChOneRndBtn.GetLightedState());
	else if(index == 1)
		m_ChTwoRndBtn.SetLighted(!m_ChTwoRndBtn.GetLightedState());
	else if(index == 2)
		m_ChThreeRndBtn.SetLighted(!m_ChThreeRndBtn.GetLightedState());

	m_bChannel[index] = !m_bChannel[index];
	m_ctrlCurveFrame.SetCurveChannel(m_bChannel[0],m_bChannel[1],m_bChannel[2]);

}

void COscilloscopeDlg::OnSelchangeCmbSignaltype() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	//波形数据
	Signal[m_nCurChannel].SignalType = m_btnSignalType.GetCurSel();
}

//当窗口需要确定鼠标位置时Windows向窗口发送WM_NCHITTEST信息,
//可以处理该信息使Windows认为鼠标在窗口标题上。
//对于对话框和基于对话的应用程序,可以使用ClassWizard处理该消息并调用基类函数,
//如果函数返回HTCLIENT则表明鼠标在客户区,
//返回HTCAPTION表明鼠标在Windows的标题栏中。 
UINT COscilloscopeDlg::OnNcHitTest(CPoint point)
{
	UINT nHitTest = CBitmapDialog::OnNcHitTest(point); 
	return (nHitTest == HTCLIENT)?HTCAPTION:nHitTest; 
}

/////////////////////////////////////////////////////////////////////////////
/*
函数介绍:	屏蔽在对话框上按ESC时,退出对话框
*/
/////////////////////////////////////////////////////////////////////////////
BOOL COscilloscopeDlg::PreTranslateMessage(MSG* pMsg) 
{
	// TODO: Add your specialized code here and/or call the base class
	if(pMsg->message == WM_KEYDOWN)
	{
		int nKey = (int) pMsg->wParam;    
		if(VK_ESCAPE == nKey) 
			return TRUE;
	}
	return CBitmapDialog::PreTranslateMessage(pMsg);
}

void COscilloscopeDlg::OnSize(UINT nType, int cx, int cy) 
{
	CBitmapDialog::OnSize(nType, cx, cy);
	
	// TODO: Add your message handler code here
	Invalidate();
}


void COscilloscopeDlg::OnBtnFreqsignal() 
{
	Signal[m_nCurChannel].Frequency = m_btnFreqSignal.GetData();
	m_nNumPerCircle[m_nCurChannel] = (int)(m_btnFreqSample.GetData()/Signal[m_nCurChannel].Frequency);
	m_nCurNumOfSample[m_nCurChannel] = 0;//当改变信号频率后,从0度重新开始产生波形
}

void COscilloscopeDlg::OnBtnAmplitude() 
{
	Signal[m_nCurChannel].Amplitude = m_btnAmplitude.GetData();
}

void COscilloscopeDlg::OnBtnOffset() 
{
	// TODO: Add your control notification handler code here
	Signal[m_nCurChannel].Offset = m_btnOffset.GetData();
}

void COscilloscopeDlg::OnBtnPhase() 
{
	// TODO: Add your control notification handler code here
	Signal[m_nCurChannel].Phase = m_btnPhase.GetData();
}

void COscilloscopeDlg::OnBtnWidth() 
{
	// TODO: Add your control notification handler code here
	m_ctrlCurveFrame.SetCurveWidth(int(m_btnWidth.GetData()), m_nCurChannel);
}

void COscilloscopeDlg::OnBtnFreqsample() 
{
	// TODO: Add your control notification handler code here
	double tmp = m_btnFreqSample.GetData();
	UpdateData(TRUE);
	if (m_btnFreqSample.GetData() <= 2*Signal[0].Frequency ||
		m_btnFreqSample.GetData() <= 2*Signal[1].Frequency ||
		m_btnFreqSample.GetData() <= 2*Signal[2].Frequency)
	{
		MessageBox("输入的采样频率不能满足采样定律!");
		m_btnFreqSample.SetData(tmp);
		UpdateData(FALSE);
	}
	else
	{
		for(int i=0; i<3; i++)
		{
			m_nNumPerCircle[i] = (int)(m_btnFreqSample.GetData()/Signal[i].Frequency);
			Signal[i].Number = int(m_btnFreqSample.GetData()*100/1000);//采样频率*每屏的时间/1000
			m_nCurNumOfSample[i] = 0;//当改变擦采样频率后,从0度重新开始产生波形
		}
	}	
}
void COscilloscopeDlg::SaveDlgItemRect(CDialog *pDlg, int firstItem, int lastItem)
{
	int nNumOfItem = lastItem - firstItem + 1;

	for(int i=0; i<nNumOfItem; i++)
	{
		pDlg->GetDlgItem(firstItem + i)->GetClientRect(&rcItem[i]);
		ClientToScreen(rcItem[i]);
	}
	pDlg->GetClientRect(&rcDlg);
	ClientToScreen(rcDlg);
}
void COscilloscopeDlg::ResizeDlgItem(CDialog *pDlg, int firstItem, int lastItem)
{
	int nNumOfItem = lastItem - firstItem + 1;
	
	for(int i=0; i<nNumOfItem+1; i++)
	{
		pDlg->GetDlgItem(firstItem + i)->GetClientRect(&rcItem[i]);
	}
}


void COscilloscopeDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	// TODO: Add your message handler code here and/or call default
   // Get the minimum and maximum scroll-bar positions.
   int minpos;
   int maxpos;
   
   pScrollBar->GetScrollRange(&minpos, &maxpos); 
   maxpos = pScrollBar->GetScrollLimit();

   // Get the current position of scroll box.
   int curpos = pScrollBar->GetScrollPos();

   // Determine the new position of scroll box.
   switch (nSBCode)
   {
   case SB_LEFT:      // Scroll to far left.
      curpos = minpos;
      break;

   case SB_RIGHT:      // Scroll to far right.
      curpos = maxpos;
      break;

   case SB_ENDSCROLL:   // End scroll.
      break;

   case SB_LINELEFT:      // Scroll left.
      if (curpos > minpos)
         curpos--;
      break;

   case SB_LINERIGHT:   // Scroll right.
      if (curpos < maxpos)
         curpos++;
      break;

   case SB_PAGELEFT:    // Scroll one page left.
   {
      // Get the page size. 
      SCROLLINFO   info;
      pScrollBar->GetScrollInfo(&info, SIF_ALL);
   
      if (curpos > minpos)
      curpos = max(minpos, curpos - (int) info.nPage);
   }
      break;

   case SB_PAGERIGHT:      // Scroll one page right.
   {
      // Get the page size. 
      SCROLLINFO   info;
      pScrollBar->GetScrollInfo(&info, SIF_ALL);

      if (curpos < maxpos)
         curpos = min(maxpos, curpos + (int) info.nPage);
   }
      break;

   case SB_THUMBPOSITION: // Scroll to absolute position. nPos is the position
      curpos = nPos;      // of the scroll box at the end of the drag operation.
      break;

   case SB_THUMBTRACK:   // Drag scroll box to specified position. nPos is the
      curpos = nPos;     // position that the scroll box has been dragged to.
      break;
   }

   // Set the new position of the thumb (scroll box).
	pScrollBar->SetScrollPos(curpos);
	m_ctrlCurveFrame.DrawCurve(RetriveSignal[curpos][0].Data, RetriveSignal[curpos][0].Number,
							   RetriveSignal[curpos][1].Data, RetriveSignal[curpos][1].Number,
							   RetriveSignal[curpos][2].Data, RetriveSignal[curpos][2].Number,
							   m_btnFreqSample.GetData());
	
	CBitmapDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}
void COscilloscopeDlg::SaveSignal(_Signal signal0, _Signal signal1, _Signal signal2)
{
	int i,j,k;
	if(nTimes < 5)
	{
		RetriveSignal[nTimes][0].Amplitude	= signal0.Amplitude;
		RetriveSignal[nTimes][0].Frequency	= signal0.Frequency;
		RetriveSignal[nTimes][0].Number		= signal0.Number;
		RetriveSignal[nTimes][0].Offset		= signal0.Offset;
		RetriveSignal[nTimes][0].Phase		= signal0.Phase;
		RetriveSignal[nTimes][0].SignalType = signal0.SignalType;
		for(i=0; i<1024; i++)
			RetriveSignal[nTimes][0].Data[i] = signal0.Data[i];
	
		RetriveSignal[nTimes][1].Amplitude	= signal1.Amplitude;
		RetriveSignal[nTimes][1].Frequency	= signal1.Frequency;
		RetriveSignal[nTimes][1].Number		= signal1.Number;
		RetriveSignal[nTimes][1].Offset		= signal1.Offset;
		RetriveSignal[nTimes][1].Phase		= signal1.Phase;
		RetriveSignal[nTimes][1].SignalType = signal1.SignalType;
		for(i=0; i<1024; i++)
			RetriveSignal[nTimes][1].Data[i] = signal1.Data[i];
		
		RetriveSignal[nTimes][2].Amplitude	= signal2.Amplitude;
		RetriveSignal[nTimes][2].Frequency	= signal2.Frequency;
		RetriveSignal[nTimes][2].Number		= signal2.Number;
		RetriveSignal[nTimes][2].Offset		= signal2.Offset;
		RetriveSignal[nTimes][2].Phase		= signal2.Phase;
		RetriveSignal[nTimes][2].SignalType = signal2.SignalType;
		for(i=0; i<1024; i++)
			RetriveSignal[nTimes][2].Data[i] = signal2.Data[i];

		
		nTimes ++;
	}
	else
	{
		for(i=0; i<4; i++)
		{

			RetriveSignal[i][0].Amplitude	= RetriveSignal[i+1][0].Amplitude;
			RetriveSignal[i][0].Frequency	= RetriveSignal[i+1][0].Frequency;
			RetriveSignal[i][0].Number		= RetriveSignal[i+1][0].Number;
			RetriveSignal[i][0].Offset		= RetriveSignal[i+1][0].Offset;
			RetriveSignal[i][0].Phase		= RetriveSignal[i+1][0].Phase;
			RetriveSignal[i][0].SignalType = RetriveSignal[i+1][0].SignalType;
			for(k=0; k<1024; k++)
				RetriveSignal[i][0].Data[k] = RetriveSignal[i+1][0].Data[k];

			RetriveSignal[i][1].Amplitude	= RetriveSignal[i+1][1].Amplitude;
			RetriveSignal[i][1].Frequency	= RetriveSignal[i+1][1].Frequency;
			RetriveSignal[i][1].Number		= RetriveSignal[i+1][1].Number;
			RetriveSignal[i][1].Offset		= RetriveSignal[i+1][1].Offset;
			RetriveSignal[i][1].Phase		= RetriveSignal[i+1][1].Phase;
			RetriveSignal[i][1].SignalType = RetriveSignal[i+1][1].SignalType;
			for(k=0; k<1024; k++)
				RetriveSignal[i][1].Data[k] = RetriveSignal[i+1][1].Data[k];

			RetriveSignal[i][2].Amplitude	= RetriveSignal[i+1][2].Amplitude;
			RetriveSignal[i][2].Frequency	= RetriveSignal[i+1][2].Frequency;
			RetriveSignal[i][2].Number		= RetriveSignal[i+1][2].Number;
			RetriveSignal[i][2].Offset		= RetriveSignal[i+1][2].Offset;
			RetriveSignal[i][2].Phase		= RetriveSignal[i+1][2].Phase;
			RetriveSignal[i][2].SignalType = RetriveSignal[i+1][2].SignalType;
			for(k=0; k<1024; k++)
				RetriveSignal[i][2].Data[k] = RetriveSignal[i+1][2].Data[k];

		}
		RetriveSignal[4][0].Amplitude	= signal0.Amplitude;
		RetriveSignal[4][0].Frequency	= signal0.Frequency;
		RetriveSignal[4][0].Number		= signal0.Number;
		RetriveSignal[4][0].Offset		= signal0.Offset;
		RetriveSignal[4][0].Phase		= signal0.Phase;
		RetriveSignal[4][0].SignalType = signal0.SignalType;
		for(j=0; j<1024; j++)
			RetriveSignal[4][0].Data[j] = signal0.Data[j];
	
		RetriveSignal[4][1].Amplitude	= signal1.Amplitude;
		RetriveSignal[4][1].Frequency	= signal1.Frequency;
		RetriveSignal[4][1].Number		= signal1.Number;
		RetriveSignal[4][1].Offset		= signal1.Offset;
		RetriveSignal[4][1].Phase		= signal1.Phase;
		RetriveSignal[4][1].SignalType = signal1.SignalType;
		for(j=0; j<1024; j++)
			RetriveSignal[4][1].Data[j] = signal1.Data[j];

		RetriveSignal[4][2].Amplitude	= signal2.Amplitude;
		RetriveSignal[4][2].Frequency	= signal2.Frequency;
		RetriveSignal[4][2].Number		= signal2.Number;
		RetriveSignal[4][2].Offset		= signal2.Offset;
		RetriveSignal[4][2].Phase		= signal2.Phase;
		RetriveSignal[4][2].SignalType = signal2.SignalType;
		for(j=0; j<1024; j++)
			RetriveSignal[4][2].Data[j] = signal2.Data[j];

	}
}


void COscilloscopeDlg::OnBtnChanel() 
{
	// TODO: Add your control notification handler code here
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	//保存前一通道的数据
	//波形显示数据
	m_ctrlCurveFrame.SetCurveWidth(UINT(m_btnWidth.GetData()), m_nCurChannel);
	m_ctrlCurveFrame.SetCurveColor(m_Color, m_nCurChannel);
	//波形数据
	Signal[m_nCurChannel].SignalType = m_btnSignalType.GetCurSel();
	Signal[m_nCurChannel].Amplitude	 = m_btnAmplitude.GetData();
	Signal[m_nCurChannel].Frequency  = m_btnFreqSignal.GetData();
	Signal[m_nCurChannel].Offset     = m_btnOffset.GetData();
	Signal[m_nCurChannel].Phase      = m_btnPhase.GetData();

	//取得当前通道号,并显示当前通道的数据
	m_nCurChannel = m_btnChannel.GetCurSel();;
	//波形显示数据
	UINT width;
	m_ctrlCurveFrame.GetCurveWidth(width, m_nCurChannel);
	m_btnWidth.SetData(double(width));

	m_ctrlCurveFrame.GetCurveColor(m_Color, m_nCurChannel);
	//波形数据
	m_btnChannel.SetCurSel(m_nCurChannel);
	m_btnSignalType.SetCurSel(Signal[m_nCurChannel].SignalType);

	m_btnAmplitude.SetData(Signal[m_nCurChannel].Amplitude);
	m_btnFreqSignal.SetData(Signal[m_nCurChannel].Frequency);
	m_btnOffset.SetData(Signal[m_nCurChannel].Offset);
	m_btnPhase.SetData(Signal[m_nCurChannel].Phase);

	UpdateData(FALSE);
	SendMessage(WM_PAINT);}

void COscilloscopeDlg::OnBtnSignaltype() 
{
	// TODO: Add your control notification handler code here
	//波形数据
	Signal[m_nCurChannel].SignalType = m_btnSignalType.GetCurSel();
}

⌨️ 快捷键说明

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