📄 sample10.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 + -