3.1.3 添加RECOURCE资源 在“RECOURCE VIEW”中,展开“ICON”目录,右键单击,选择“IMPORT”选项,则会弹出以下对话框: 内容来自www.paper51.com paper51.com 图9 导入位图资源界面 copyright paper51.com 选择你所要导入的图标所在文件的目录及相应的图标,然后在“ICON”目录下就会显示刚刚导入的图标,导入之后并设置相应的属性如“ID”。添加相应的图标之后,在Dlg.cpp文件中的BOOL CMy22Dlg::OnInitDialog()函数中添加以下代码为每个按扭加载图标 内容来自论文无忧网 www.paper51.com m_btnvoltplus.SetIcon (IDI_LEFT); //为“幅值增加”按扭设置图标m_btnvoltminus.SetIcon (IDI_RIGHT); //为“幅值减小”按扭设置图标 copyright paper51.com m_btntimeplus.SetIcon (IDI_LEFT); //为“时间增加”按扭设置图标m_btntimeminus.SetIcon (IDI_RIGHT); //为“时间减少”按扭设置图标 copyright paper51.com m_btnaplus.SetIcon (IDI_UP); http://www.paper51.com
m_btnAMinus.SetIcon (IDI_DOWN); 内容来自www.paper51.com m_btnbplus.SetIcon (IDI_UP); paper51.com m_btnbminus.SetIcon (IDI_DOWN); 内容来自www.paper51.com 同时对STATIC TEXT对象m_wndscope设置标题和度量单位显示的设置 copyright paper51.com m_wndscope.SetTitle("虚拟示波器");//显示标题 http://www.paper51.com m_wndscope.SetValueString ("电压","伏");//设置波形显示时的幅值单位 paper51.com
SetTimer (1, 20, NULL); 内容来自论文无忧网 www.paper51.com
3.1.4 定时器成员函数 内容来自www.paper51.com
在Dlg.cpp文件中添加定时器函数OnTimer(UINT nIDEvent),在定时器函数中实现正弦波和余弦波以及方波的的波形实现函数 内容来自www.paper51.com 方波的波形实现:首先要定义一个Double类型的变量dTime,调用系统提供的一个全局函数::timeGetTime()来获取系统当前的时间,然后把获取的系统当前时间赋值给dTime。因为方波的只有两个逻辑值,那就是低电平和高电平的显示。所以本文作者在本系统中申明了一个Int类型的变量iTime,通过iTime对2取余,即可实现只有0和1两种值的功能完整的代码实现: http://www.paper51.com Double dTime =:timeGetTime ()/1000.0;//获取系统当前时间 http://www.paper51.com int iTime= dTime;//对“dTime”类型进行强制类型转换 copyright paper51.com
dValue[0] = 4*(iTime%2);//实现只取逻辑值0和1的表达式 http://www.paper51.com 余弦波的波形实现:余弦波的波形实现与方波的实现有些类似,但是在实现正弦波的时候,本文作者需要用到数学中的一个sin()函数,因此在Dlg.cpp中就要引用<math.h>头文件。但是Sin () 函数中的参数是直接获取的系统当前时间。完整的代码实现: 内容来自论文无忧网 www.paper51.com Double dTime =:timeGetTime ()/1000.0;//获取系统时间 内容来自www.paper51.com
dValue[1] = 5*sin(4*dTime) ;//实现余弦波的表达式 内容来自www.paper51.com 上面两个函数的实现中有用到的dValue[0]和dValue[1]是作者在OnTimer(UINT nIDEvent)函数中定义的存放方波和弦波值的一个一维数组 copyright paper51.com
3.1.5 通道的选择 内容来自论文无忧网 www.paper51.com
在本系统中,作者用到了三个通道来分别实现单踪波A和单踪波B以及双踪波的选择,在IDD_MY_DLALOG中作者设置了三个RADIO按扭,所以在实现通道选择的时候,本文作者使用GetCheckedRadioButton()函数来获取按下的是哪一个按扭,int nID=GetCheckedRadioButton(IDC_RADIO1, IDC_RADIO3),IDC_RADIO1为第一个按扭的ID,IDC_RADIO3为最后一个按扭的ID,然后我们再判断nID与IDC_RADIO1,IDC_RADIO2,IDC_RADIO3的关系。部分代码如下: 内容来自www.paper51.com int nID=GetCheckedRadioButton(IDC_RADIO1,IDC_RADIO3); http://www.paper51.com If (nID==IDC_RADIO1) paper51.com
{ 内容来自www.paper51.com m_wndScope.ClearB(); paper51.com //删除正弦波相关函数,释放内存 copyright paper51.com m_wndScope.AddValueA(dTime,dValue[0]); 内容来自www.paper51.com //随波形的变化增加波形的末断端点 copyright paper51.com m_wndScope.SetValueA(dValue[0]); 内容来自论文无忧网 www.paper51.com
//在对话框中产生一个从-4到4变化的数值 copyright paper51.com
} 内容来自www.paper51.com DevalueA (dTime,dValue[0])与SetValueA(dValue[0])两个函数的具体实现都可以在Scope.cpp类中找到 copyright paper51.com 3.1.6 BUTTON单击事件的设计 copyright paper51.com 在本系统的对话框中设置了8个BUTTON,在本文的前章节中已经讲过了如何为这8个BUTTON添加消息处理函数,分别为voidCMy22Dlg::OnVoltplus(),OnVoltminus(),OnTimeplus(),OnTimeminus(),OnAplus(),OnAminus(),OnBplus(),OnBminus(),但是在前章节中并没有写如何对消息处理的,点击相应的按扭,都会触使m_wndscope这个TEXT对象中的波形的改变,因此在本系统中,作者在每个BUTTON的消息处理函数中都调用了m_wndscop.button(i)。部分代码如下: paper51.com Void CMyDlg::OnVoltplus() 内容来自论文无忧网 www.paper51.com
{ 内容来自论文无忧网 www.paper51.com m_wndScope.Button (0); http://www.paper51.com
} 内容来自论文无忧网 www.paper51.com Void CMyDlg::OnVoltminus() 内容来自www.paper51.com { http://www.paper51.com m_wndScope.Button (1); 内容来自www.paper51.com } 内容来自论文无忧网 www.paper51.com
………………………省略部分BUTTON的消息处理函数 copyright paper51.com Void CMyDlg::OnBplus() 内容来自论文无忧网 www.paper51.com
{ paper51.com m_wndScope.Button (6); http://www.paper51.com } paper51.com Void CMyDlg::OnBminus() 内容来自www.paper51.com { 内容来自www.paper51.com m_wndScope.Button (7); copyright paper51.com } paper51.com 在scope.cpp的button(i)中,用Switch语句来判断按下的是哪个按扭,并写出相应的消息处理。部分代码如下: paper51.com Void CScope::Button( inti ) paper51.com { paper51.com Switch(i) 内容来自论文无忧网 www.paper51.com {Case0://如果按下的是“IDC_VOLTPLUS”按扭,则调节波形的幅值 http://www.paper51.com { copyright paper51.com If(m_dDimY>=1&&m_dDimY<10) 内容来自www.paper51.com m_dDimY+=1; paper51.com
If(m_dDimY>=10&&m_dDimY<100) copyright paper51.com m_dDimY+=10; paper51.com If(m_dDimY>=100&&m_dDimY<1000) http://www.paper51.com m_dDimY+=100; 内容来自论文无忧网 www.paper51.com If(m_dDimY>=1000) paper51.com
m_dDimY+=1000; paper51.com Elseif (m_dDimY>=0&&m_dDimY<1) copyright paper51.com
m_dDimY+=0.1; 内容来自论文无忧网 www.paper51.com Break; paper51.com } // 鼠标点击箭头按钮控制幅度的增加 http://www.paper51.com
Case1: //如果按下的是“IDC_VOLTMINUS”按扭 paper51.com
{ 内容来自www.paper51.com If(m_dDimY>1&&m_dDimY<=10) copyright paper51.com M_dDimY-=1; 内容来自论文无忧网 www.paper51.com If(m_dDimY>10&&m_dDimY<=100) copyright paper51.com M_dDimY-=10; 内容来自www.paper51.com
If(m_dDimY>100&&m_dDimY<=1000) copyright paper51.com M_dDimY-=100; 内容来自论文无忧网 www.paper51.com
If(m_dDimY>1000) copyright paper51.com M_dDimY-=1000; copyright paper51.com If(m_dDimY<=1) paper51.com m_dDimY=max (m_dDimY-0.1, 0.1); 内容来自论文无忧网 www.paper51.com Break; http://www.paper51.com
} paper51.com Case2: //如果按下的是“IDC_TIMEPLUS”按扭 paper51.com {m_dDimT+=0.1;break ;} //则每按下一次按扭,时间增加幅度为“0.1” 内容来自论文无忧网 www.paper51.com
Case3: //如果按下的是“IDC_TIMEPLUS”按钮 {m_dDimT=max (m_dDimT-0.1, 0.1); break ;} http://www.paper51.com //则如果当前时间大于0.1,则单位时间减1,如果不是,则当前时间取0.1 内容来自www.paper51.com Case4://如果按下的是“IDC_AMINUS” http://www.paper51.com { copyright paper51.com If(m_Amove>-60) paper51.com m_Amove=m_Amove-10; http://www.paper51.com Break; paper51.com
}//则A的 paper51.com
Case5: copyright paper51.com { copyright paper51.com If(m_Amove<60) 内容来自论文无忧网 www.paper51.com m_Amove=m_Amove+10; paper51.com Break; http://www.paper51.com } 内容来自www.paper51.com Case6: 内容来自www.paper51.com { 内容来自论文无忧网 www.paper51.com If(m_Bmove>-60) paper51.com
m_Bmove=m_Bmove-10; http://www.paper51.com Break; paper51.com } http://www.paper51.com
Case7: paper51.com
{ http://www.paper51.com If(m_Bmove<60) http://www.paper51.com m_Bmove=m_Bmove+10; http://www.paper51.com Break; paper51.com } paper51.com Default: copyright paper51.com Break; copyright paper51.com } http://www.paper51.com
Invalidate(); paper51.com } http://www.paper51.com |