VC++图形例子(7页).doc
-VC+图形例子-第 7 页7.1.4 设计任务利用Visual C+编写应用程序实现PCI-1710HG多功能板卡模拟量输入:1以间隔或连续方式读取电压测量值,并以数值或曲线形式显示电压测量变化值;2当测量电压小于或大于设定下限或上限值时,程序画面中相应指示灯变换颜色。7.1.5 任务实现使用研华板卡编程之前必须首先安装研华设备管理程序Device Manager和32bit DLL驱动程序。同时研华提供ActiveDAQ控件,供VB等可视化语言对其板卡编程使用。(一)利用ActiveDAQ控件实现模拟量输入1 建立工程1)启动Microsoft Visual C+6.0,单击“开发环境”的“文件”菜单中的“新建”命令,以显示新建对话框,然后选择“MFC AppWizard(exe)”类型,输入需要创建工程的名称“AI”和目录。2)按照弹出的应用向导对话框依次填写,第1步选择基于对话框,其他均采用默认。3)单击“完成”,将会弹出一个关于新工程信息的对话框,如图7-2所示。单击“确定”按钮。这样MFC向导便自动生成了一个名称为“AI”的工程。图7-2 工程AI生成界面2 资源创建1)应用程序中添加了一个对话框资源IDD_AI_DIALOG,打开属性对话框,将对话框标题改为“模拟电压采集”,字体设为10。2)为了实现模拟量输入,添加DAQAI控件。选择“工程”菜单中的“增加到工程”命令下的“Components and Controls”选项,在弹出的对话框中双击“Registered ActiveX Controls”项,选择“Advantech ActiveDAQ AI Control”项,单击“插入”按钮,在弹出的对话框中单击“确定”按钮,再在弹出的对话框中单击“确定”按钮关闭对话框,所选择的控件就会出现在“控件工具栏”中,然后将其添加到对话框中相应位置。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所示图7-3 程序界面设计。4)添加成员变量,在“查看”菜单中或在对话框上单击鼠标右键,打开“建立类向导”的Member Variables标签,选中所需的控件ID号,双击鼠标或单击Add Variables按钮,依次为表7-3中所列控件增加成员变量。表7-3 成员变量控件ID号变量类型变量名IDC_DAQAICTRL1CDAQAIm_daqaiIDC_EDIT1floatm_cygsIDC_EDIT2floatm_dyz5)切换到“建立类向导”的Message Maps标签页或在对话框中双击每一个按钮,为按钮“板卡设置”,“间断采集”,“连续采集”,“关闭程序”分别添加ON_BN_CLICKED消息响应函数OnButton1(),OnButton2(),OnButton3(),OnCancel();为CAIDlg添加时钟WM_TIMER消息响应函数OnTimer()。3函数代码实现1)在AIDlg.cpp文件的开始处,增加全局变量,代码如下:/ CAboutDlg dialog used for App AboutCRect conRect;float data1000; /存放采样数据int num=0;/数值个数2)在AIDlg.cpp文件中,设置初始化函数OnInitDialog(),添加代码实现对话框各控件的初始化工作,代码如下:BOOL CAIDlg:OnInitDialog() /VC自动生成的代码/ TODO: Add extra initialization here GetDlgItem(IDC_BUTTON2)->EnableWindow(false); /设置间断采集按钮无效 GetDlgItem(IDC_BUTTON3)->EnableWindow(false); /设置连续采集按钮无效GetDlgItem(IDCANCEL)->EnableWindow(false); /设置关闭程序按钮无效return TRUE; / return TRUE unless you set the focus to a control3)实现板卡设置按钮、间断采集按钮、连续采集按钮、关闭程序按钮相应的消息响应函数OnButton1(),OnButton2(),OnButton3(),OnCancel()。代码如下:void CAIDlg:OnButton1() /板卡设置按钮设置/ TODO: Add your control notification handler code herem_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); /设置关闭程序按钮有效void CAIDlg:OnButton2() /间断采集按钮设置/ TODO: Add your control notification handler code hereKillTimer(1); /终止时钟 qs();/取数void CAIDlg:OnButton3() /连续采集按钮设置 renew();SetTimer(1,1000,NULL); /设置时钟void CAIDlg:OnCancel() /关闭程序按钮设置/ TODO: Add your control notification handler code herem_daqai.CloseDevice(); /关闭板卡模拟量输入端口KillTimer(1);CDialog:OnCancel();4)实现时钟消息响应函数OnTimer(),在连续采集按钮中实现数据的连续采集并画图,代码如下:void CAIDlg:OnTimer(UINT nIDEvent) /时钟消息/ TODO: Add your message handler code here and/or call defaultqs();CDialog:OnTimer(nIDEvent);5)为了实现取值、画图、刷新等功能,及对话框资源上的绿色圆形上下限报警指示灯,在AIDlg.cpp中增加成员函数,具体代码如下:void CAIDlg:renew() /刷新CWnd *pWnd=GetDlgItem(IDC_picture); /清空pWnd->UpdateWindow();CDC *pDC=pWnd->GetDC();CBrush rebrush;rebrush.CreateSolidBrush(RGB(255,255,255); /创建白色画刷CBrush *pOldBrush=pDC->SelectObject(&rebrush);CPen *PNewPen=new CPen;PNewPen->CreatePen(PS_SOLID,1,RGB(255,255,255); /创建白色画笔CPen *POLDPen=pDC->SelectObject(PNewPen);CRect rect;pWnd->GetClientRect(rect);pDC->Rectangle(rect);/绘制白色矩形框pDC->SelectObject(pOldBrush); pDC->SelectObject(POLDPen); delete PNewPen; m_cygs = 0.0f;m_dyz = 0.0f;for(int i=0;i<=num-1;i+) datai=0;num=0;void CAIDlg:qs( ) /取值 if(num>99) renew(); datanum=m_daqai.RealInput(0); m_dyz=datanum; if(datanum<=0.5) DrawA(IDC_STATIC1,0x00000FF0); /下限报警指示灯为红色 if(datanum<3.5&&datanum>0.5) DrawA(IDC_STATIC1,0x0000FF00); /正常均为绿色 DrawA(IDC_STATIC2,0x0000FF00); if(datanum>=3.5) DrawA(IDC_STATIC2,0x00000FF0); /上限报警指示灯为红色 num=num+1; m_cygs=(float)num; /编辑框中显示相应值 UpdateData(false); huatu();void CAIDlg:huatu() /画线 long x,y;/坐标 CWnd *pWnd=GetDlgItem(IDC_picture); /建立画笔 CRect rect; pWnd->GetClientRect(rect); CDC *pDC=pWnd->GetDC(); CPen *PNewPen=new CPen; PNewPen->CreatePen(PS_SOLID,1,RGB(255,0,0); /设置线型及颜色 CPen *POLDPen=pDC->SelectObject(PNewPen); pDC->MoveTo(rect.left,rect.bottom-5); /起始点 for(int i=1;i<=num-1;i+) x=rect.left+2*i; y=rect.bottom-5*(int)(datai/60.0*rect.Height(); pDC->LineTo(x,y); /画线 if(x>rect.Width()-20) /确定画线区域 renew(); pDC->MoveTo(rect.left,rect.bottom-5); pDC->SelectObject(POLDPen); delete PNewPen;void CADlg:DrawA(int nID,long ys) /绘制上下限报警指限示灯 CWnd *pWnd=GetDlgItem(nID); /在相应图像控件中设圆形报警指示灯 CDC *pDC=pWnd->GetDC(); :GetClientRect(pWnd->m_hWnd,conRect); CBrush NewBrush(COLORREF)ys); /指示灯绿色 CBrush *pOldBrush=pDC->SelectObject(&NewBrush); pDC->SetViewportOrg(conRect.right/2,conRect.bottom/2); /保证圆形在矩形图像控件的中央 pDC->Ellipse(-20,-20,20,20); /画圆,大小可调 pDC->SelectObject(pOldBrush); pWnd->ReleaseDC(pDC); 6)为了保证上述新增成员函数的实现,需在aiDlg.h中对增加的成员函数进行说明(或可在Class Wizard中增加),代码如下:class CAIDlg : public CDialog/ Constructionpublic:CAiDlg(CWnd* pParent = NULL);/ standard constructor(原有代码) void DrawA(int nID,long ys); /绘制上下报警指限示灯 void qs(); /取值 void huatu(); /画图 void renew(); /刷新/ Dialog Data/AFX_DATA(CAiDlg)7)为了在对话框资源运行时添加上圆形上下限报警指示灯,需在AIDlg.cpp的OnPaint()函数中增加如下代码:void CAIDlg:OnPaint() / VC自动生成的代码elseDrawA(IDC_STATIC1,0x0000FF00); /在指定控件中绘制圆形上下限报警灯,均为绿色 DrawA(IDC_STATIC2,0x0000FF00); CDialog:OnPaint();4运行程序程序设计、调试完毕,运行程序。1)首先进行板卡设置:单击“板卡设置”按钮,选中板卡设备:000:PCI-1710HG I/O=C000 Ver.A,单击“Select”按钮。2)转动电位器旋钮,改变其输出电压(范围是05V),线路中AI指示灯亮度随之变化,同时,连续单击“间断采集”按钮或单击一次“连续采集”按钮,程序窗体中文本对象中的数字、图形控件中的曲线都将随电位器输出电压变化而变化。3)当测量电压小于或大于设定下限电压值(0.5V)或上限电压值(3.5V)时,程序画面中相应指示灯由绿色变为红色。图7-4 程序运行界面