您好,欢迎访问三七文档
7.1.4设计任务利用VisualC++编写应用程序实现PCI-1710HG多功能板卡模拟量输入:1.以间隔或连续方式读取电压测量值,并以数值或曲线形式显示电压测量变化值;2.当测量电压小于或大于设定下限或上限值时,程序画面中相应指示灯变换颜色。7.1.5任务实现使用研华板卡编程之前必须首先安装研华设备管理程序DeviceManager和32bitDLL驱动程序。同时研华提供ActiveDAQ控件,供VB等可视化语言对其板卡编程使用。(一)利用ActiveDAQ控件实现模拟量输入1.建立工程1)启动MicrosoftVisualC++6.0,单击“开发环境”的“文件”菜单中的“新建”命令,以显示新建对话框,然后选择“MFCAppWizard(exe)”类型,输入需要创建工程的名称“AI”和目录。2)按照弹出的应用向导对话框依次填写,第1步选择基于对话框,其他均采用默认。3)单击“完成”,将会弹出一个关于新工程信息的对话框,如图7-2所示。单击“确定”按钮。这样MFC向导便自动生成了一个名称为“AI”的工程。2.资源创建1)应用程序中添加了一个对话框资源IDD_AI_DIALOG,打开属性对话框,将对话框标题改为“模拟电压采集”,字体设为10。2)为了实现模拟量输入,添加DAQAI控件。选择“工程”菜单中的“增加到工程”命令下的“ComponentsandControls”选项,在弹出的对话框中双击“RegisteredActiveXControls”项,选择“AdvantechActiveDAQAIControl”项,单击“插入”按钮,在弹出的对话框中单击“确定”按钮,再在弹出的对话框中单击“确定”按钮关闭对话框,所选择的控件就会出现在“控件工具栏”中,然后将其添加到对话框中相应位置。图7-2工程AI生成界面3)删除对话框中原来的“确定”按钮和Static文本,用编辑器为对话框添加如下表7-2所示的控件。表7-2对话框的控件类型、ID及相关属性控件类型ID号标题属性功能图像IDC_picture默认矩形,白色绘图区静态文本默认采样个数:默认采样电压个数标签静态文本默认当前电压值:默认采样电压值标签编辑框IDC_EDIT1——默认显示采样电压个数编辑框IDC_EDIT2——默认显示当前采样电压值静态文本默认下限指示灯:默认报警指示灯标签静态文本默认上限指示灯:默认报警指示灯标签静态文本默认V默认电压单位V标签图像IDC_STATIC1——框架,灰色显示圆形下限报警指示灯区域图像IDC_STATIC2——框架,灰色显示圆形上限报警指示灯区域按钮IDC_BUTTON1板卡设置默认设置板卡命令按钮IDC_BUTTON2间断采集默认间断采集电压命令按钮IDC_BUTTON3连续采集默认连续采集电压命令按钮IDCANCEL关闭程序默认关闭程序命令DAQAIIDC_DAQAICTRL1程序中设置板卡模拟量输入控件设计的程序界面如图7-3所示。4)添加成员变量,在“查看”菜单中或在对话框上单击鼠标右键,打开“建立类向导”的MemberVariables标签,选中所需的控件ID号,双击鼠标或单击AddVariables按钮,依次为表7-3中所列控件增加成员变量。表7-3成员变量控件ID号变量类型变量名IDC_DAQAICTRL1CDAQAIm_daqaiIDC_EDIT1floatm_cygsIDC_EDIT2floatm_dyz5)切换到“建立类向导”的MessageMaps标签页或在对话框中双击每一个按钮,为按图7-3程序界面设计钮“板卡设置”,“间断采集”,“连续采集”,“关闭程序”分别添加ON_BN_CLICKED消息响应函数OnButton1(),OnButton2(),OnButton3(),OnCancel();为CAIDlg添加时钟WM_TIMER消息响应函数OnTimer()。3.函数代码实现1)在AIDlg.cpp文件的开始处,增加全局变量,代码如下://CAboutDlgdialogusedforAppAboutCRectconRect;floatdata[1000];//存放采样数据intnum=0;//数值个数2)在AIDlg.cpp文件中,设置初始化函数OnInitDialog(),添加代码实现对话框各控件的初始化工作,代码如下:BOOLCAIDlg::OnInitDialog(){…//VC自动生成的代码//TODO:AddextrainitializationhereGetDlgItem(IDC_BUTTON2)-EnableWindow(false);//设置间断采集按钮无效GetDlgItem(IDC_BUTTON3)-EnableWindow(false);//设置连续采集按钮无效GetDlgItem(IDCANCEL)-EnableWindow(false);//设置关闭程序按钮无效returnTRUE;//returnTRUEunlessyousetthefocustoacontrol}3)实现板卡设置按钮、间断采集按钮、连续采集按钮、关闭程序按钮相应的消息响应函数OnButton1(),OnButton2(),OnButton3(),OnCancel()。代码如下:voidCAIDlg::OnButton1()//板卡设置按钮设置{//TODO:Addyourcontrolnotificationhandlercodeherem_daqai.SelectDevice();//为DAQAI设置,选择设备m_daqai.OpenDevice();//打开模拟量输入端口m_daqai.SetCyclicMode(true);//循环方式采集数据m_daqai.SetStartChannel(0);//通道号0m_daqai.SetSampleRate(500);//采样频率m_daqai.SetDataType(0);//返回值类型GetDlgItem(IDC_BUTTON2)-EnableWindow(TRUE);//设置间断采集按钮有效GetDlgItem(IDC_BUTTON3)-EnableWindow(TRUE);//设置连续采集按钮有效GetDlgItem(IDCANCEL)-EnableWindow(TRUE);//设置关闭程序按钮有效}voidCAIDlg::OnButton2()//间断采集按钮设置{//TODO:AddyourcontrolnotificationhandlercodehereKillTimer(1);//终止时钟qs();//取数}voidCAIDlg::OnButton3()//连续采集按钮设置{renew();SetTimer(1,1000,NULL);//设置时钟}voidCAIDlg::OnCancel()//关闭程序按钮设置{//TODO:Addyourcontrolnotificationhandlercodeherem_daqai.CloseDevice();//关闭板卡模拟量输入端口KillTimer(1);CDialog::OnCancel();}4)实现时钟消息响应函数OnTimer(),在连续采集按钮中实现数据的连续采集并画图,代码如下:voidCAIDlg::OnTimer(UINTnIDEvent)//时钟消息{//TODO:Addyourmessagehandlercodehereand/orcalldefaultqs();CDialog::OnTimer(nIDEvent);}5)为了实现取值、画图、刷新等功能,及对话框资源上的绿色圆形上下限报警指示灯,在AIDlg.cpp中增加成员函数,具体代码如下:voidCAIDlg::renew()//刷新{CWnd*pWnd=GetDlgItem(IDC_picture);//清空pWnd-UpdateWindow();CDC*pDC=pWnd-GetDC();CBrushrebrush;rebrush.CreateSolidBrush(RGB(255,255,255));//创建白色画刷CBrush*pOldBrush=pDC-SelectObject(&rebrush);CPen*PNewPen=newCPen;PNewPen-CreatePen(PS_SOLID,1,RGB(255,255,255));//创建白色画笔CPen*POLDPen=pDC-SelectObject(PNewPen);CRectrect;pWnd-GetClientRect(rect);pDC-Rectangle(rect);//绘制白色矩形框pDC-SelectObject(pOldBrush);pDC-SelectObject(POLDPen);deletePNewPen;m_cygs=0.0f;m_dyz=0.0f;for(inti=0;i=num-1;i++)data[i]=0;num=0;}voidCAIDlg::qs()//取值{if(num99)renew();data[num]=m_daqai.RealInput(0);m_dyz=data[num];if(data[num]=0.5)DrawA(IDC_STATIC1,0x00000FF0);//下限报警指示灯为红色if(data[num]3.5&&data[num]0.5){DrawA(IDC_STATIC1,0x0000FF00);//正常均为绿色DrawA(IDC_STATIC2,0x0000FF00);}if(data[num]=3.5)DrawA(IDC_STATIC2,0x00000FF0);//上限报警指示灯为红色num=num+1;m_cygs=(float)num;//编辑框中显示相应值UpdateData(false);huatu();}voidCAIDlg::huatu()//画线{longx,y;//坐标CWnd*pWnd=GetDlgItem(IDC_picture);//建立画笔CRectrect;pWnd-GetClientRect(rect);CDC*pDC=pWnd-GetDC();CPen*PNewPen=newCPen;PNewPen-CreatePen(PS_SOLID,1,RGB(255,0,0));//设置线型及颜色CPen*POLDPen=pDC-SelectObject(PNewPen);pDC-MoveTo(rect.left,rect.bottom-5);//起始点for(inti=1;i=num-1;i++){x=rect.left+2*i;y=rect.bottom-5*(int)(data[i]/60.0*rect.Height());pDC-LineTo(x,y);//画线if(xrect.Width()-20)//确定画线区域{renew();pDC-MoveTo(rect.left,rect.bottom-5);}}pDC-SelectObject(POLDPen);deletePNewPen;}voidCADlg::DrawA(intnID,longys)//绘制上下限报警指限示灯{CWnd*pWnd=GetDlgItem(nID);//在相应图像控件中设圆形报警指示灯CDC*pDC=pWnd-GetDC();::GetClientRect(pWnd-m_hWnd,conRect);CBrushNewBrush((COLORREF)ys);//指示灯绿色CBrush*pOldBrush=pDC-SelectObject(&NewBrush);pDC-SetViewportOrg(conRect.right/2,conRect.bottom/2);//保证圆形在矩形图像控件的中央pDC-Ellipse(-20,-20,20,20);//画圆,大小可调pDC-SelectObject(pOldBr
本文标题:VC++图形例子
链接地址:https://www.777doc.com/doc-4709543 .html