LabWindowsCVI 程序 回调函数设计Word下载.docx
《LabWindowsCVI 程序 回调函数设计Word下载.docx》由会员分享,可在线阅读,更多相关《LabWindowsCVI 程序 回调函数设计Word下载.docx(12页珍藏版)》请在冰豆网上搜索。
在LabWindows/CVI中,由五类对象可通过事件触发回调函数,即控件触发、面板触发、菜单触发、定时器触发和主回调函数触发,回调函数触发优先级定义如下。
控件触发优先级:
●控件回调函数
●面板回调函数(键盘和鼠标事件)
●主回调函数
面板触发优先级:
●面板回调函数
菜单触发优先级:
●菜单项回调函数
定时器触发优先级:
主回调函数触发优先级:
值得注意的是,EVENT_COMMIT事件是存放在用户事件队列中的,通过GetUserEvent函数
传递给所有回调函数。
1.1.2回调函数程序设计
(1)面板设计
编写一个伪随机信号发生器程序,并将产生的数据在Graph控件中显示出来,将生成程序的文件名在String控件中显示。
为了使整个面板居中显示,双击面板调出EditPanel对话框,选择Auto-CenterVerTIcally(whenloaded)和Auto-Centerhorizontally(whenloaded),并点击OtherAttributes按钮,选择Movable、CanMinimize、TItleBarVisible、UseWindowsVisualStylesforControls项。
面板设计如图1-1所示,面板中主要控件属性设置如表1-1所示。
图1-1回调函数面板
表1-1控件属性设置表
(2)程序源代码
//头文件声明,系统自动添加
#include《ansi_c.h》
#include《cvirte.h》
#include《userint.h》
#include回调函数.h
//全局静态变量
staTIcintpanelHandle;
//主函数
intmain(intargc,char*argv[])
{
//初始化LabWindows/CVI运行时库引擎
if(InitCVIRTE(0,argv,0)==0)
//如果返回值为0,则初始化失败,返回1
return1;
//装载面板,返回面板句柄
if((panelHandle=LoadPanel(0,回调函数.uir,PANEL))《0)
//如果装载面板失败,则返回1
//获得*argv[]中的字符串,即为文件名
SetCtrlVal(panelHandle,PANEL_STRING,argv[0]);
//显示面板
DisplayPanel(panelHandle);
//运行用户界面
RunUserInterface();
//删除面板句柄
DiscardPanel(panelHandle);
//主函数执行成功,返回0
return0;
}
//面板回调函数
intCVICALLBACKPanelCB(intpanel,intevent,void*callbackData,
inteventData1,inteventData2)
switch(event)
//面板响应事件
caseEVENT_CLOSE:
//调用退出按钮的EVENT_COMMIT事件
QuitCallback(panelHandle,PANEL_QUITBUTTON,EVENT_COMMIT,0,0,0);
break;
//函数返回值,0表示成功
//退出按钮
intCVICALLBACKQuitCallback(intpanel,intcontrol,intevent,
void*callbackData,inteventData1,inteventData2)
if(event==EVENT_COMMIT)
//退出用户界面
QuitUserInterface(0);
//显示按钮
intCVICALLBACKOkCallback(intpanel,intcontrol,intevent,
//定义局部变量
inti;
doubledatapoints[100];
caseEVENT_COMMIT:
//产生100个随机数,放入数组datapoints中
for(i=0;
i《100;
i++)
datapoints[i]=rand()/32767.0*100.0;
//清除以前Graph中绘制的波形
DeleteGraphPlot(panelHandle,PANEL_GRAPH,-1,VAL_IMMEDIATE_DRAW);
//在Graph中绘制波形
PlotY(panelHandle,PANEL_GRAPH,datapoints,100,VAL_DOUBLE,VAL_THIN_LINE,
VAL_EMPTY_SQUARE,VAL_SOLID,1,VAL_RED);
3:
程序注释
①main函数
每一个C程序都必须从一个main函数开始,在调用其他函数流程后再次回到main函数,并且在main函数中结束整个程序的运行。
实际上,main函数可以放在程序的任何地方:
有些程序员喜欢把它放在最前面,而另一些程序员把它放在最后面,无论放在哪个地方,以下几点说明都是适合的。
在C语言中,main函数可以有三个参数,即:
argc,argv和env。
argc:
整数类型,表示传给main函数的命令行参数个数,一般为1。
*argv[]:
二维字符串数组。
在LabWindows/CVI中,argv[0]为程序运行时的文件名,与编译设置有关,在菜单BuildConfiguraTIon下有两个选项,即:
Release和Debug。
当选择Release时,argv[0]为当前工程名加上.exe;
当选择Debug时,argv[0]为当前工程名加上_dbg.exe。
argv[argc]为NULL。
*env:
二维字符串数组,为环境变量。
在LabWindows/CVI中,env[]一般为空字符串且省略不写。
LabWindows/CVI启动时总是把这三个参数传递给main函数,参数的传递顺序为:
argc、argv、env,可以在用户程序中加以说明也可以不说明,如果说明了部分或全部参数,它们就成为main主函数的局部变量。
main主函数的声明方式主要有以下几种:
main(void)
main(intargc,char*argv[])
main(intargc,char*argv[],char*env[])
②InitCVIRTE函数
初始化LabWindows/CVI运行时(库)引擎。
在使用外部编译器VisualC++、BorlandC++Builder时调用,如果不使用外部编译器,不会影响程序正常运行。
函数原型为:
intInitCVIRTE(void*HInstance,char*Argv[],void*Reserved);
*HInstance:
对于main函数应为0;
对于WinMain函数应为hInstance;
对于DllMain应为
hInstDLL。
*Argv[]:
对应于main函数的*argv[]参数。
*Reserved:
保留参数,设置为0。
一般在使用main函数、WinMain函数、DllMain函数时,InitCVIRTE函数的参数设置稍有不
同,其具体调用方式如下所示:
main函数
/*outofmemory*///用户程序
}WinMain函数
int__stdcallWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpszCmdLine,int
nCmdShow)
if(InitCVIRTE(hInstance,0,0)==0)
}DllMain函数
int__stdcallDllMain(void*hinstDLL,intfdwReason,void*lpvReserved)
if(fdwReason==DLL_PROCESS_ATTACH)
if(InitCVIRTE(hinstDLL,0,0)==0)
//用户ATTACH程序
elseif(fdwReason==DLL_PROCESS_DETACH)
//用户DETACH程序
CloseCVIRTE();
LabWindows/CVI运行时库引擎主要用在程序发布,并安装在其他计算机上独立运行时。
运行时库包括:
UserInterfaceLibrary、AdvancedAnalysisLibrary、FormattingandI/OLibrary、UtilityLibrary、ANSICLibrary、RS-232Library、TCPSupportLibrary、InternetLibrary、NetworkVariableLibrary、DDESupportLibrary、ActiveXLibrary、DIAdemConnectivityLibrary、TDMStreamingLibrary、.NETLibrary等。
③LoadPanel函数装载用户界面文件(*.uir)或文本用户界面(*.tui)到内存中。
装载后,面板不可见,需要调用DisplayPanel函数来显示面板。
intLoadPanel(intParent_Panel_Handle,charFilename[],intPanel_Resource_ID);
Parent_Panel_Handle:
父面板句柄。
如果为0,则表示所装载的面板为顶层窗口;
如果为面板句柄,则表示所装载的面板为该面板的子面板。
Filename[]:
用户界面文件(*.uir)或文本用户界面(*.tui)的文件名。
可以包含全部的路径名或只包含一个简单的文件名,如果为简单的文件名,则必须与工程文件在同一目录下。
Panel_Resource_ID:
面板常量名。
返回值:
面板句柄。
④DisplayPanel函数将内存中装载的面板显示出来。
intDisplayPanel(intPanel_Handle);
Panel_Handle:
⑤RunUserInterface函数
运行用户界面并响应回调函数事件。
RunUserInterface在程序开始后始终运行,直到调用
QuitUserInterface函数时才返回。
intRunUserInterface(void);
返回由用户在QuitUserInterface函数的参数中设置的值。
⑥QuitUserInterface函数
QuitUserInterface函数并不直接终止程序的运行,而是使RunUserInterface函数返回一个特定值,并进入终止程序运行处理过程。
staticintpanelHandle;
intstatus;
if((panelHandle=LoadPanel(0,sample.uir,PANEL))《0)
//返回值status为10,即:
QuitUserInterface函数的参数设置值
status=RunUserInterface();
intCVICALLBACKQuitCallback(intpanel,intcontrol,intevent,void*callbackData,inteventData1,int
eventData2)
//QuitUserInterface的参数值为10,即RunUserInterface的返回值
QuitUserInterface(10);
⑦DiscardPanel函数释放面板资源,包含父面板下的子面板。
intDiscardPanel(intPanel_Handle);
⑧SetCtrlVal函数设置控件值。
intSetCtrlVal(intPanel_Handle,intControl_ID,);
Control_ID:
控件常量,通常在头文件中声明。
:
设置值。
⑨rand函数产生0~32767之间的伪随机数。
intrand(void);
伪随机数。
⑩DeleteGraphPlot函数删除控件所绘制的图形。
intDeleteGraphPlot(intPanel_Handle,intControl_ID,intPlot_Handle,intRefresh);
Panel_Handle:
控件常量。
Plot_Handle:
绘图句柄,表示所要删除的图形,如果为1,则删除所有图形。
Refresh:
刷新方式。
主要有三种刷新方式,包括:
VAL_DELAYED_DRAW、VAL_IMMEDIATE_DRAW、VAL_NO_DRAW。
⑪PlotY函数沿X轴方向绘制图形,其中Y轴为数据点。
intPlotY(intPanel_Handle,intControl_ID,void*Y_Array,intNumber_of_Points,floatY_Data_Type[],intPlot_Style,intPoint_Style,intLine_Style,intPoint_Frequency,intColor);
面板句柄,指控件所在的面板。
*Y_Array:
绘制图形的数据点数组,其数据类型为Y_Data_Type[]所指定的类型。
Number_of_Points:
绘制图形的数据点数,*Y_Array中所包含的数据点数应不小于
Number_of_Points所指定的数据点数。
Y_Data_Type[]:
数据类型,其数据类型如表1-2所示。
表1-2Y_Data_Type数据类型表
表1-3Plot_Style曲线类型表
Point_Style:
数据点类型。
数据点的类型决定VAL_CONNECTED_POINTS或VAL_SCATTER
标记的类型,默认值为VAL_EMPTY_SQUARE。
其主要类型如表1-4所示。
表1-4Point_Style数据点类型表
注:
LabWindows/CVI8.0以上版本中,VAL_EMPTY_SQUARE_WITH_CROSS不能自动切换,需要手动输入此值。
Line_Style:
线型。
其主要类型如表1-5所示。
表1-5Line_Style线型表
Point_Frequency:
当曲线类型为VAL_CONNECTED_POINTS或VAL_SCATTER时,绘制数据点的频率。
默认值为1。
Color:
颜色值。
为4个字节整型RGB值,用十六进制表示为0x00RRGGBB,可以使用MakeColor函数自定义颜色。
绘制图形的句柄。
正值表示绘制曲线成功,负值表示产生错误。
若将Graph的ATTR_DATA_MODE属性设置为VAL_DISCARD,则返回值为0。
⑫函数的调用对于控件而言,其回调函数原型为:
intCVICALLBACKControlCallback(intpanel,intcontrol,intevent,void*callbackData,inteventData1,inteventData2);
panel:
控件所在面板句柄。
control:
event:
控件所响应的事件。
*callbackData:
回调数据。
eventData1:
对应于具体控件响应事件的设置值。
eventData2:
本程序在面板的EVENT_CLOSE事件中,调用了QuitCallback函数,调用格式为:
即调用在panelHandle这个句柄所在面板的PANEL_QUITBUTTON常量(退出按钮)的EVENT_COMMIT事件(左击事件)。
⑬回调函数中参数的传递对于退出按钮,其回调函数为:
}return0;
当有左击事件发生时,会将一个常量值传递给event参数,如果值为EVENT_COMMIT时,则执行该函数。
其函数也可以写成标准的LabWindows/CVI形式,两者功能完全相同,只是形式表现不同。
intCVICALLBACKQuitCallback(intpanel,intcontrol,intevent,void*callbackData,inteventData1,inteventData2)
{switch(event){caseEVENT_COMMIT:
break;
}return0;
⑭面板中的热键设置
面板中的显示与退出按钮的表现形式为显示(S)、退出(Q),设计时以显示(__S)、退出(__Q)来表示,说明可以通过键盘或鼠标来进行程序的控制。
如要显示图形,则可以按下Alt+S的组合键,如果要退出程序,可以按下Alt+Q键,一般将采用Alt键与字母键组合的形式称为热键(HotKey),与快捷键(ShortcutKey)采用的Ctrl键与字母组合的形式稍有不同,例如在Word中进行的剪切操作,如果用快捷键来完成,直接按