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

📄 sample14.c

📁 机械工业出版社 Lab Windows/CVI逐步深入与开发实例源代码
💻 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 + -