功能介绍
实现多位数加减乘除运算(可自行添加运算规则),菜单栏退出功能(有附加文件可添加功能),保留小数位数功能,显示运算符号功能暂未开发。界面效果图如下:
实现代码
#include <formatio.h>
#include <ansi_c.h>
#include <utility.h>
#include <cvirte.h>
#include <userint.h>
#include "calc.h"
static int panelHandle;
static char str1[32]; // 参数 1 的字符串
static char str2[32]; // 参数 2 的字符串
static double strValue1; // 参数 1 的值
static double strValue2; // 参数 2 的值
static int flag; // 加减乘除的标志
static int mflag;//运算状态 0不可运算 1准备开始运算 2结束运算
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);
RunUserInterface ();
DiscardPanel (panelHandle);
return 0;
}
/************************************
显示函数
**************************************/
void SetValue (void)
{
SetCtrlVal(panelHandle, PANEL_SCREEN, "");
SetCtrlVal(panelHandle, PANEL_SCREEN, str1);
}
/*****************************************
功能函数
****************************************/
void Func()
{
double str;
int i;
GetCtrlVal (panelHandle, PANEL_SCREEN, str1);
//Fmt (&strValue2, "%f<%s", str1);
strValue2 = atof(str1);
//GetCtrlVal (panelHandle, PANEL_SYMBOL, str1);
/*
if (strlen (str1)) //有负号
{
strValue2=-1;
}
*/
switch (flag)
{
case 1: //加法
str = strValue1+strValue2;
break;
case 2: //减法
str = strValue1-strValue2;
break;
case 3: //乘法
str = strValue1*strValue2;
break;
default: //除法
if (strValue2 == 0)
{
MessagePopup ("错误", "除数不能为0!");
return;
}
str = strValue1/strValue2;
break;
}
if (str>1E13-1) //最大12位数字
{
MessagePopup ("错误", "超过运算最大值!");
return;
}
sprintf (str1, "%12.10lf", str);
for (i= strlen (str1)-1; i>=0; i--)
{
if (str1[i] == '0') //消除小数点后无效0
{
str1[i] = '\0';
}
else if (str1[i] == '.') //消除小数点后完成
{
str1[i] = '\0';
break;
}
else //消除无效0完成
{
break;
}
}
SetValue();
mflag = 2; //运算结束
flag = 0; //运算完成,符号重置
}
/***********************
运算符操作
***********************/
int CVICALLBACK panelcb (int panel, int event, void *callbackData,
int eventData1, int eventData2)
{
switch (event)
{
case EVENT_RIGHT_CLICK:
RunPopupMenu (GetPanelMenuBar (panelHandle), MENUBAR_EDIT, panelHandle, eventData1, eventData2, 0, 0, 0, 0);
break;
case EVENT_CLOSE:
QuitUserInterface (0);
break;
}
return 0;
}
int CVICALLBACK cmd_sqrt (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
break;
}
return 0;
}
int CVICALLBACK cmd_div (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
GetCtrlVal (panel, PANEL_SCREEN, str1);
strValue1 = atof (str1);
SetCtrlVal (panel, PANEL_SCREEN, " ");
flag=4;
break;
}
return 0;
}
int CVICALLBACK clear (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
SetCtrlVal (panel, PANEL_SCREEN, " ");
break;
}
return 0;
}
int CVICALLBACK cmd_mul (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
GetCtrlVal (panel, PANEL_SCREEN, str1);
strValue1 = atof (str1);
SetCtrlVal (panel, PANEL_SCREEN, " ");
flag=3;
break;
}
return 0;
}
int CVICALLBACK cmd_daoshu (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
break;
}
return 0;
}
int CVICALLBACK cmd_equal (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
Func();
break;
}
return 0;
}
int CVICALLBACK cmd_plus (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
int handle;
switch (event)
{
case EVENT_COMMIT:
GetCtrlVal (panel, PANEL_SCREEN, str1);
strValue1 = atof (str1);
SetCtrlVal (panel, PANEL_SCREEN, " ");
flag=1;
//GetCtrlVal (panel, PANEL_SYMBOL, str1);
// if (strlen (str1)) //符号
// {
// strValue1=-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:
GetCtrlVal (panel, PANEL_SCREEN, str1);
strValue1 = atof (str1);
SetCtrlVal (panel, PANEL_SCREEN, " ");
flag=2;
break;
}
return 0;
}
int CVICALLBACK cmd_percent (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
break;
}
return 0;
}
/**************************
数字输入
***************************/
int CVICALLBACK cmd_9 (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
char labeltext[4];
switch (event)
{
case EVENT_COMMIT:
GetCtrlVal (panel, PANEL_SCREEN, str1);
if (strlen (str1)>=12) //只支持最长12位数字的运算
{
break;
}
GetCtrlAttribute (panel, control, ATTR_LABEL_TEXT, labeltext);
if (strcmp (str1, "0") == 0) //之前只有0,则不拼接
{
SetCtrlVal (panel, PANEL_SCREEN, labeltext);
}
else //拼接显示
{
strcat (str1, labeltext);
SetCtrlVal (panel, PANEL_SCREEN, str1);
}
break;
}
return 0;
}
int CVICALLBACK cmd_8 (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
char labeltext[4];
switch (event)
{
case EVENT_COMMIT:
GetCtrlVal (panel, PANEL_SCREEN, str1);
if (strlen (str1)>=12) //只支持最长12位数字的运算
{
break;
}
GetCtrlAttribute (panel, control, ATTR_LABEL_TEXT, labeltext);
if (strcmp (str1, "0") == 0) //之前只有0,则不拼接
{
SetCtrlVal (panel, PANEL_SCREEN, labeltext);
}
else //拼接显示
{
strcat (str1, labeltext);
SetCtrlVal (panel, PANEL_SCREEN, str1);
}
break;
}
return 0;
}
int CVICALLBACK cmd_7 (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
char labeltext[4];
switch (event)
{
case EVENT_COMMIT:
GetCtrlVal (panel, PANEL_SCREEN, str1);
if (strlen (str1)>=12) //只支持最长12位数字的运算
{
break;
}
GetCtrlAttribute (panel, control, ATTR_LABEL_TEXT, labeltext);
if (strcmp (str1, "0") == 0) //之前只有0,则不拼接
{
SetCtrlVal (panel, PANEL_SCREEN, labeltext);
}
else //拼接显示
{
strcat (str1, labeltext);
SetCtrlVal (panel, PANEL_SCREEN, str1);
}
break;
}
return 0;
}
int CVICALLBACK cmd_6 (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
char labeltext[4];
switch (event)
{
case EVENT_COMMIT:
GetCtrlVal (panel, PANEL_SCREEN, str1);
if (strlen (str1)>=12) //只支持最长12位数字的运算
{
break;
}
GetCtrlAttribute (panel, control, ATTR_LABEL_TEXT, labeltext);
if (strcmp (str1, "0") == 0) //之前只有0,则不拼接
{
SetCtrlVal (panel, PANEL_SCREEN, labeltext);
}
else //拼接显示
{
strcat (str1, labeltext);
SetCtrlVal (panel, PANEL_SCREEN, str1);
}
break;
}
return 0;
}
int CVICALLBACK cmd_5 (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
char labeltext[4];
switch (event)
{
case EVENT_COMMIT:
GetCtrlVal (panel, PANEL_SCREEN, str1);
if (strlen (str1)>=12) //只支持最长12位数字的运算
{
break;
}
GetCtrlAttribute (panel, control, ATTR_LABEL_TEXT, labeltext);
if (strcmp (str1, "0") == 0) //之前只有0,则不拼接
{
SetCtrlVal (panel, PANEL_SCREEN, labeltext);
}
else //拼接显示
{
strcat (str1, labeltext);
SetCtrlVal (panel, PANEL_SCREEN, str1);
}
break;
}
return 0;
}
int CVICALLBACK cmd_4 (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
char labeltext[4];
switch (event)
{
case EVENT_COMMIT:
/* if (flag != 0 && mflag == 0) //已输入了运算符号,但还未输入第二个数字,先重置显示
{
SetCtrlVal (panel, PANEL_SCREEN, "0");
SetCtrlVal (panel, PANEL_SYMBOL, " ");
mflag = 1; //可以进行运算
}
else if (mflag == 2) //之前完成了一次运算,则进行清空操作
{
SetCtrlVal (panel, PANEL_SCREEN, "0");
SetCtrlVal (panel, PANEL_SYMBOL, " ");
if (flag)
{
mflag = 1; //准备运算
}
else
{
mflag = 0; //重置运算状态
}
}
*/
GetCtrlVal (panel, PANEL_SCREEN, str1);
if (strlen (str1)>=12) //只支持最长12位数字的运算
{
break;
}
GetCtrlAttribute (panel, control, ATTR_LABEL_TEXT, labeltext);
if (strcmp (str1, "0") == 0) //之前只有0,则不拼接
{
SetCtrlVal (panel, PANEL_SCREEN, labeltext);
}
else //拼接显示
{
strcat (str1, labeltext);
SetCtrlVal (panel, PANEL_SCREEN, str1);
}
break;
}
return 0;
}
int CVICALLBACK cmd_3 (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
char labeltext[4];
switch (event)
{
case EVENT_COMMIT:
/* if (flag != 0 && mflag == 0) //已输入了运算符号,但还未输入第二个数字,先重置显示
{
SetCtrlVal (panel, PANEL_SCREEN, "0");
SetCtrlVal (panel, PANEL_SYMBOL, " ");
mflag = 1; //可以进行运算
}
else if (mflag == 2) //之前完成了一次运算,则进行清空操作
{
SetCtrlVal (panel, PANEL_SCREEN, "0");
SetCtrlVal (panel, PANEL_SYMBOL, " ");
if (flag)
{
mflag = 1; //准备运算
}
else
{
mflag = 0; //重置运算状态
}
}
*/ GetCtrlVal (panel, PANEL_SCREEN, str1);
if (strlen (str1)>=12) //只支持最长12位数字的运算
{
break;
}
GetCtrlAttribute (panel, control, ATTR_LABEL_TEXT, labeltext);
if (strcmp (str1, "0") == 0) //之前只有0,则不拼接
{
SetCtrlVal (panel, PANEL_SCREEN, labeltext);
}
else //拼接显示
{
strcat (str1, labeltext);
SetCtrlVal (panel, PANEL_SCREEN, str1);
}
break;
}
return 0;
}
int CVICALLBACK cmd_2 (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
char labeltext[4];
switch (event)
{
case EVENT_COMMIT:
GetCtrlVal (panel, PANEL_SCREEN, str1);
if (strlen (str1)>=12) //只支持最长12位数字的运算
{
break;
}
GetCtrlAttribute (panel, control, ATTR_LABEL_TEXT, labeltext);
if (strcmp (str1, "0") == 0) //之前只有0,则不拼接
{
SetCtrlVal (panel, PANEL_SCREEN, labeltext);
}
else //拼接显示
{
strcat (str1, labeltext);
SetCtrlVal (panel, PANEL_SCREEN, str1);
}
break;
}
return 0;
}
int CVICALLBACK cmd_1 (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
char labeltext[4];
switch (event)
{
case EVENT_COMMIT:
GetCtrlVal (panel, PANEL_SCREEN, str1);
if (strlen (str1)>=12) //只支持最长12位数字的运算
{
break;
}
GetCtrlAttribute (panel, control, ATTR_LABEL_TEXT, labeltext);
if (strcmp (str1, "0") == 0) //之前只有0,则不拼接
{
SetCtrlVal (panel, PANEL_SCREEN, labeltext);
}
else //拼接显示
{
strcat (str1, labeltext);
SetCtrlVal (panel, PANEL_SCREEN, str1);
}
break;
}
return 0;
}
int CVICALLBACK cmd_dot (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
break;
}
return 0;
}
int CVICALLBACK cmd_0 (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
char labeltext[4];
switch (event)
{
case EVENT_COMMIT:
GetCtrlVal (panel, PANEL_SCREEN, str1);
if (strlen (str1)>=12) //只支持最长12位数字的运算
{
break;
}
GetCtrlAttribute (panel, control, ATTR_LABEL_TEXT, labeltext);
if (strcmp (str1, "0") == 0) //之前只有0,则不拼接
{
SetCtrlVal (panel, PANEL_SCREEN, labeltext);
}
else //拼接显示
{
strcat (str1, labeltext);
SetCtrlVal (panel, PANEL_SCREEN, str1);
}
break;
}
return 0;
}
/***********************
菜单
************************/
void CVICALLBACK editcopy (int menuBar, int menuItem, void *callbackData,
int panel)
{
}
void CVICALLBACK editalwaystop (int menuBar, int menuItem, void *callbackData,
int panel)
{
}
void CVICALLBACK editexit (int menuBar, int menuItem, void *callbackData,
int panel)
{
QuitUserInterface(0);
}
void CVICALLBACK helpabout (int menuBar, int menuItem, void *callbackData,
int panel)
{
}
说明
回调函数以及界面自行搭建,以下为链接工程文件以作参考:
链接: CVI简易计算器