📄 dwgview.cpp
字号:
data[i]=0;
data[255]=int(pp*255/5);
n=4*Shiji*Freq*256;
for(i=0;i<=n;i++)
{
if(i>(k*256-1))
{
k++;
p=256*(k-1);
}
X0=X;
X=int(203.0+198*i/n);
x0=x;
x=int(203.0-198*i/n);
Y0=Y;
Y=int(240-230.0*data[i-p]/255.0);
y0=y;
y=int(240-230.0*data[255-(i-p)]/255.0);
pDC->MoveTo(X0,Y0);
pDC->LineTo(X,Y);
pDC->MoveTo(x0,y0);
pDC->LineTo(x,y);
}
pDC->SelectObject(pOldPen);
OutputWave();
}
void CDWGView::Hanshubo(CDC *pDC)
{
// MessageBox("函数波");
CBitmap mBit;
CDC MemDC;
MemDC.CreateCompatibleDC(NULL);
mBit.LoadBitmap(IDB_Display);
CBitmap *pOldBit=MemDC.SelectObject(&mBit);
pDC->BitBlt(2,7,900,700,&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(pOldBit);
// CHanshuboDlg hanshu;
//hanshuView
int i;
double pi=3.1415926;
for (i=0;i<256;i++)
{
if(i<126)
data[i]=int(255*sin(2*pi*(i-127)/127)/(2*pi*(i-127)/127));
else if(i<127)
data[126]=254;
else if(i<128)
data[127]=255;
else if(i<129)
data[128]=254;
else
data[i]=int(255*sin(2*pi*(i-127)/127)/(2*pi*(i-127)/127));
}
CPen pen;
pen.CreatePen(PS_SOLID,1,RGB(255,0,0));//创建一个红色的2个象素的实线画笔
CPen *pOldPen=pDC->SelectObject(&pen);//将该画笔选到你绘图的DC设备中
pDC->MoveTo(4,int(190-150.0*data[0]/255.0));
int k=1,p=0;
double n;
int X=203,Y=240,x=203,y=240,X0=203,Y0=240,x0=203,y0=240;
n=8*Shiji*Freq*256;
for(i=0;i<=n;i++)
{
if(i>(k*256-1))
{
k++;
p=256*(k-1);
}
// X0=X;
X=int(4+394*i/n);
// Y0=Y;
Y=int(190-170.0*data[i-p]/255.0);
// pDC->MoveTo(X0,Y0);
pDC->LineTo(X,Y);
}
pDC->SelectObject(pOldPen);
OutputWave();
}
void CDWGView::Renyibo(CDC *pDC)
{
//MessageBox("任意波");
CBitmap mBit;
CDC MemDC;
MemDC.CreateCompatibleDC(NULL);
mBit.LoadBitmap(IDB_Display);
CBitmap *pOldBit=MemDC.SelectObject(&mBit);
pDC->BitBlt(2,7,900,700,&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(pOldBit);
CPen pen;
pen.CreatePen(PS_SOLID,1,RGB(255,0,0));//创建一个红色的2个象素的实线画笔
CPen *pOldPen=pDC->SelectObject(&pen);//将该画笔选到你绘图的DC设备中
int i,k=1,p=0;
double n;
int X=4,Y=240,X0=4,Y0=240;
pDC->MoveTo(4,240);
if(Counter==1)
{
//根据data画任意波的波形!!!
//MessageBox("May to graphics!!");
n=8*Shiji*Freq*256;
for(i=0;i<=n;i++)
{
if(i>(k*256-1))
{
k++;
p=256*(k-1);
}
// X0=X;
X=int(4+394*i/n);
// Y0=Y;
Y=int(240-230.0*data[i-p]/255.0);
// pDC->MoveTo(X0,Y0);
pDC->LineTo(X,Y);
}
}
pDC->SelectObject(pOldPen);
OutputWave();
}
void CDWGView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
CFormView::OnHScroll(nSBCode, nPos, pScrollBar);
CSliderCtrl* pSlide1=(CSliderCtrl*)pScrollBar;
CString str1;
// pSlide1->SetPos(4500);
int n=pSlide1->GetPos();
// PPLedDisplay(n);
str1.Format("%d",n);
SetDlgItemText(IDC_STATIC_TRACK2,str1+"mv");
UpdateData(TRUE);
pp=float(m_pp/1000.0);
OnPaint();
}
void CDWGView::OnChangeFreq()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CFormView::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
// TODO: Add your control notification handler code here
UpdateData(TRUE);
int n=m_Freq;
Freq=n;
CString str;
double shiji;
if(n<32)
{
shiji=31.25*pow(10,-3);
UpdateData(TRUE);
Shiji=shiji;
str.Format("%.2f",31.25);
SetDlgItemText(IDC_STATIC_shiji,str+"毫秒/格");
}
else if(n<128)
{
shiji=7.81*pow(10,-3);
UpdateData(TRUE);
Shiji=shiji;
str.Format("%.2f",7.81);
SetDlgItemText(IDC_STATIC_shiji,str+"ms/格");
}
else if(n<512)
{
shiji=1.95*pow(10,-3);
UpdateData(TRUE);
Shiji=shiji;
str.Format("%.2f",1.95);
SetDlgItemText(IDC_STATIC_shiji,str+"毫秒/格");
}
else if(n<2048)
{
shiji=488.28*pow(10,-6);
UpdateData(TRUE);
Shiji=shiji;
str.Format("%.2f",488.28);
SetDlgItemText(IDC_STATIC_shiji,str+"微秒/格");
}
if(n>=1000)
{
float f;
f=float(n/1000.0);
str.Format("%.3f",f);
str=str+"KHz";
}
else
{
str.Format("%d",n);
str=str+"Hz";
}
SetDlgItemText(IDC_STATIC_TRACK1,str);
Freq=n;
OnPaint();
}
int CDWGView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFormView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
//设置spin
//m_updown.SetBuddy
/*
m_2ndSpin.Create(WS_CHILD | WS_VISIBLE | WS_BORDER |
UDS_ALIGNLEFT | UDS_ARROWKEYS,
CRect(0, 0, 0, 0), this, IDC_2ndSPIN);
m_2ndSpin.SetBuddy(&m_Freq);
m_2ndSpin.SetRange(0, 500000);
m_2ndSpin2.Create(WS_CHILD | WS_VISIBLE | WS_BORDER |
UDS_ALIGNRIGHT | UDS_ARROWKEYS,
CRect(0, 0, 0, 0), this, IDC_2ndSPIN2);
m_2ndSpin2.SetBuddy(&m_Freq);
m_2ndSpin2.SetRange(0, 500000);
*/
//renyibo.DoModal();
return 0;
}
void CDWGView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
// 作图窗口坐标(155,108)(551,337)
CFormView::OnMouseMove(nFlags, point);
if(Counter==2)
{
Counter=1;
m_nMouseButtonDown=FALSE;
//清空data
}
if(m_nMouseButtonDown&(Select==7)&(point.x>155)&(point.y>108)&(point.x<551)&(point.y<337))
{
// MessageBox("Down!!");
CDWGDoc* pDoc = GetDocument();
CDC* pDC=GetDC();
m_pntMouseLoc=point;
m_nMouseFlags=nFlags;
if(m_pntMouseLoc.x<m_pntPrevLoc.x)
{
// Invalidate(TRUE);
// m_pntPrevLoc=CPoint(152,221);
Counter=2;
CString str;
str.Format("\n\n因为前一点横坐标为%d,当前点横坐标为%d",m_pntMouseLoc.x,m_pntPrevLoc.x-5);
// OnPaint();
AfxMessageBox("你的横坐标不满足要求!"+str+"\n\n请画单值函数波,否则不予接受!!\n\n 若要再画,请点击“任意波”按钮!!");
return;
}
CPen penStroke(PS_SOLID,3,RGB(255,0,0));
CPen *ppenPrevious=pDC->SelectObject(&penStroke);
CPen pen;
pen.CreatePen(PS_SOLID,1,RGB(255,0,0));//创建一个红色的2个象素的实线画笔
CPen *pOldPen=pDC->SelectObject(&pen);//将该画笔选到你绘图的DC设备中
//写入data,等待改变频率
int i;
float k,c;
for(i=0;i<256;i++)
{
c=float(395.0*i/255.0+155.0);
if((m_pntPrevLoc.x<=c)&(c<m_pntMouseLoc.x))
{
k=float((m_pntPrevLoc.y-m_pntMouseLoc.y)/(m_pntPrevLoc.x-m_pntMouseLoc.x));
data[i]=int((227-k*(c-m_pntPrevLoc.x)-m_pntMouseLoc.y+110)*256/227);
}
}
pDC->MoveTo(m_pntPrevLoc);
pDC->LineTo(m_pntMouseLoc);
m_pntPrevLoc=m_pntMouseLoc;
pDC->SelectObject(&pOldPen);
}
}
void CDWGView::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CFormView::OnRButtonDown(nFlags, point);
m_pntPrevLoc=m_pntMouseLoc=point;
m_nMouseFlags=nFlags;
CString str;
str.Format("(%d,%d)",point.x-155,point.y-110);
// MessageBox(str);
if(Counter==0)
{
m_nMouseButtonDown=TRUE;
Counter+=1;
}
else
m_nMouseButtonDown=FALSE;
}
void CDWGView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CFormView::OnLButtonDown(nFlags, point);
GetParentFrame()->PostMessage(WM_NCLBUTTONDOWN ,
HTCAPTION ,
MAKELPARAM (point.x,point.y));
}
void CDWGView::OnButtonUp()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
int n=m_Freq;
n+=1;
// CString str;
// str.Format("%d",n);
//MessageBox(str);
if(n>1900)
n=1;
m_Freq=n;
UpdateData(FALSE);
OnChangeFreq() ;
}
void CDWGView::OnButtonDown()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
int n=m_Freq;
n-=1;
if(n<1)
n=1900;
m_Freq=n;
UpdateData(FALSE);
OnChangeFreq() ;
}
void CDWGView::OutputWave()
{
//从示波器上输出波形的代码
//data[256]是系统的全局变量,由高级语言产生的int数据
//范围在0~255之间。
//以下是写6116的代码
/* int Address=0;//定义地址变量
int Data; //定义数据变量
__asm
{
mov al,10B
mov dx,398h
out dx,al
} //将74LS374的Q1置0,Q2置1,使系统处于写数据状态
int i;
for(i=0;i<256;i++)
{
Data=data[i];
Address=i;
__asm
{
mov eax,Address
mov dx,390h
out dx,al //用74LS374锁存地址
mov eax,Data
mov dx,380h
out dx,al //向对应的地址写数据
}
}
//以下是从6116中读出数据到DAC中,然后显示在示波器上
//的代码
//从控件中获得要输出波的频率Freq(全局变量),CLK信号为500KHz
//先对8253初始化,然后将系统处于输出状态。输出波形的
//频率在1Hz~1.95KHz
//则实际频率应该定在1Hz~1.5KHz
int ControlData=int(500000/256/Freq);
//计算写入的初始值的大小
__asm
{
mov dx,38fh
mov al,01110100b //控制字,选择计数器1,写16位寄存器
out dx,al //工作方式2(频率计),二进制写入
mov eax,ControlData
mov dx,389h
out dx,al //选择计数器1,先写低8位
mov eax,ControlData
mov al,ah
mov dx,389h
out dx,al //写高8位
mov al,01B
mov dx,398h
out dx,al //将74LS374的Q1置1,Q2置0,系统处于输出状态.
}*/
}
void CDWGView::SetPowerLed()
{
CWnd* pWnd=GetDlgItem(IDC_STATIC_power);
CDC* pControlDC=pWnd->GetDC();
pWnd->Invalidate();
pWnd->UpdateWindow();
pControlDC->SelectStockObject(BLACK_BRUSH);
CBitmap mBit;
CDC MemDC;
MemDC.CreateCompatibleDC(NULL);
mBit.LoadBitmap(IDB_BITMAP_power);
CBitmap *pOldBit=MemDC.SelectObject(&mBit);
pControlDC->BitBlt(0,0,900,700,&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(pOldBit);
//设置mv
/*
CWnd* pWnd1=GetDlgItem(IDC_STATIC_mv);
CDC* pControlDC1=pWnd1->GetDC();
pWnd1->Invalidate();
pWnd1->UpdateWindow();
pControlDC1->SelectStockObject(BLACK_BRUSH);
CBitmap mBit1;
CDC MemDC1;
MemDC1.CreateCompatibleDC(NULL);
mBit1.LoadBitmap(IDB_BITMAP_mv);
CBitmap *pOldBit1=MemDC1.SelectObject(&mBit1);
pControlDC1->BitBlt(0,0,900,700,&MemDC1,0,0,SRCCOPY);
MemDC1.SelectObject(pOldBit1);
//设置hz
CWnd* pWnd2=GetDlgItem(IDC_STATIC_hz);
CDC* pControlDC2=pWnd2->GetDC();
pWnd2->Invalidate();
pWnd2->UpdateWindow();
pControlDC2->SelectStockObject(BLACK_BRUSH);
CBitmap mBit2;
CDC MemDC2;
MemDC2.CreateCompatibleDC(NULL);
mBit2.LoadBitmap(IDB_BITMAP_HZ);
CBitmap *pOldBit2=MemDC2.SelectObject(&mBit2);
pControlDC2->BitBlt(0,0,50,50,&MemDC2,0,0,SRCCOPY);
MemDC2.SelectObject(pOldBit2);
*/
}
void CDWGView::SetFangboLed()
{
CWnd* pWnd=GetDlgItem(IDC_STATIC_fangbo);
CDC* pControlDC=pWnd->GetDC();
pWnd->Invalidate();
pWnd->UpdateWindow();
pControlDC->SelectStockObject(BLACK_BRUSH);
CBitmap mBit;
CDC MemDC;
MemDC.CreateCompatibleDC(NULL);
if(Select==1)
mBit.LoadBitmap(IDB_ON);
else
mBit.LoadBitmap(IDB_OFF);
CBitmap *pOldBit=MemDC.SelectObject(&mBit);
pControlDC->BitBlt(0,0,900,700,&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(pOldBit);
}
void CDWGView::SetJuchiboLed()
{
CWnd* pWnd=GetDlgItem(IDC_STATIC_jucibo);
CDC* pControlDC=pWnd->GetDC();
pWnd->Invalidate();
pWnd->UpdateWindow();
pControlDC->SelectStockObject(BLACK_BRUSH);
CBitmap mBit;
CDC MemDC;
MemDC.CreateCompatibleDC(NULL);
if(Select==2)
mBit.LoadBitmap(IDB_ON);
else
mBit.LoadBitmap(IDB_OFF);
CBitmap *pOldBit=MemDC.SelectObject(&mBit);
pControlDC->BitBlt(0,0,900,700,&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(pOldBit);
}
void CDWGView::SetSinLed()
{
CWnd* pWnd=GetDlgItem(IDC_STATIC_sin);
CDC* pControlDC=pWnd->GetDC();
pWnd->Invalidate();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -