基于VC6.0用MFC编写简易计算器
功能介绍:
1> 标准型:能进行加、减、乘、除四则运算,具有清空、回退功能,还附加了添加小数点、化为百分数的功能。
2> 科学型:新增了求三角函数(sin、cos、tan)、反三角函数(arcsin、arccos、arctan),取对数(ln、log10),π,求平方,求任意次方,求e的任意次方、10的任意次方,开平方,开任意次方,取模,求阶乘,取倒数的功能。
3> 界面:添加了位图资源设置成对话框的背景图;添加CButtonST类实现按钮对鼠标的响应(悬停、按下、普通状态)。
界面预览:
按钮设计:
(1)添加全局变量:
bool flag=false; //标记一次运算是否结束
在类MyCalculatorDlg中添加变量:
CString m_edit; //编辑框映射的变量
CString s1;//存放按下操作符前的m_edit值
CString s2;//存放按下操作符后的m_edit值
int i; //用以标志双目运算符,在等号的switch中作用
(2)数字按钮0~9、小数点 .、圆周率π按钮的设计
以数字“1”为例:
先在classwizard中对单击鼠标消息add function,函数名为OnButton1,然后在CMyCalculatorDlg.cpp中编码,具体如下:
void CMyCalculatorDlg::OnButton1()
{// TODO: Add your control notification handler code hereif(flag==true) //如果上次运算已结束{m_edit=""; //清空编辑框flag=false; //flag重置为false}m_edit+="1"; //在编辑框的字符串上添加1UpdateData(false); //刷新编辑框
}
其他的数字2~9、0、小数点、π以此类推。
(3)单目运算符按钮的设计
单目运算符包括:化为百分数%,三角函数sin、cos、tan,反三角函数arcsin、arccos、arctan,取对数ln、log,平方数x²,e的x次方,10的x次方,开平方√,阶乘n!,取倒数1/x。
1> 化为百分数%
void CMyCalculatorDlg::OnPercent() //化为百分数函数
{// TODO: Add your control notification handler code heredouble num1;UpdateData(true); //获取编辑框内容s1=m_edit; //将编辑框的字符串保存到s1num1=atof(s1); //将s1转化为double型数据并保存到num1num1=num1*0.01; //num1化为百分数m_edit.Format("%f",num1); //num1转化为字符串UpdateData(false); //刷新编辑框
}
2> 三角函数sin、cos、tan
以sin为例:
void CMyCalculatorDlg::OnSin() //sin函数
{// TODO: Add your control notification handler code heredouble num1,num2,tmp;UpdateData(true);s1=m_edit;num1=atof(s1); tmp=num1*PI/180.0; //将num1转化为弧度制num2=sin(tmp);m_edit.Format("%f",num2);flag=true; //标记一次运算结束UpdateData(false);
}
注意:在math.h中三角函数是以弧度制计算的,所以要先把角度制的数值转化为弧度制。cos、tan以此类推。
3> 反三角函数arcsin、arccos、arctan
以arcsin为例:
void CMyCalculatorDlg::OnArcsin() //arcsin函数
{// TODO: Add your control notification handler code heredouble num1,num2,tmp;UpdateData(true);s1=m_edit;num1=atof(s1);tmp=asin(num1); //计算num1的asin值num2=tmp*180.0/PI; //将计算结果转化为角度制m_edit.Format("%f",num2);flag=true;UpdateData(false);
}
注意:与求三角函数类似,反三角函数所求结果是弧度制的,所以最后要把结果转化为角度制。arccos、arctan以此类推。
4> 取对数ln、log
void CMyCalculatorDlg::OnLn() //ln函数
{// TODO: Add your control notification handler code heredouble num1,num2;UpdateData(true);s1=m_edit;num1=atof(s1);num2=log(num1); //求ln值m_edit.Format("%f",num2);flag=true;UpdateData(false);
}
类似的,求log10的值就将调用函数log变为log10即可。
5> 平方数x²
void CMyCalculatorDlg::OnSquare() //平方函数
{// TODO: Add your control notification handler code heredouble num1;UpdateData(true);s1=m_edit;num1=atof(s1);num1=num1*num1; //求平方m_edit.Format("%f",num1);flag=true;UpdateData(false);
}
6> e的x次方,10的x次方
void CMyCalculatorDlg::OnExp() //e的x次方函数
{// TODO: Add your control notification handler code heredouble num1;UpdateData(true);s1=m_edit;num1=atof(s1);num1=exp(num1); //调用函数exp求e的x次方m_edit.Format("%f",num1);flag=true;UpdateData(false);
}
类似的求10的x次方把调用函数改为pow(10,num1)即可。
7> 开平方√
void CMyCalculatorDlg::OnSquareRoot() //开平方函数
{// TODO: Add your control notification handler code heredouble num1;UpdateData(true);s1=m_edit;num1=atof(s1);if(num1<0) //错误处理MessageBox("负数没有平方根");else{num1=sqrt(num1); //调用函数sprt开平方m_edit.Format("%f",num1);flag=true;}UpdateData(false);
}
8> 阶乘n!
void CMyCalculatorDlg::OnFac() //阶乘运算
{// TODO: Add your control notification handler code here
double num1,num2=1.0;
UpdateData(true);
s1=m_edit;
num1=atof(s1);
if(num1>170) //double型算阶乘的上限是170!MessageBox("溢出");
else
{if(num1==0||num1==1)num2=1;else{for(int j=num1;j>=1;j--)num2*=j;}m_edit.Format("%f",num2);flag=true;}UpdateData(false);
}
9> 取倒数1/x
void CMyCalculatorDlg::OnRec() //倒数运算
{// TODO: Add your control notification handler code heredouble num1;s1=m_edit;num1=atof(s1);if(num1==0) //出错处理MessageBox("被除数不能为0");else{num1=1.0/num1;m_edit.Format("%f",num1);}UpdateData(false);
}
(4) 双目运算符的设计
双目运算符包括:加+,减-,乘*,除/,取模Mod,求任意次方x^y,开任意次方根y√x。
以加+为例:
void CMyCalculatorDlg::OnAdd() //加法运算
{// TODO: Add your control notification handler code heres1=m_edit;//保存运算数到s1i=1;//置+的i值为1m_edit="";//清空编辑框UpdateData(false);
}
减-,乘*,除/,取模Mod,求任意次方x^y,开任意次方根y√x以此类推,其i值分别为2,3,4,5,6,7。
(5) 等号=按钮的设计
等号按钮主要与双目运算符配合使用。
void CMyCalculatorDlg::OnEqual() //等号按钮
{// TODO: Add your control notification handler code heredouble num1,num2,ans;switch(i){case 1: //加法s2=m_edit;//把另一个运算数保存到s2num1=atof(s1);num2=atof(s2);ans=num1+num2;m_edit.Format("%f",ans);UpdateData(false);flag=true;break;case 2: //减法s2=m_edit;num1=atof(s1);num2=atof(s2);ans=num1-num2;m_edit.Format("%f",ans);UpdateData(false);flag=true;break;case 3: //乘法s2=m_edit;num1=atof(s1);num2=atof(s2);ans=num1*num2;m_edit.Format("%f",ans);UpdateData(false);flag=true;break;case 4: //除法s2=m_edit;num1=atof(s1);num2=atof(s2);ans=num1/num2;m_edit.Format("%f",ans);UpdateData(false);flag=true;break;case 5: //取模s2=m_edit;num1=atof(s1);num2=atof(s2);ans=(int)num1%(int)num2;//要对num1、num2强行转化为int型m_edit.Format("%f",ans);UpdateData(false);flag=true;break;case 6: //乘方s2=m_edit;num1=atof(s1);num2=atof(s2);ans=pow(num1,num2);//调用pow函数m_edit.Format("%f",ans);UpdateData(false);flag=true;break;case 7: //开任意次方s2=m_edit;num1=atof(s1);num2=atof(s2);if(num2==0) //不能开0次方根MessageBox("出错");else{num2=1.0/num2;//开n次方根相当于求它的1/n幂ans=pow(num1,num2);m_edit.Format("%f",ans);UpdateData(false);flag=true;}break;}
}
(6) 清空CE和后退Backspace按钮的设计
void CMyCalculatorDlg::OnClear() //清空
{// TODO: Add your control notification handler code herem_edit=""; //清空UpdateData(false);
}void CMyCalculatorDlg::OnBackspace() //后退
{// TODO: Add your control notification handler code herem_edit=m_edit.Left(m_edit.GetLength()-1); //调用CString类函数Left从左截
//取长度-1的字符UpdateData(false);
}
(7)正负号±按钮的设计
void CMyCalculatorDlg::OnPlusMinus() //正负号按钮
{// TODO: Add your control notification handler code hereif(m_edit.Left(1)=='-')//如果已经是负数m_edit=m_edit.Right(m_edit.GetLength()-1);//则变为正数, elsem_edit='-'+m_edit; //否则直接添负号UpdateData(false);
}
添加菜单:
说明:添加一个“模式”菜单,内含两个子菜单:标准型和科学型。
视图如下:
(1) 导入菜单
在OnInitDialog()函数内添加语句:
m_Menu.LoadMenu(IDR_MENU1); //导入菜单
SetMenu(&m_Menu);
(2)对标准型子菜单的响应
void CMyCalculatorDlg::OnMENUStandard()
{// TODO: Add your command handler code here this->SetWindowPos(NULL,0,0,410,510,SWP_NOMOVE);
}
(3)对科学型子菜单的响应
void CMyCalculatorDlg::OnMenuScience()
{// TODO: Add your command handler code herethis->SetWindowPos(NULL,0,0,670,510,SWP_NOMOVE);
}
(4)初始界面设计
因为设计的时候是整个科学型计算器设计的,所谓标准型只是隐藏了部分窗口,因此要在初始化对话框函数OnInitDialog()内添加语句:
this->SetWindowPos(NULL,0,0,410,510,SWP_NOMOVE);
背景图的导入:
把要作为背景图的图片转化为.bmp格式,然后把它作为位图资源导入。然后修改CMyCalculatorDlg.cpp中的OnPaint()函数中if-else语句中的else部分:
//CDialog::OnPaint();//加入背景图之后要禁用这个调用
CPaintDC dc(this);
CRect rect;
GetClientRect(&rect);
CDC dcMem;//创建内存DC
dcMem.CreateCompatibleDC(&dc);
CBitmap bmpBG;//定义CBitmap对象
bmpBG.LoadBitmap(IDB_BITMAP_BG1);//加载位图
BITMAP bitmap;//BITMAP句柄
bmpBG.GetBitmap(&bitmap);//将位图资源绑定BITMAP句柄
CBitmap *pbmpOld=dcMem.SelectObject(&bmpBG);//替换原位图
dc.SetStretchBltMode(COLORONCOLOR);//若不设置这个模式,图片会失真
dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0, bitmap.bmWidth,
bitmap.bmHeight,SRCCOPY);//拉伸图片使其全屏
背景图:
设计按钮对鼠标敏感:
(1)从网上下载CButtonST类的四个文件BtnST.h,BtnST.cpp,BCMenu.h,BCMenu.cpp,加入到当前工程中。在StdAfx.h头文件中把BtnST.h和BCMenu.h两个头文件include进来。删掉原有的.clw文件,重新生成一个,最后rebulid all,就把CButtonST类添加进来了。
(2)每个按钮都映射一个CButtonST类对象,然后在OnInitDialog()函数内对其进行编码。
以清空键CE为例:
m_btClear.SetColor(CButtonST::BTNST_COLOR_BK_IN,RGB(255,192,203));
m_btClear.SetColor(CButtonST::BTNST_COLOR_BK_OUT,RGB(252,230,201));
m_btClear.SetColor(CButtonST::BTNST_COLOR_BK_FOCUS,RGB(252,230,201));
m_btClear.SetColor(CButtonST::BTNST_COLOR_FG_IN,RGB(30,144,255));
m_btClear.SetColor(CButtonST::BTNST_COLOR_FG_FOCUS,RGB(218,112,214));
m_btClear.SetColor(CButtonST::BTNST_COLOR_FG_OUT,RGB(218,112,214));
说明:BK是指按钮的背景色,FG是指按钮的前景色(即文字部分);IN是指鼠标进入按钮(也可理解为鼠标悬停)时按钮的颜色,OUT是指鼠标离开按钮(也即普通状态下)按钮的颜色,FOCUS是指按钮被按下时的颜色。
其他按钮以此类推,科学型新增的按钮与标准型的按钮颜色不同。
工程视图:
运行结果:
1.界面:
标准型:
科学型:
2.测试用例:
测试1:89+123=212
测试2:0取倒数
测试3:tan 25
心得:
在编写计算器的过程中,按钮功能的设计是比较好写的一块,只要懂得了对按钮添加功能的原理,剩下的数学运算基本调用math.h中的函数即可。对我而言,难的是用MFC写界面这一块。为对话框导入背景图还算容易,通过网上查资料懂得把背景图当作位图资源然后与句柄绑定即可,需要注意的是要设置SetStretchBltMode(COLORONCOLOR);若不设置这个模式,图片会失真。至于设置按钮对鼠标敏感这一块,我查了许多资料,最终才发现可以用CButtonST类中的功能达到这一目的。CButtonST是CButton类的继承类,在把它导入到工程的过程中也出现了大大小小的许多错误,最终都通过网上查资料一一解决。
总而言之,写一个简易计算器没有我想象中的简单,通过本次实验,我觉得我开始懂得如何独立处理编程过程中的一些问题,也懂得要善于从网上查阅资料解决问题,这是一次很好的体验,搞开发不容易,必须要有耐心。
基于VC6.0用MFC编写简易计算器相关推荐
- 软件工程-c语言--基于at89c51单片机c语言编写的计算器,基于AT89C1单片机C语言编写的计算器.doc...
基于AT89C1单片机C语言编写的计算器 #include #define uint unsigned int #define uchar unsigned char sbit dula=P2^6; ...
- 用Android Studio 编写简易计算器
用Android Studio 编写简易计算器 界面设计 功能的實現 其他配置 1.頂部標題 2.修改測試 这是用Android Studio编写的 简易计算器 .功能主要是实现简单的加减操作,以及比 ...
- 基于VC6.0恶搞小程序
前言: 环境:VC6.0 小编去年暑假的时候看过杨中科的C语言也能干大事第二版,写了个挺有意思的小软件(挺简单的恶搞...): 视屏下载:点击打开链接 (第二版基于VC6.0,现在已经出了基于VS的, ...
- VC6.0的MFC简单计算器制作
在VC中的计算器制作,我们开始要考虑的就是简单的计算器的是由什么构成的,有按钮,有显示框.按钮有数字的0~9部分还有小数点,,外加4个运算符号加减乘除,还有就是显示结果的等于号..可以的话可以加个清除 ...
- stm32基于FreeRtos下的电阻触摸屏简易计算器
先上代码: void Draw_Keyboard_Layout(void) {LCD_ShowString(5,25,200,16,16,"Power by Vincent-NJW" ...
- java编写简易计算器_java实现简易计算器功能
本文为大家分享了java实现简易计算器功能,具体内容如下 题目: 编写一个模拟计算器的程序.在面板中添加一个文本框(显示按键及运算结果). 10个数字按钮(0~9).4个运算按钮(加.减.乘.除).一 ...
- VC6.0下MFC按钮点击函数手动添加
有些vc6.0的兼容性不好,按钮双击不能自动加载函数,这时候需要手动添加按钮函数 点击类向导,再找到控件名字,点击触发消息类型,再选Add function,改好名字,就OK了
- c语言vc6.0编写贪吃蛇,基于VC6.0的贪吃蛇游戏源码
//******************************************************* //**************************************** ...
- 基于python:利用pyqt5设计简易计算器
实训内容: 跟随学习,用python写一个能进行简易运算的计算器,并自己设计计算器的UI界面,并根据实际对外观做出一定的美化. 准备过程 本次使用的是Windows11,python环境3.9.15 ...
最新文章
- 海量数据的实时指标计算
- AttributeError: ‘Model‘ object has no attribute ‘_get_distribution_strategy
- 奈奎斯特采样定理_通俗理解奈奎斯特带宽
- vue实现搜索框记录搜索历史_2018-09-13 基于Vue的搜索栏功能实现(we-ui)
- *hdu5632Rikka with Array
- bmf mysql_bmf 的动态 - SegmentFault 思否
- CSS挂马及相应防范方法
- 大学生发展规划与就业指导(三)
- 最全常用正则表达式大全
- C语言EasyX详解(小球碰撞)
- odoo 密码加密 解析
- 【参赛日记】参加天池大数据竞赛
- UK EU 码对照表,USA EURO SIZE码对照表,国外衣服码对照表
- MAC怎样显示隐藏文件
- win10去掉快捷方式小箭头_win7去除快捷方式小箭头的方法教程
- 陈伟星“VVShare打车链”,打造区块链经济共享平台
- 罗素156句名言:人之所以有道德,是因为受到的诱惑还不够大
- 关于MFC中Ribbon界面如何修改标题属性问题
- Defensive Programming 防御式编程(Defensive Programming)
- 学会向上管理,4个提问技巧,让你事半功倍