CVI 简易计算器

CVI 简易计算器

功能介绍

实现多位数加减乘除运算(可自行添加运算规则),菜单栏退出功能(有附加文件可添加功能),保留小数位数功能,显示运算符号功能暂未开发。界面效果图如下:
在这里插入图片描述

实现代码

#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简易计算器

CVI计算器视觉设计)是指通过人机交互界面设计来改进计算器的用户体验和功能。设计一个CVI计算器的步骤可以如下: 1. 定义目标:首先,明确所设计的CVI计算器的目标和使用场景。确定设计的目的是为了什么样的用户群体以及使用条件。 2. 用户需求分析:了解目标用户的需求和使用习惯,包括用户频繁使用的功能、所需的计算范围等。可以通过问卷调查、用户访谈等方式获取用户反馈。 3. 界面设计:根据用户需求和目标,设计计算器的界面。界面应简洁明了,用户友好,易于操作。可以使用图形、颜色、字体等设计元素来提高用户体验。 4. 功能设计:根据用户需求和界面设计,确定计算器的功能。包括基本四则运算、科学计算、单位换算、历史记录等常用功能。同时,要考虑计算器的扩展性,为未来可能的功能增添适当的设计空间。 5. 布局设计:将计算器的各个功能模块合理地布局在界面上,以便用户轻松找到所需功能。可以采用标签、分组、图标等方式进行布局。 6. 控件设计:设计计算器中各个控件的样式和交互方式。控件包括按钮、输入框、显示区域等。控件的样式应简洁明了,并且用户能够直观地明白其功能和使用方式。 7. 用户测试和反馈:在设计完成后,进行用户测试和收集反馈。根据用户的反馈,进行相应的优化和改进,提高计算器的易用性和功能性。 通过以上步骤的设计,可以有效提升CVI计算器的用户体验,使用户能够方便、快捷地进行各类计算操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值