⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sample5.c

📁 机械工业出版社 Lab Windows/CVI逐步深入与开发实例源代码
💻 C
字号:
#include <analysis.h>
#include "toolbox.h"
#include <ansi_c.h>
#include <cvirte.h>		/* Needed if linking in external compiler; harmless otherwise */
#include <userint.h>
#include "sample5.h"

static int panelHandle;
static double randomdata[100];
double temp;

int main (int argc, char *argv[])
{
	
	if (InitCVIRTE (0, argv, 0) == 0)	
		return -1;	
		
	if ((panelHandle = LoadPanel (0, "sample5.uir", PANEL)) < 0)
		return -1;
		
	DisplayPanel (panelHandle);
	
	RunUserInterface ();
	return 0;
}

int CVICALLBACK PanelCallback (int panel, int event, void *callbackData,
		int eventData1, int eventData2)
{
	switch (event)
		{
		case EVENT_CLOSE:
		
			QuitUserInterface (0);
			
			break;
		}
	return 0;
}

int CVICALLBACK QuitCallback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	switch (event)
		{
		case EVENT_COMMIT:
		
			QuitUserInterface (0);
			
			break; 
		}
	return 0;
}

int CVICALLBACK PlotData(int panel, int control, int event, void *callbackData, int eventData1, int eventData2)
{
    int color, style;
	double data[100];
	
    if (event == EVENT_COMMIT) 
    {
        //从控件TRACECOLOR和TRACESTYLE中取值
        //作为曲线的颜色和形状
        GetCtrlVal (panel, PANEL_TRACECOLOR, &color);
		GetCtrlVal (panel, PANEL_TRACESTYLE, &style);
		
        //调用SetRange函数设置Graph控件的Y轴范围
        SetRange(panel,PANEL_SCALE,EVENT_COMMIT,0,0,0);
		
        //删除Graph控件上所有曲线或图形
        DeleteGraphPlot (panel, PANEL_GRAPH, -1, 1);
        
        //显示Graph控件的边界
        SetCtrlAttribute (panel, PANEL_GRAPH, ATTR_BORDER_VISIBLE, 1);
		
        //产生白噪声信号
        WhiteNoise (100, 100, -1, data);
		
        //在Graph控件中作曲线
        PlotWaveform (panel, PANEL_GRAPH, data, 100, VAL_DOUBLE, 1, 0, 0, 1,
					  style, VAL_EMPTY_SQUARE, VAL_SOLID, 1, color);
					  
    }
        
    return 0;
}

int CVICALLBACK PlotShape(int panel, int control, int event, void *callbackData, int eventData1, int eventData2)
{
    int color, color2, shape, fill;

    if (event == EVENT_COMMIT) {
    
        //从控件FILLCOLOR、SHAPE和FILLMODE中取值
        //作为所作图形的颜色、形状和是否填充
        GetCtrlVal (panel, PANEL_FILLCOLOR, &color);
        GetCtrlVal (panel, PANEL_SHAPE, &shape);
        GetCtrlVal (panel, PANEL_FILLMODE, &fill);
        
        //判断是否填充
        if (fill)
            //设置背景色为透明色
            color2 = VAL_TRANSPARENT;
        else
            //设置背景色输入值
            color2 = color;
            
        //删除所有曲线或图形
        DeleteGraphPlot (panel, PANEL_GRAPH, -1, 1);
        
        //设定Graph控件坐标轴范围
        SetAxisRange (panel, PANEL_GRAPH, VAL_MANUAL, -10, 10, VAL_MANUAL,
					  -10, 10);
					  
		//隐藏Graph控件边界
		SetCtrlAttribute (panel, PANEL_GRAPH, ATTR_BORDER_VISIBLE, 0);
		
        //判别图形种类
        switch (shape) {
        
            case 0 :
				//作矩形
				PlotRectangle (panel, PANEL_GRAPH, -5, -5, 5, 5, color, color2);
                break;
                
            case 1 :
				//作椭圆形
				PlotOval (panel, PANEL_GRAPH, -5, -5, 5, 5, color, color2);
                break;
                
            case 2 :
				//作弧形
				PlotArc (panel, PANEL_GRAPH, -5, -5, 5, 5, 0, 120, color, color2);
                break;
                
            case 3 :
				//作点
				PlotPoint (panel, PANEL_GRAPH, -5, -5, VAL_EMPTY_SQUARE, color);
                break;
                
            case 4 :
				//显示文字
				PlotText (panel, PANEL_GRAPH, 0, 0, "LabWindows/CVI",
						  VAL_APP_META_FONT, color, VAL_TRANSPARENT);
                break;
                
            }
        }
        
    return 0;
}

int CVICALLBACK TimerCallback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	double temp;
    int backcolor,plotcolor,k;
    
	switch (event)
		{
		  //定时器触发事件
		  case EVENT_TIMER_TICK:
         
            //获取BACKCOLOR控件的值
            GetCtrlVal (panel, PANEL_BACKCOLOR, & backcolor);
			
            //设置STRIPCHART 控件的背景色
            SetCtrlAttribute(panel, PANEL_STRIPCHART,
                         ATTR_PLOT_BGCOLOR, backcolor);
                         
			//本章习题与上机练习题的答案
            //获取PLOTCOLOR控件的值
			GetCtrlVal (panel, PANEL_PLOTCOLOR, & plotcolor);

			//修改STRIPCHART控件曲线的颜色
			SetTraceAttribute (panel, PANEL_STRIPCHART, 1, ATTR_TRACE_COLOR,
							   plotcolor);

			//随机数组左移
			for(k=0;k<99;k++)   
			   randomdata[k]=randomdata[k+1];
			   
			//产生在0-100范围内的随机数
			temp =(double)( rand ()*100/RAND_MAX);
            
			//修改随机数组最后一个数的值
			randomdata[99]=temp;

            //在Strip Chart控件上作曲线图
            PlotStripChart (panel, PANEL_STRIPCHART, randomdata, 100, 0, 0,
							VAL_DOUBLE);
			break;
		}
	return 0;
}


int CVICALLBACK GraphCallback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	
	double x,y;
	
	switch (event)
		{
		case EVENT_COMMIT:
		
		    //获取光标坐标
		    GetGraphCursor (panel, PANEL_GRAPH, 1, &x, &y);
		 
		    //显示光标坐标
		    SetCtrlVal (panel, PANEL_XCOORD, x);
		    SetCtrlVal (panel, PANEL_YCOORD, y);
		    
			break;
		}
	return 0;
}

int CVICALLBACK StripChartPlot (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	int i;
	
	switch (event)
		{
		case EVENT_COMMIT:
		
            //获取控件STRIPCHARTPLOT的值  
            GetCtrlVal(panel,control,&i);
		    
            //根据控件STRIPCHARTPLOT的值修改控件TIMER的Enable属性  
            SetCtrlAttribute (panel, PANEL_TIMER, ATTR_ENABLED, i);
			
			break;
		}
	return 0;
}

int CVICALLBACK GridColor (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	int i;
	
	switch (event)
		{
		case EVENT_COMMIT:

		    //获取控件GRIDCOLOR的值
		    GetCtrlVal(panel,control,&i);
		    
			//设置控件GRAPH的删格颜色
			SetCtrlAttribute (panel, PANEL_GRAPH, ATTR_GRID_COLOR, i);
			
			break;
		}
	return 0;
}

int CVICALLBACK SetRange (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	int scale;
	double max,min;
	
	switch (event)
		{
		case EVENT_GOT_FOCUS:
		
		  //将MAX或MIN控件获得焦点时的值储存至全局变量temp
		  if(control!=PANEL_SCALE)
		   GetCtrlVal (panel, control, &temp);
		
			break;
		case EVENT_COMMIT:
		
        //获取控件SCALE、MAX、MIN的值
        GetCtrlVal (panel, PANEL_SCALE, &scale);
		GetCtrlVal (panel, PANEL_MAX, &max);
		GetCtrlVal (panel, PANEL_MIN, &min);
		
        //如果输入Y坐标最大值小于最小值,
        //设置控件值为原值,报错并返回
		if(max<min) 
		 {
		    SetCtrlVal (panel, control, temp);
		    MessagePopup ("Error", "Input error");
		    return 0;
		 }
		 
		//判断坐标缩放类型
		if(scale)
    	  //设置Y轴坐标为手动,
          //根据max和min值设定Graph控件坐标范围
		  SetAxisRange (panel, PANEL_GRAPH, VAL_AUTOSCALE, 0, 0, VAL_MANUAL,
						min, max);
	    else
		  //设置Y轴坐标为自动,
		  SetAxisRange (panel, PANEL_GRAPH, VAL_AUTOSCALE, 0, 0, VAL_AUTOSCALE,
					  min, max);
					  
			break; 
		}
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -