使用LABwindows/CVI软件搭建学生管理器界面(二)

描述

上期使用LABwindows/CVI这个软件搭建了学生管理器的UI界面,这期就是将UI界面中各个控件编程,使其能够实现一定的功能。

关键词:控件编程;

01控件编程

1.1、生成控件的头文件内容

生成框架代码之后,我们应该可以在uir同名的h文件中看到CVI为我们生成了如下代码,包含了CVI框架运行、CVI用户界面运行所需要的基本函数的声明与定义。 show.h是界面文件show.uir的头文件库,包含了界面中的控件的定义与声明:

头文件内柔如下所示:

/**************************************************************************/
/* LabWindows/CVI User Interface Resource (UIR) Include File              */
/*                                                                        */
/* WARNING: Do not add to, delete from, or otherwise modify the contents  */
/*          of this include file.                                         */
/**************************************************************************/
#include 
#ifdef __cplusplus
    extern "C" {
#endif
     /* Panels and Controls: */
#define  PANEL                1       /* callback function: MainCallBack */
#define  PANEL_STRING_Name  2       /* control type: string, callback function: (none) */
#define  PANEL_BTN_Change    3       /* control type: command, callback function: MainPanelBtnCallback */
#define  PANEL_BTN_Show      4       /* control type: command, callback function: MainPanelBtnCallback */
#define  PANEL_BTN_insert      5       /* control type: command, callback function: MainPanelBtnCallback */
#define  PANEL_BTN_Delete     6       /* control type: command, callback function: MainPanelBtnCallback */
#define  PANEL_BTN_Add       7       /* control type: command, callback function: MainPanelBtnCallback */
#define  PANEL_NUM_Student_Insert  8       /* control type: numeric, callback function: (none) */
#define  PANEL_NUM_Student        9       /* control type: numeric, callback function: (none) */
     /* Control Arrays: */
     /* (no control arrays in the resource file) */
     /* Menu Bars, Menus, and Menu Items: */
     /* (no menu bars in the resource file) */
     /* Callback Prototypes: */
int  CVICALLBACK MainCallBack(int panel, int event, void *callbackData, int eventData1, int eventData2);
int  CVICALLBACK MainPanelBtnCallback(int panel, int control, int event, void *callbackData, int eventData1, int eventData2);
#ifdef __cplusplus
    }
#endif

1.2、添加的文件

程序如下:

#include 
#include   //CVI运行时库(CVI Run-Time Engine)  
#include //CVI用户界面库(CVI User Interface)  
#include  //包含了C、C++语言的最常用的系统函数
#include "show.h"

1.3、添加结构体

结构体程序如下:

static int panelHandle;
//为面板的全局句柄,当对面板或者面板上的控件进行操作时经常用到
#define LEN sizeof(struct Student) //宏定义节点长度得命名
#define TYPE struct Student      //宏定义结构体变量命名
struct Student                   //定义一个学生类型结构体,包括学号,分数
{
  char Name[20];
  int Number;
  TYPE *Next;             //next是指针变量,指向结构体变量
};
TYPE *Head = NULL;         //定义头指针地址,全局变量
TYPE *PTmp = NULL;        //定义新开辟结点变量,全局变量

以下就是五个按键对应的功能函数

1.4、动态链表函数

代入如下:

TYPE* Creat(void)                //定义函数,此函数返回一个指向链表头的指针
{
  char Name[20] = {0};          //定义保存姓名的数组
  int Number = 0;        //定义保存姓名的整形
  GetCtrlAttribute(panelHandle, PANEL_STRING_Name, ATTR_CTRL_VAL, Name);   
//得到PANEL_STRING_Name字符框中字符串给Name
  GetCtrlAttribute(panelHandle, PANEL_NUM_Student, ATTR_CTRL_VAL, &Number); 
//得到PANEL_SPANEL_NUM_Student整形框中字符串给Number 
  if((strlen(Name) < 1) || (Number < 1))    
//根据输入的数据长度来判断学生数据是否输入有误
  {
    MessagePopup("提示", "请重新输入...");  //显示对话消息对话框
  }
  else
  {
    PTmp = (struct Student *)malloc(sizeof(struct Student));//开辟新的结点空间
    memset(PTmp, 0, sizeof(struct Student));        // 将空间清零
    PTmp->Number = Number;              //结点中保存学号,姓名
    strcat(PTmp->Name, Name);
    struct Student *PMov = Head;                  //每次都返回头指针
    if(Head == NULL)
    {
      Head = PTmp;                  //把第一个结点给头指针
    }
    else
    {
      while(PMov->Next)              //循环从头到尾找指针域
       {
         PMov = PMov->Next;
      }
      PMov->Next = PTmp;              //找到指针域后更新
    }
    printf("新添加了1个学生:%s 学号:%d号\\n", PTmp->Name, PTmp->Number);  
//显示添加信息
  }
  return (Head);                                       //返回首地址
}

1.5、删除结点函数

代码如下:

void delet(TYPE* head)                   //定义结点删除函数
{
  TYPE* p = head, * in;                  //定义两边指针
  int i = 0;                          //定义记录值
  char Name[20] = {0};             //定义姓名数组
  GetCtrlAttribute(panelHandle, PANEL_STRING_Name, ATTR_CTRL_VAL, Name);
//得到PANEL_STRING_Name字符框中字符串给Name  
  while ((strcmp(p->Name, Name) !=0)  && p != NULL)                     
//找到对应姓名并且不为空的结点
  {
    in = p;                            //找到左边的
    p = p->Next;                       //找到右边的
    i++;
  }
  if (p != NULL) 
  {
    printf("删除的学生为:%s 学号:%d号\\n", p->Name, p->Number); //显示删除信息
    in->Next = p->Next;                                      //将左右链接
    free(p);                                                 //释放中间结点
  }
  else {
    MessagePopup("提示", "学生节点不存在...");             //显示对话消息对话框  
  }
}

1.6、链表显示函数

代码如下:

void print(TYPE * head)                    //定义将链表输出函数
{
  TYPE * p;                           //定义指针
  p = head;                            //使p指向第一个结点
  int count = 0;                         //记录多少哥结点数
  if(Head == NULL)                  //判断是否为空
  {
    MessagePopup("提示", "表中不包含任何学生...");  //显示对话消息对话框 
  }
  else
  if(head!=NULL)                                  //输出第一个结点后的信息
    do {
      printf("第%d个学生:%s 学号:%d号\\n", ++count, p->Name, p->Number);
//显示结点信息 
      p = p->Next;                              //指向下个结点
    } while (p != NULL);
}

1.7、链表的插入

代码如下:

void insert(TYPE* head) {             //定义链表的插入函数
  TYPE* p = head, * in;             //定义首尾指针
  int i = 0;               //记录值
  int n;               //定义插入的地方
  char Name[20] = {0};         //定义姓名数组 ,学号
  int Number = 0;
  GetCtrlAttribute(panelHandle, PANEL_NUM_Student_Insert, ATTR_CTRL_VAL, &n); 
//得到PANEL_NUM_Student_Insert整形中数据给n
  while (i < (n-1) && p != NULL) {
    p = p->Next;
    i++;                       //找到相应结点
  }
  if (p != NULL) {
    in = (TYPE*)malloc(sizeof(TYPE));  //开辟新的空间
    memset(in, 0, sizeof(struct Student));  //清零
    GetCtrlAttribute(panelHandle, PANEL_STRING_Name, ATTR_CTRL_VAL, Name);   //得到PANEL_STRING_Name字符中数据给Name 
      GetCtrlAttribute(panelHandle, PANEL_NUM_Student, ATTR_CTRL_VAL, &Number);//得到PANEL_NUM_Student整形中数据给Number 
    in->Number = Number;     
    strcat(in->Name, Name);            //复制信息给in->Name   
    printf("插入学生:%s 学号:%d号\\n",  in->Name, in->Number); //显示插入的信息
    in->Next = p->Next; 
//填充in节点的指针域,也就是说把in的指针域指向p的下一个节点
    p->Next = in;       //填充p节点的指针域,把p的指针域重新指向in
  }
  else {
    MessagePopup("提示", "表中不包含任何学生...");//显示对话消息对话框 
  }
}

1.8、链表的修改

代码如下:

void change(TYPE* head)       //修改指定位置的结点的信息函数
{
  TYPE* p = head;          //传入首地址
  int i = 0;            //记录值 
  char Name[20] = {0};      //定义姓名数组 ,学号 
  int Number = 0;   
  GetCtrlAttribute(panelHandle, PANEL_STRING_Name, ATTR_CTRL_VAL, Name); 
//得到PANEL_STRING_Name字符中数据给Name  
  while ((strcmp(p->Name, Name) !=0) && p != NULL) {            
 //找到对应姓名并且不为空的结点  
    p = p->Next;
    i++;
  }                         //找到相应的位置结点
  if (p != NULL) {
    GetCtrlAttribute(panelHandle, PANEL_STRING_Name, ATTR_CTRL_VAL, Name);   //得到PANEL_STRING_Name字符中数据给Name  
      GetCtrlAttribute(panelHandle, PANEL_NUM_Student, ATTR_CTRL_VAL, &Number);//得到PANEL_NUM_Student整形中数据给Number
p->Number = Number;      //保存学号
    printf("修改的学生:%s 学号:%d号\\n",  p->Name, p->Number); //显示修改的信息
  }
  else 
    MessagePopup("提示", "表中不包含该学生"); //显示对话消息对话框
  }

下期就是讲解控件怎么回调!!

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分