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

📄 sample10.c

📁 机械工业出版社 Lab Windows/CVI逐步深入与开发实例源代码
💻 C
字号:
#include <cvirte.h>		
#include <userint.h>
#include <windows.h>
#include <mmsystem.h>
#include <math.h>											
#include "sample10.h"
#include "cviogl.h"
#include "animate.h"

#define PI 3.1415926
#define RAD(x)          ((x)*PI/180.0)
#define NUM_STEPS  57   

//定义变量
static int panelHandle,oglControl;
static double angle=0;
char    Path[NUM_STEPS * 30];    

//自定义函数
static int SetOGLAttributes(void);
int Plot3D (int panel);
void GeneratePath(void);

int main (int argc, char *argv[])
{
	if (InitCVIRTE (0, argv, 0) == 0)	
		return -1;	
		
	if ((panelHandle = LoadPanel (0, "sample10.uir", PANEL)) < 0)
		return -1;
		
    //创建OpenGL控件
    oglControl = OGLConvertCtrl (panelHandle, PANEL_PICTURE);
    
    //设置OpenGL控件属性
    SetOGLAttributes();
    
    //在OpenGL控件上作三维图形
    Plot3D(panelHandle);
    
    //创建动画控件
    AnimateCtrl_ConvertFromPictRing (panelHandle, PANEL_PICTURERING);
	
    //设置动画控件两帧之间的时间间隔 
    AnimateCtrl_SetAttribute (panelHandle, PANEL_PICTURERING,
							  ATTR_ANIMATE_FRAME_INTERVAL, 1);
							  
    //产生动画控件的路径
    GeneratePath();
    
    //设置动画控件路径
    AnimateCtrl_SetAttribute (panelHandle, PANEL_PICTURERING,
							  ATTR_ANIMATE_PATH, Path);  
							  
    //设置动画控件有效属性为FALSE
    AnimateCtrl_SetAttribute (panelHandle, PANEL_PICTURERING,
							  ATTR_ANIMATE_ENABLED, 0); 
							  
    //设置动画控件播放至路径末时停止播放
    AnimateCtrl_SetAttribute (panelHandle, PANEL_PICTURERING,
							  ATTR_ANIMATE_STOP_AT_PATH_END, 1); 
							  

	DisplayPanel (panelHandle);
	RunUserInterface ();
	
    //删除OpenGL控件
    OGLDiscardCtrl (panelHandle, oglControl);
	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 AddFile (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
     int status,filenumber,k,count;
     char **multifileresult,*multifilename;
     
     switch (event)
		{
		case EVENT_COMMIT:
		
	         //打开多文件选择框
	         status = MultiFileSelectPopup ("c:\\windows\\media", "*.wav", "",
									"Add File", 0, 1, 1, &filenumber,
									&multifileresult);
             if(status<=0)  break;
             
             //获取FILELIST控件包含的项目数
             GetNumListItems (panel, PANEL_FILELIST, &count);
             
             //添加文件名
             for(k=count;k<filenumber+count;k++)
			 {
				  InsertListItem (panel, PANEL_FILELIST, -1, multifileresult[k-count],
								  k);
		     }
             free(multifileresult);
			break;
		}
	return 0;
}

int CVICALLBACK FileListCallback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	switch (event)
		{
		case EVENT_COMMIT:
		
           Play (panel,PANEL_PLAY,EVENT_COMMIT,NULL,0,0) ;
           
			break;
		}
	return 0;
}

int CVICALLBACK Play (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	int itemIndex,asynchronous;
	char  filename[300]; 
	
	switch (event)
		{
		case EVENT_COMMIT:
		
            //获取控件FILELIST中激活的项目
            GetCtrlIndex (panel, PANEL_FILELIST,&itemIndex);
            
            //如果FILELIST控件处于未激活状态或者FILELIST控件为空,退出
            if(itemIndex==-1)   return -1;
            
            //获取激活项目对应的文件名 
            GetLabelFromIndex (panel, PANEL_FILELIST, itemIndex, filename);
			
            //获取控件ASYNCHRONOUS的值
            GetCtrlVal (panel, PANEL_ASYNCHRONOUS, &asynchronous);
            
            if (asynchronous)
                 //异步播放wav文件
                 sndPlaySound(filename, SND_ASYNC);
            else
                 //同步播放wav文件
                 sndPlaySound(filename, SND_SYNC);  
			break;
		}
	return 0;
}

int CVICALLBACK Stop (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	switch (event)
		{
		case EVENT_COMMIT:
		
            //停止播放
            sndPlaySound(NULL, 0);
            
			break;
		}
	return 0;
}


//设置OpenGL控件的属性
static int SetOGLAttributes(void)
{
	OGLSetCtrlAttribute (panelHandle, oglControl, OGLATTR_LIGHTING_ENABLE,
						 1);
						 
	OGLSetCtrlAttribute (panelHandle, oglControl, OGLATTR_LIGHT_SELECT, 1);
	
	OGLSetCtrlAttribute (panelHandle, oglControl, OGLATTR_LIGHT_ENABLE, 1);
	
	OGLSetCtrlAttribute (panelHandle, oglControl, OGLATTR_LIGHT_DISTANCE,
						 3.0);
						 
	OGLSetCtrlAttribute (panelHandle, oglControl, OGLATTR_XNAME_VISIBLE,
						 1);
						 
	OGLSetCtrlAttribute (panelHandle, oglControl, OGLATTR_YNAME_VISIBLE,
						 1);
						 
	OGLSetCtrlAttribute (panelHandle, oglControl, OGLATTR_ZNAME_VISIBLE,
						 1);
						 
	OGLSetCtrlAttribute (panelHandle, oglControl, OGLATTR_XNAME, "x axis");
	
	OGLSetCtrlAttribute (panelHandle, oglControl, OGLATTR_YNAME, "y axis");
	
	OGLSetCtrlAttribute (panelHandle, oglControl, OGLATTR_ZNAME, "z axis");
	
	OGLSetCtrlAttribute (panelHandle, oglControl, OGLATTR_XLABEL_VISIBLE,
						 1);
						 
	OGLSetCtrlAttribute (panelHandle, oglControl, OGLATTR_YLABEL_VISIBLE,
						 1);
						 
	OGLSetCtrlAttribute (panelHandle, oglControl, OGLATTR_ZLABEL_VISIBLE,
						 1);
						 
	OGLSetCtrlAttribute (panelHandle, oglControl, OGLATTR_VIEW_DISTANCE,
						 3.00);
						 
	OGLSetCtrlAttribute (panelHandle, oglControl, OGLATTR_XY_GRID_VISIBLE,
						 1);
						 
	OGLSetCtrlAttribute (panelHandle, oglControl, OGLATTR_YZ_GRID_VISIBLE,
						 1);
						 
	OGLSetCtrlAttribute (panelHandle, oglControl, OGLATTR_XZ_GRID_VISIBLE,
						 1);
						 
	OGLSetCtrlAttribute (panelHandle, oglControl, OGLATTR_XLABEL_VISIBLE,
						 1);
						 
	OGLSetCtrlAttribute (panelHandle, oglControl, OGLATTR_YLABEL_VISIBLE,
						 1);
						 
	OGLSetCtrlAttribute (panelHandle, oglControl, OGLATTR_ZLABEL_VISIBLE,
						 1);
						 
	OGLSetCtrlAttribute (panelHandle, oglControl, OGLATTR_PROJECTION_TYPE,
						 OGLVAL_PERSPECTIVE);
						 
    return 0;
}

int Plot3D (int panel)
{
    //定义变量
    int i,j,plotHandle;
	double x,y,*pts,*ptsPtr;
	double radxStep =360/20;
    double radyStep =360/20;
    
    //分配内存,用来储存二维数组
    pts = (double *) malloc((20+1)*(20+1)*sizeof(double));
    ptsPtr = pts;
	
    //设置PICTURE控件的回调函数为空
    SetCtrlAttribute (panel, PANEL_PICTURE,
				   ATTR_CALLBACK_FUNCTION_POINTER, NULL);
				   
    //设置OpenGL控件的作图有效属性
    OGLSetCtrlAttribute (panel, oglControl, OGLATTR_PLOTTING_ENABLE, 1);
	
    //设置OpenGL控件的X、Y、Z轴缩放属性
    OGLSetCtrlAttribute (panel, oglControl, OGLATTR_XAXIS_SCALING,
						 OGLVAL_AUTO);
						 
	OGLSetCtrlAttribute (panel, oglControl, OGLATTR_YAXIS_SCALING,
						 OGLVAL_AUTO);
						 
	OGLSetCtrlAttribute (panel, oglControl, OGLATTR_ZAXIS_SCALING,
						 OGLVAL_AUTO);
   
    //产生二维数组
    // 应用RAD函数可将角度转换成弧度,定义如下:
    // #define RAD(x)          ((x)*PI/180.0)
    for(j=0,y=RAD(-180);j<=20;j++,y+=RAD(radxStep))
       {
         for(i=0,x=RAD(-180);i<=20;i++,ptsPtr++,x+=RAD(radyStep))
              *ptsPtr = sinh(x)*cos(y);
       }
    
    //作三维图形
    plotHandle=OGLPlot3DUniform (panel, oglControl, pts, 21, 21,
						 OGLVAL_DOUBLE, 20, -180, 20, -180);
	
    //设置三维图形的表面形式
    OGLSetPlotAttribute (panel, oglControl, plotHandle,
						 OGLATTR_SURFACE_STYLE, OGLVAL_SMOOTH);
						 
    //设置三维图形的表面颜色
    OGLSetPlotAttribute (panel, oglControl, plotHandle,
						 OGLATTR_SURFACE_COLOR, OGLVAL_RED);
						 
	//设置三维图形的表面反射度
	OGLSetPlotAttribute (panel, oglControl, plotHandle,
						 OGLATTR_SURFACE_SPECULAR_FACTOR, 1.0);
						 
	//设置三维图形的表面光泽度
	OGLSetPlotAttribute (panel, oglControl, plotHandle,
						 OGLATTR_SURFACE_SHININESS, 100);
						 
    //设置三维图形的线类型
    OGLSetPlotAttribute (panel, oglControl, plotHandle,
						 OGLATTR_WIRE_STYLE, OGLVAL_SOLID);
						 
    //设置三维图形的线颜色
    OGLSetPlotAttribute (panel, oglControl, plotHandle,
						 OGLATTR_WIRE_COLOR, OGLVAL_RED);
						 
    //更新OpenGL控件
    OGLRefreshGraph(panel, oglControl);
    
    	return 0;
}

int CVICALLBACK AnimatePlay (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	switch (event)
		{
		case EVENT_COMMIT:
		
           //设置动画控件有效属性为TRUE
           AnimateCtrl_SetAttribute (panel, PANEL_PICTURERING,
									 ATTR_ANIMATE_ENABLED, 1);
			break;
		}
	return 0;
}

//产生动画控件的路径
void GeneratePath(void)
{
    int     frame,index;
    int     x = 325, y = -100;   
    char    *path = Path;
    
    for (index = 0; index < NUM_STEPS; index++)
       {
		frame=index;
		while (frame>10)
			{
			  frame=frame-10;
			}
        path += sprintf(path, "(T=%d, L=%d, F=%d) ", y, x, frame);
        y += 8;
       }
}   

⌨️ 快捷键说明

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