📄 sample14.c
字号:
#include <formatio.h>
#include <ddesupp.h>
#include <utility.h>
#include <ansi_c.h>
#include <cvirte.h>
#include <userint.h>
#include "sample14.h"
#include <math.h>
static int panelHandle;
unsigned int datalink,systemlink;
int CVICALLBACK ClientCallback(
unsigned dde_handle,
char *topicName,
char *itemName,
int event,
int dataFmt,
int dataSize,
void *dataPtr,
void *callbackData);
int main (int argc, char *argv[])
{
if (InitCVIRTE (0, argv, 0) == 0)
return -1;
if ((panelHandle = LoadPanel (0, "sample14.uir", PANEL)) < 0)
return -1;
//调试过程中不显示出错对话框
DisableBreakOnLibraryErrors();
DisplayPanel (panelHandle);
RunUserInterface ();
//设置控件STATUS的值,显示退出程序
SetCtrlVal (panelHandle, PANEL_STATUS, "Quit Program...");
//断开与xls文件的连接
DisconnectFromDDEServer (datalink);
//向EXCEL发送命令关闭xls文件
ClientDDEExecute (systemlink, "[CLOSE(0)]", 0);
//向EXCEL发送命令退出EXCEL
ClientDDEExecute (systemlink, "[QUIT()]", 0);
EnableBreakOnLibraryErrors ();
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 LaunchCallback (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
char excelpath [MAX_PATHNAME_LEN];
switch (event)
{
case EVENT_COMMIT:
//获取控件EXCELPATH的值
GetCtrlVal (panel, PANEL_EXCELPATH, excelpath);
//运行excel.exe文件
LaunchExecutable (excelpath);
//设置控件LAUNCH无效,控件CONNECT有效
SetCtrlAttribute (panel, PANEL_LAUNCH, ATTR_DIMMED, 1);
SetCtrlAttribute (panel, PANEL_CONNECT, ATTR_DIMMED, 0);
break;
}
return 0;
}
int CVICALLBACK ConnectCallback (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
int status;
switch (event)
{
case EVENT_COMMIT:
//设置控件STATUS的值,显示连接消息
SetCtrlVal (panel, PANEL_STATUS, "Connecting to Work Sheet...\n");
//建立程序和Excel系统的连接
status = ConnectToDDEServer (&systemlink, "excel", "system",
ClientCallback, 0);
if (status<0)
//连接失败,显示出错信息
SetCtrlVal (panel, PANEL_STATUS, "Connection to Work Sheet failed.\n");
else
{
//连接成功
SetCtrlVal (panel, PANEL_STATUS, "Connection to Worksheet Successful.\n");
//设置控件CONNECT无效,控件OPENFILE有效
SetCtrlAttribute (panel, PANEL_CONNECT, ATTR_DIMMED, 1);
SetCtrlAttribute (panel, PANEL_OPENFILE, ATTR_DIMMED, 0);
}
break;
}
return 0;
}
int CVICALLBACK OpenFileCallback (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
int status;
char filename[MAX_PATHNAME_LEN];
char command[150];
char cellvalStr[100];
double cellVal;
switch (event)
{
case EVENT_COMMIT:
//弹出文件选择对话框
status = FileSelectPopup ("", "*.xls", "*.xls", "Open File",
VAL_LOAD_BUTTON, 0, 0, 1, 0, filename);
//向Excel发出命令打开xls文件
Fmt (command, "%s<[OPEN(\"%s\")]", filename);
status = ClientDDEExecute (systemlink, command, 0);
//建立程序与xls文件的连接
status = ConnectToDDEServer (&datalink, "excel", filename,
ClientCallback, 0);
if (status<0)
//连接失败,显示出错信息
SetCtrlVal (panel, PANEL_STATUS, "Open Sheets Failed\n");
else
{
//连接成功
SetCtrlVal (panel, PANEL_STATUS, "Open Sheets Successful\n");
//设置控件OPENFILE无效,控件CLOSEFILE有效,
//控件SENTDATA有效
SetCtrlAttribute (panel, PANEL_OPENFILE, ATTR_DIMMED, 1);
SetCtrlAttribute (panel, PANEL_CLOSEFILE, ATTR_DIMMED, 0);
SetCtrlAttribute (panel, PANEL_SENTDATA, ATTR_DIMMED, 0);
}
//建立程序与xls文件中的某项的热连接
if ((status = SetUpDDEHotLink (datalink, "R10C1", CF_TEXT, 5000))<0)
//连接失败,显示出错信息
SetCtrlVal (panel, PANEL_STATUS, "SetUpWarmLink Failed");
//读取xls文件中的某项的值
ClientDDERead (datalink, "R10C1", CF_TEXT, cellvalStr,
sizeof(cellvalStr), 0);
//将读取的数据显示在CELLVALUE控件中
sscanf ((char*)cellvalStr, "%lf", &cellVal);
SetCtrlVal (panel, PANEL_CELLVALUE, cellVal);
break;
}
return 0;
}
int CVICALLBACK CloseFileCallback (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
int close_style,status;
char command[50];
switch (event)
{
case EVENT_COMMIT:
//获取控件CLOSESTYLE的值
GetCtrlVal (panel, PANEL_CLOSESTYLE, &close_style);
//显示关闭xls文件消息
SetCtrlVal (panel, PANEL_STATUS, "Closing Sheet...\n");
//向Excel发送关闭文件的命令
Fmt (command, "%s<[CLOSE(%i)]", close_style);
status=ClientDDEExecute (systemlink, command, 0);
if (status < 0)
//关闭文件失败,显示出错信息
SetCtrlVal (panel, PANEL_STATUS, "Close Sheet Failed\n");
else
{
//关闭文件成功
SetCtrlVal (panel, PANEL_STATUS, "Close Sheet Successful\n");
//设置控件OPENFILE有效,控件CLOSEFILE无效,
//控件SENTDATA无效
SetCtrlAttribute (panel, PANEL_OPENFILE, ATTR_DIMMED, 0);
SetCtrlAttribute (panel, PANEL_CLOSEFILE, ATTR_DIMMED, 1);
SetCtrlAttribute (panel, PANEL_SENTDATA, ATTR_DIMMED, 1);
}
break;
}
return 0;
}
int CVICALLBACK SentDataCallback (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
double data[60];
int status,data_type,i,j=0;
char data_buffer[1500];
switch (event)
{
case EVENT_COMMIT:
//获取控件WAVEFORM的值
GetCtrlVal (panel, PANEL_WAVEFORM, &data_type);
//根据控件WAVEFORM的值产生不同的数据
switch (data_type)
{
case 0 : // 正弦波数据
for (i=0;i<50;i++)
data[i] = 50 * sin((((2*3.1415926539)/50) * i)) + 50;
break;
case 1 : // 三角波数据
for (i=0;i<13;i++) {
data[i] = i*7.69;
data[i+13] = 100 - (i*7.69);
data[i+26] = i*7.69;
data[i+39] = 100 - (i*7.69);
}
break;
case 2 : // 方波数据
for (i=0;i<16;i++)
data[i] = 33.0;
for (i=16;i<33;i++)
data[i] = 67.0;
for (i=33;i<50;i++)
data[i] = 33.0;
break;
}
//显示发送数据消息
SetCtrlVal (panel, PANEL_STATUS, "Sending Data to Worksheet\n");
//向EXCEL发送数据
for (i=0; i<50; i++) {
sprintf(&data_buffer[j],"%f\n", data[i]);
j=strlen(data_buffer);
}
status = ClientDDEWrite (datalink, "R1C1:R50C1", CF_TEXT, data_buffer,
strlen(data_buffer), 1000);
if(status<0)
//发送数据失败
SetCtrlVal (panel, PANEL_STATUS, "Data Sent Successful.\n");
else
//发送数据成功
SetCtrlVal (panel, PANEL_STATUS, "Data Sent Failes.\n");
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 ClientCallback(
unsigned dde_handle,
char *topicName,
char *itemName,
int event,
int dataFmt,
int dataSize,
void *dataPtr,
void *callbackData)
{
double value;
switch (event) {
//接收到EXCEL发送的数据
case DDE_DATAREADY:
//将读取的数据,显示到控件CELLVALUE中
sscanf ((char*)dataPtr, "%lf", &value);
SetCtrlVal (panelHandle, PANEL_CELLVALUE, value);
break;
//DDE断开连接
case DDE_DISCONNECT:
//显示断开连接消息
SetCtrlVal (panelHandle, PANEL_STATUS, "Connection Closed!!!\n");
break;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -