LabWindowsCVI 程序 回调函数设计Word下载.docx

上传人:b****5 文档编号:16450476 上传时间:2022-11-23 格式:DOCX 页数:12 大小:22.07KB
下载 相关 举报
LabWindowsCVI 程序 回调函数设计Word下载.docx_第1页
第1页 / 共12页
LabWindowsCVI 程序 回调函数设计Word下载.docx_第2页
第2页 / 共12页
LabWindowsCVI 程序 回调函数设计Word下载.docx_第3页
第3页 / 共12页
LabWindowsCVI 程序 回调函数设计Word下载.docx_第4页
第4页 / 共12页
LabWindowsCVI 程序 回调函数设计Word下载.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

LabWindowsCVI 程序 回调函数设计Word下载.docx

《LabWindowsCVI 程序 回调函数设计Word下载.docx》由会员分享,可在线阅读,更多相关《LabWindowsCVI 程序 回调函数设计Word下载.docx(12页珍藏版)》请在冰豆网上搜索。

LabWindowsCVI 程序 回调函数设计Word下载.docx

在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中进行的剪切操作,如果用快捷键来完成,直接按

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 军事

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1