📄 calc.c
字号:
//*********************************************************
// Labwindows/cvi2009 实现了计算器的基本功能
//*********************************************************
#include <utility.h>
#include <formatio.h>
#include <ansi_c.h>
#include <cvirte.h>
#include <userint.h>
#include "toolbox.h"
#include "calc.h"
//*********************************************************
static int panelHandle,aboutpanelhandle;
static int menubarhandle;
static char str1[20]; // 参数1的字符串
static char str2[20]; // 参数2的字符串
static char str3[20];
static char str4[20];
static double strvalue1; // 参数1的值
static double strvalue2; // 参数2的值
static double strvalue3; // 运算结果
static double strvalue4; // 计算器存储用变量
static double strvalue5; // 粘贴板用变量
static double strvalue6; //
static double strvalue7; //
static int flag; // 加减乘除的标志
static int equalflag=1; // 输完2个数后是否按下“=”标志
static int mflag;
static int xflag=1;
int i;
//*********************************************************
void setvalue (void);
//*********************************************************
int main (int argc, char *argv[])
{
if (InitCVIRTE (0, argv, 0) == 0)
return -1; /* out of memory */
if ((panelHandle = LoadPanel (0, "calc.uir", PANEL)) < 0)
return -1;
DisplayPanel (panelHandle);
menubarhandle = GetPanelMenuBar (panelHandle); //获取菜单栏的句柄
RunUserInterface ();
DiscardPanel (panelHandle);
return 0;
}
//*********************************************************
// 面板的函数
//*********************************************************
int CVICALLBACK panelcb (int panel, int event, void *callbackData,
int eventData1, int eventData2)
{
switch (event)
{
case EVENT_RIGHT_CLICK: // 弹出式的菜单
RunPopupMenu (menubarhandle, MENUBAR_EDIT, panelHandle, eventData1, eventData2, 0, 0, 0, 0);
break;
case EVENT_CLOSE:
QuitUserInterface (0);
break;
}
return 0;
}
//*********************************************************
//清显示
int CVICALLBACK cmd_ce (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
SetCtrlVal (panelHandle, PANEL_STRING, "0");
SetCtrlVal (panelHandle, PANEL_STRING_2, "0");
break;
}
return 0;
}
//*********************************************************
//清字符串
int CVICALLBACK clear (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
{
str1[0]='\0';
str2[0]='\0';
str3[0]='\0';
strvalue1=0;
strvalue2=0;
strvalue3=0;
strvalue4=0;
strvalue5=0;
strvalue6=0;
strvalue7=0;
flag=0;
equalflag=0;
mflag=0;
xflag=1;//清零或启动后第一次运算的标志
SetCtrlVal (panelHandle, PANEL_STRING, "0");
SetCtrlVal (panelHandle, PANEL_STRING_2, "0");
break;
}
}
return 0;
}
//*********************************************************
//按键输入
//*********************************************************
int CVICALLBACK cmd_0 (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
char labeltext[2];
switch (event)
{
case EVENT_COMMIT:
GetCtrlAttribute (panelHandle, PANEL_CMD_0, ATTR_LABEL_TEXT, labeltext);// 读取控件的标题显示值
strcat (str1, labeltext);// 字符串连接,将此数值控件的标题显示值加到参数1的后面
setvalue ();//显示文本框显示实时的参数1
break;
}
return 0;
}
//*********************************************************
int CVICALLBACK cmd_1 (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
char labeltext[2];
switch (event)
{
case EVENT_COMMIT:
GetCtrlAttribute (panelHandle, PANEL_CMD_1, ATTR_LABEL_TEXT, labeltext);
strcat (str1, labeltext);
setvalue ();
break;
}
return 0;
}
//*********************************************************
int CVICALLBACK cmd_2 (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
char labeltext[2];
switch (event)
{
case EVENT_COMMIT:
GetCtrlAttribute (panelHandle, PANEL_CMD_2, ATTR_LABEL_TEXT, labeltext);
strcat (str1, labeltext);
setvalue ();
break;
}
return 0;
}
//*********************************************************
int CVICALLBACK cmd_3 (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
char labeltext[2];
switch (event)
{
case EVENT_COMMIT:
GetCtrlAttribute (panelHandle, PANEL_CMD_3, ATTR_LABEL_TEXT, labeltext);
strcat (str1, labeltext);
setvalue ();
break;
}
return 0;
}
//*********************************************************
int CVICALLBACK cmd_4 (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
char labeltext[2];
switch (event)
{
case EVENT_COMMIT:
GetCtrlAttribute (panelHandle, PANEL_CMD_4, ATTR_LABEL_TEXT, labeltext);
strcat (str1, labeltext);
setvalue ();
break;
}
return 0;
}
//*********************************************************
int CVICALLBACK cmd_5 (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
char labeltext[2];
switch (event)
{
case EVENT_COMMIT:
GetCtrlAttribute (panelHandle, PANEL_CMD_5, ATTR_LABEL_TEXT, labeltext);
strcat (str1, labeltext);
setvalue ();
break;
}
return 0;
}
//*********************************************************
int CVICALLBACK cmd_6 (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
char labeltext[2];
switch (event)
{
case EVENT_COMMIT:
GetCtrlAttribute (panelHandle, PANEL_CMD_6, ATTR_LABEL_TEXT, labeltext);
strcat (str1, labeltext);
setvalue ();
break;
}
return 0;
}
//*********************************************************
int CVICALLBACK cmd_7 (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
char labeltext[2];
switch (event)
{
case EVENT_COMMIT:
{
GetCtrlAttribute (panelHandle, PANEL_CMD_7, ATTR_LABEL_TEXT, labeltext);
strcat (str1, labeltext);
setvalue ();
break;
}
}
return 0;
}
//*********************************************************
int CVICALLBACK cmd_8 (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
char labeltext[2];
switch (event)
{
case EVENT_COMMIT:
GetCtrlAttribute (panelHandle, PANEL_CMD_8, ATTR_LABEL_TEXT, labeltext);
strcat (str1, labeltext);
setvalue ();
break;
}
return 0;
}
//*********************************************************
int CVICALLBACK cmd_9 (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
char labeltext[2];
switch (event)
{
case EVENT_COMMIT:
GetCtrlAttribute (panelHandle, PANEL_CMD_9, ATTR_LABEL_TEXT, labeltext);
strcat (str1, labeltext);
setvalue ();
break;
}
return 0;
}
//*********************************************************
int CVICALLBACK cmd_dot (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
char labeltext[2];
switch (event)
{
case EVENT_COMMIT:
GetCtrlAttribute (panelHandle, PANEL_CMD_DOT, ATTR_LABEL_TEXT, labeltext);
strcat (str1, labeltext);
setvalue ();
break;
}
return 0;
}
/*// if(equalflag==0)
// {
// strvalue4=strvalue4+strvalue1;
// Fmt (str4, "%s<%f", strvalue4);
// SetCtrlVal (panelHandle, PANEL_STRING, str4);
//
// }*/
//*********************************************************
int CVICALLBACK cmd_plus (int panel, int control, int event, //运算符按下,表示第一个参数输入完毕
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
{
if((equalflag==1)|(xflag==1))//有等号按下或者清零后第一次运算
{
GetCtrlVal (panelHandle, PANEL_STRING, str1);//从文本显示框获取参数1的值
SetCtrlVal (panelHandle, PANEL_STRING, ""); //输入数据行清空
SetCtrlVal (panelHandle, PANEL_STRING_2, str1);//数据显示
Fmt (&strvalue1, "%f<%s", str1);//将参数1由字符串转化为double型数据,赋给strvalue1
str1[0]='\0';//字符串1清零
flag=1; // 1表示加法
equalflag=0;//之前等号无效
xflag=0;
}
else
{
GetCtrlVal (panelHandle, PANEL_STRING, str1);//取当前文本显示框参数1的值
Fmt (&strvalue6, "%f<%s", str1);//
Fmt (&strvalue7, "%f<%s", str3);//
strvalue7=strvalue7+strvalue6;
Fmt (str3, "%f", strvalue7);
SetCtrlVal (panelHandle, PANEL_STRING_2, str3);//数据显示
mflag=1;
str1[0]='\0';//字符串1清零
flag=1; // 1表示加法
}
break;
}
}
return 0;
}
//*********************************************************
int CVICALLBACK cmd_minus (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
if((equalflag==1)|(xflag==1))//有等号按下或者清零后第一次运算
{
GetCtrlVal (panelHandle, PANEL_STRING, str1);//从文本显示框获取参数1的值
SetCtrlVal (panelHandle, PANEL_STRING, ""); //输入数据行清空
SetCtrlVal (panelHandle, PANEL_STRING_2, str1);//数据显示
Fmt (&strvalue1, "%f<%s", str1);//将参数1由字符串转化为double型数据,赋给strvalue1
str1[0]='\0';//字符串1清零
flag=2; // 2表示减法
equalflag=0;//之前等号无效
xflag=0;
}
else
{
GetCtrlVal (panelHandle, PANEL_STRING, str1);//取当前文本显示框参数1的值
Fmt (&strvalue6, "%f<%s", str1);//
Fmt (&strvalue7, "%f<%s", str3);//
strvalue7=strvalue7-strvalue6;
Fmt (str3, "%f", strvalue7);
SetCtrlVal (panelHandle, PANEL_STRING_2, str3);//数据显示
mflag=1;
str1[0]='\0';//字符串1清零
flag=2; // 2表示减法
}
break;
}
return 0;
}
//*********************************************************
int CVICALLBACK cmd_mul (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
if((equalflag==1)|(xflag==1))//有等号按下或者清零后第一次运算
{
GetCtrlVal (panelHandle, PANEL_STRING, str1);//从文本显示框获取参数1的值
SetCtrlVal (panelHandle, PANEL_STRING, ""); //输入数据行清空
SetCtrlVal (panelHandle, PANEL_STRING_2, str1);//数据显示
Fmt (&strvalue1, "%f<%s", str1);//将参数1由字符串转化为double型数据,赋给strvalue1
str1[0]='\0';//字符串1清零
flag=3; // 3表示乘法
equalflag=0;//之前等号无效
xflag=0;
}
else
{
GetCtrlVal (panelHandle, PANEL_STRING, str1);//取当前文本显示框参数1的值
Fmt (&strvalue6, "%f<%s", str1);//
Fmt (&strvalue7, "%f<%s", str3);//
strvalue7=strvalue7*strvalue6;
Fmt (str3, "%f", strvalue7);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -