功能介绍:

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编写简易计算器相关推荐

  1. 软件工程-c语言--基于at89c51单片机c语言编写的计算器,基于AT89C1单片机C语言编写的计算器.doc...

    基于AT89C1单片机C语言编写的计算器 #include #define uint unsigned int #define uchar unsigned char sbit dula=P2^6; ...

  2. 用Android Studio 编写简易计算器

    用Android Studio 编写简易计算器 界面设计 功能的實現 其他配置 1.頂部標題 2.修改測試 这是用Android Studio编写的 简易计算器 .功能主要是实现简单的加减操作,以及比 ...

  3. 基于VC6.0恶搞小程序

    前言: 环境:VC6.0 小编去年暑假的时候看过杨中科的C语言也能干大事第二版,写了个挺有意思的小软件(挺简单的恶搞...): 视屏下载:点击打开链接 (第二版基于VC6.0,现在已经出了基于VS的, ...

  4. VC6.0的MFC简单计算器制作

    在VC中的计算器制作,我们开始要考虑的就是简单的计算器的是由什么构成的,有按钮,有显示框.按钮有数字的0~9部分还有小数点,,外加4个运算符号加减乘除,还有就是显示结果的等于号..可以的话可以加个清除 ...

  5. stm32基于FreeRtos下的电阻触摸屏简易计算器

    先上代码: void Draw_Keyboard_Layout(void) {LCD_ShowString(5,25,200,16,16,"Power by Vincent-NJW" ...

  6. java编写简易计算器_java实现简易计算器功能

    本文为大家分享了java实现简易计算器功能,具体内容如下 题目: 编写一个模拟计算器的程序.在面板中添加一个文本框(显示按键及运算结果). 10个数字按钮(0~9).4个运算按钮(加.减.乘.除).一 ...

  7. VC6.0下MFC按钮点击函数手动添加

    有些vc6.0的兼容性不好,按钮双击不能自动加载函数,这时候需要手动添加按钮函数 点击类向导,再找到控件名字,点击触发消息类型,再选Add function,改好名字,就OK了

  8. c语言vc6.0编写贪吃蛇,基于VC6.0的贪吃蛇游戏源码

    //******************************************************* //**************************************** ...

  9. 基于python:利用pyqt5设计简易计算器

    实训内容: 跟随学习,用python写一个能进行简易运算的计算器,并自己设计计算器的UI界面,并根据实际对外观做出一定的美化. 准备过程 本次使用的是Windows11,python环境3.9.15 ...

最新文章

  1. 海量数据的实时指标计算
  2. AttributeError: ‘Model‘ object has no attribute ‘_get_distribution_strategy
  3. 奈奎斯特采样定理_通俗理解奈奎斯特带宽
  4. vue实现搜索框记录搜索历史_2018-09-13 基于Vue的搜索栏功能实现(we-ui)
  5. *hdu5632Rikka with Array
  6. bmf mysql_bmf 的动态 - SegmentFault 思否
  7. CSS挂马及相应防范方法
  8. 大学生发展规划与就业指导(三)
  9. 最全常用正则表达式大全
  10. C语言EasyX详解(小球碰撞)
  11. odoo 密码加密 解析
  12. 【参赛日记】参加天池大数据竞赛
  13. UK EU 码对照表,USA EURO SIZE码对照表,国外衣服码对照表
  14. MAC怎样显示隐藏文件
  15. win10去掉快捷方式小箭头_win7去除快捷方式小箭头的方法教程
  16. 陈伟星“VVShare打车链”,打造区块链经济共享平台
  17. 罗素156句名言:人之所以有道德,是因为受到的诱惑还不够大
  18. 关于MFC中Ribbon界面如何修改标题属性问题
  19. Defensive Programming 防御式编程(Defensive Programming)
  20. 学会向上管理,4个提问技巧,让你事半功倍

热门文章

  1. 智慧停车场行业室外停车场实用价值
  2. 算法篇-----时间复杂度的概念
  3. EXCEL公式及函数的高级应用(1)
  4. 管理工具 - QC 安装 问题集合
  5. java字母排序_【Java】实现按中文首字母排序 | 学步园
  6. 视频教程-finereport从入门到实战视频教程-大数据
  7. 分段二次插值例题_二次样条插值[篇].doc
  8. 华为鸿蒙系统,霸榜 GitHub!
  9. OpenHarmony3.0在树莓派3B上的烧录与通讯
  10. 无人机项目跟踪记录六十五----无线收发模块电路