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

📄 shiboqidlg.cpp

📁 简单的演示示波器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	return	m_brush;
	return hbr;
//
//	// TODO: Return a different brush if the default is not desired
}

void CShiboqiDlg::OnDrawWave()
{
	UpdateData();
	CDC *pDC=GetDC();
	CDC dc;
	CBitmap bmp;
	CPen pen(PS_SOLID,1,RGB(0,255,0));
	CBrush brush;
	brush.CreateSolidBrush(RGB(0,0,0));

	dc.CreateCompatibleDC(pDC);
	bmp.CreateCompatibleBitmap(pDC,m_rtGraphic.Width(),m_rtGraphic.Height());

	dc.SelectObject(&bmp);
	CPen* pOldPen=dc.SelectObject(&pen);
	CRect rt;

	m_ptOrigin.x=m_rtGraphic.left+54;
	m_ptOrigin.y=m_ptEnd.y=(m_rtGraphic.top+m_rtGraphic.bottom)/2-160;
	m_ptEnd.x=m_rtGraphic.right-53;
	rt.SetRect(m_ptOrigin.x,m_ptOrigin.y,m_ptEnd.x,m_ptEnd.y+320);
	dc.FillRect(rt,&brush);
//	dc.TextOut(450,450,"演示示波器",8);
	int i=0;
	while(i<=320)
	{
		dc.MoveTo(m_ptOrigin.x,m_ptOrigin.y+i);
		dc.LineTo(m_ptEnd.x,m_ptEnd.y+i);
		i+=40;
	}
	i=0;
	while(i<=480)
	{
		dc.MoveTo(m_ptOrigin.x+i,m_ptOrigin.y);
		dc.LineTo(m_ptOrigin.x+i,m_ptOrigin.y+320);
		i+=40;
	}
	i=0;
//判断示波条数
	m_nWaveSum=m_fSin+m_fModulation+m_fSquare+m_fRandom;
	switch(m_nWaveSum)
	{
		//	case 0:
		//		break;
	case 1:
		m_nOriginPos=160;
		m_nEndPos=0;
		m_fPos=0;
		break;
	case 2:
		m_nOriginPos=80;
		m_nEndPos=160;
		m_fPos=0;
		break;
	case 3:
		m_nOriginPos=80;
		m_nEndPos=80;
		m_fPos=0;
		break;
	case 4:
		m_nOriginPos=40;
		m_nEndPos=80;
		m_fPos=0;
		break;
	}
//开始画波形
	if(m_fSin)
	DrawSin(dc);

	if(m_fModulation)
	DrawModulation(dc);

	if(m_fSquare)
	DrawSquare(dc);
	
	if(m_fRandom)
	DrawRandom(dc);

	m_n++;

	pDC->BitBlt(m_rtGraphic.left,m_rtGraphic.top,m_rtGraphic.Width(),m_rtGraphic.Height(),
					&dc,0,0,SRCCOPY);
	pOldPen=dc.SelectObject(pOldPen);
	pOldPen->DeleteObject();
	bmp.DeleteObject();
	dc.DeleteDC();
	ReleaseDC(pDC);
}

int CShiboqiDlg::OnPlay() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	m_nWaveSum=m_fSin+m_fModulation+m_fSquare+m_fRandom;
	if(m_nWaveSum==0)
	{
		MessageBox("请先选择波形!");
		return 0;
	}
	if(!m_bStop)
	{
		m_bPlay=!m_bPlay;
		m_ctrlPlay.m_bState=!m_ctrlPlay.m_bState;
	}
	else 
		MessageBox("请先点击暂停!");
	if(m_bPlay)
	{
		SetTimer(1,10,NULL);
	}
	else
	{
		KillTimer(1);
//		m_fSin=m_fModulation=m_fSquare=m_fRandom=FALSE;
//		UpdateData();
		OnPaint();
	}
	return 0;
}

void CShiboqiDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	if(!m_bStop)
	{
		OnDrawWave();
	}

	CDialog::OnTimer(nIDEvent);
}

void CShiboqiDlg::OnStop() 
{
	// TODO: Add your control notification handler code here
	if(m_bPlay)
	{
		m_bStop=!m_bStop;
		m_ctrlStop.m_bState=!m_ctrlStop.m_bState;
	}
	else
		MessageBox("请先点击示波!");
}

BOOL CShiboqiDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
{
	// TODO: Add your message handler code here and/or call default
	CString sBtnName;
	::GetClassName(pWnd->GetSafeHwnd(),sBtnName.GetBuffer(80),80);

		if (sBtnName=="Button" && m_hBtnCursor) 
		{
			::SetCursor(m_hBtnCursor);
			return TRUE;
		}
	return CDialog::OnSetCursor(pWnd, nHitTest, message);
}

void CShiboqiDlg::OnOK() 
{
	// TODO: Add extra validation here
	if(AfxMessageBox("真的要退出么?",MB_OKCANCEL)==IDOK)
	{
		CDialog::OnOK();
	}
}

void CShiboqiDlg::DrawSin(CDC &memDC)
{
	CPen newPen;
	newPen.CreatePen(PS_SOLID,1,RGB(255,0,0));
	memDC.SelectObject(&newPen);

	//周期
	double period=m_nP*4;
//	int A=30;
/*	if(m_ptOrigin.y+m_nOriginPos+m_nEndPos*m_fPos+m_nA*3*(sin(-m_n*PI/period))<=m_ptOrigin.y)
	{
		memDC.MoveTo(m_ptOrigin.x,m_ptOrigin.y);
	}
	else
		if(m_nOriginPos+m_nEndPos*m_fPos+m_nA*3*(sin(-m_n*PI/period))>=320)
		{
			memDC.MoveTo(m_ptOrigin.x,m_ptOrigin.y+320);
		}
		else*/
			memDC.MoveTo(m_ptOrigin.x,m_ptOrigin.y+m_nOriginPos+m_nEndPos*m_fPos+m_nA*3*(sin(-m_n*PI/period)));
	for(int i=0;i<=480;i++)
	{
/*			if(m_ptOrigin.y+m_nOriginPos+m_nEndPos*m_fPos+m_nA*3*(sin(-m_n*PI/period))<=m_ptOrigin.y)
			{
				memDC.MoveTo(m_ptOrigin.x,m_ptOrigin.y);
			}
			else
				if(m_nOriginPos+m_nEndPos*m_fPos+m_nA*3*(sin(-m_n*PI/period))>=320)
				{
					memDC.MoveTo(m_ptOrigin.x,m_ptOrigin.y+320);
				}
				else*/
					memDC.LineTo(m_ptOrigin.x+i,m_ptOrigin.y+m_nOriginPos+m_nEndPos*m_fPos+m_nA*3*(sin((i-m_n)*PI/period)));
	}
	m_fPos++;
}

void CShiboqiDlg::DrawSquare(CDC &memDC)
{
	
	CPen newPen;
	newPen.CreatePen(PS_SOLID,1,RGB(255,0,0));
	memDC.SelectObject(&newPen);
	double period=m_nP*4;

//	int A=30;
	if(sin(-m_n*PI/period)<=0)
	memDC.MoveTo(m_ptOrigin.x,m_ptOrigin.y+m_nOriginPos+m_nEndPos*m_fPos-m_nA*3);
	else
	memDC.MoveTo(m_ptOrigin.x,m_ptOrigin.y+m_nOriginPos+m_nEndPos*m_fPos+m_nA*3);
	for(int i=0;i<=480;i++)
	{
		if(sin((i-m_n)*PI/period)<=0)
			memDC.LineTo(m_ptOrigin.x+i,m_ptOrigin.y+m_nOriginPos+m_nEndPos*m_fPos-m_nA*3);
		else
			memDC.LineTo(m_ptOrigin.x+i,m_ptOrigin.y+m_nOriginPos+m_nEndPos*m_fPos+m_nA*3);
	}
	m_fPos++;
}

void CShiboqiDlg::DrawModulation(CDC &memDC)
{
	
	CPen newPen;
	newPen.CreatePen(PS_SOLID,1,RGB(255,0,0));
	memDC.SelectObject(&newPen);
	double period=m_nP*2;
//	int A=30;
	memDC.MoveTo(m_ptOrigin.x,m_ptOrigin.y+m_nOriginPos+m_nEndPos*m_fPos+m_nA*3/2*(sin(-m_n*PI/period)+sin(-m_n*PI/(1.5*m_nP))));
	for(int i=0;i<=480;i++)
	{
		memDC.LineTo(m_ptOrigin.x+i,m_ptOrigin.y+m_nOriginPos+m_nEndPos*m_fPos+m_nA*3/2*(sin((i-m_n)*PI/period)+sin((i-m_n)*PI/(1.5*m_nP))));
	}
	m_fPos++;
}

void CShiboqiDlg::DrawRandom(CDC &memDC)
{
	
	CPen newPen;
	newPen.CreatePen(PS_SOLID,1,RGB(255,0,0));
	memDC.SelectObject(&newPen);

	double ran,ran1,ran2;
//	int A=30;
	ran1=m_nA*3*rand()/0x7fff;
	ran2=m_nA*3*rand()/0x7fff;
	ran=ran1-ran2;
	memDC.MoveTo(m_ptOrigin.x,m_ptOrigin.y+m_nOriginPos+m_nEndPos*m_fPos+ran);
	for(int i=0;i<=480;i++)
	{
		ran1=m_nA*3*rand()/0x7fff;
		ran2=m_nA*3*rand()/0x7fff;
		ran=ran1-ran2;
		memDC.LineTo(m_ptOrigin.x+i,m_ptOrigin.y+m_nOriginPos+m_nEndPos*m_fPos+ran);
	}
	m_fPos++;
}



void CShiboqiDlg::OnSaveas() 
{
	// TODO: Add your control notification handler code here
	if(m_ctrlPlay.m_bState==FALSE)
		MessageBox("请点击示波!");
	else
	if(m_ctrlStop.m_bState==FALSE)
		MessageBox("请先点击暂停!");
	else
	{
		m_ctrlSaveas.m_bState=TRUE;
		CString str;
		str="波形文件(*.wave)|*.wave|所以文件(*.*)|*.*||";
		CFileDialog saveasdlg(FALSE,"wave","newwave",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
							str);
//		saveasdlg.m_ofn.Flags.lpstrTitle="波形另存为";
		saveasdlg.DoModal();
		m_ctrlSaveas.m_bState=FALSE;
		m_ctrlSaveas.Invalidate();
	}
	
}

void CShiboqiDlg::OnOpen() 
{
	// TODO: Add your control notification handler code here

	m_ctrlOpen.m_bState=TRUE;
	CString str;
	str="波形文件(*.wave)|*.wave|所以文件(*.*)|*.*||";
	CFileDialog opendlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
		str);
	opendlg.DoModal();
	m_ctrlOpen.m_bState=FALSE;
	m_ctrlOpen.Invalidate();

}

⌨️ 快捷键说明

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