📄 shiboqidlg.cpp
字号:
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 + -