(2020年编辑)手把手教你MFC编程计算器

合集下载

简单MFC程序设计(编写一个小型计算器)

简单MFC程序设计(编写一个小型计算器)
} void CTestDlg::OnButtonNum0() {
if(dotflag==1) {
quan= quan*10; m_Num += 0 / (double)quan; } else { if(numflag==1) {
m_Num = m_Num * 10 + 0; } else m_Num = 0; } numflag = 1; mark=1; UpdateData(FALSE); } void CTestDlg::OnButtonZhengfu() { UpdateData(); m_Num = 0-m_Num; UpdateData(FALSE); } void CTestDlg::OnButtonDengyu()
m_Num = m_Num * 10 + 8; } else m_Num = 8; } numflag = 1; mark=1; UpdateData(FALSE); } void CTestDlg::OnButtonNum9()
5
{ if(dotflag==1) { quan= quan*10; m_Num += 9 / (double)quan; } else { if(numflag==1) { m_Num = m_Num * 10 + 9; } else m_Num = 9; } numflag = 1; mark=1; UpdateData(FALSE);
是否为数字的 int 型标志 mark。
c) 然后考虑到在计算过程中 num1 和 num2 的储存状态有三种,num1==0 和
num2==0,也就是程序开始运行还没有开始录入数字的状态;num1!=0 和
num2==0,也就是第一个数字已经录入,第二个数字还没有录入的状态这时

mfc计算器程序设计详细

mfc计算器程序设计详细

mfc计算器程序设计详细
MFC是Microsoft基础类的缩写,用于Windows下的GUI程序开发,封装了许多常用的功能,其中包括控件、多线程、消息传递等等。

下面我们将基于MFC来编写一个简单的计算器程序。

首先,我们需要创建一个MFC应用程序并添加一个对话框。

然后,我们需要在对话框中添加各种控件,比如按钮、文本框、标签等等。

在这个例子中,我们需要添加数字按钮、运算符按钮和一个显示结果
的文本框。

接着,我们需要定义各种事件函数,比如数字按钮的点击事件、
运算符按钮的点击事件等等。

在这些事件函数中,我们需要根据相应
的操作完成对应的计算,并将结果显示到文本框中。

当然,我们还需
要处理一些特殊情况,比如输入非法字符、除以0等等。

最后,我们需要将所有的控件和事件函数进行绑定,使得程序能
够正常地运行。

这个过程中,我们将使用MFC提供的消息映射机制来
处理鼠标和键盘事件,以及相应的消息传递机制来更新界面。

总之,在MFC的帮助下编写一个计算器程序不仅方便快捷,而且
代码逻辑清晰,可读性好。

使用VC6编写一个计算器MFC

使用VC6编写一个计算器MFC

使用VC6编写一个计算器MFC回答如下:要使用VC6编写一个计算器MFC应用程序,首先需要创建一个新的MFC项目。

在VC6中,选择“创建一个新的工程”,然后选择“MFC应用程序”,并命名该项目为“Calculator”。

接下来,在“CalculatorDlg.h”文件中,可以编写计算器对话框类的代码。

在该类中,需要声明所有添加到对话框中的控件的成员变量。

例如,可以声明一个`CEdit`类型的指针变量来引用屏幕上的文本框控件。

此外,还可以声明其他成员变量来存储计算器的状态和当前操作数的值。

然后,在“CalculatorDlg.cpp”文件中,可以实现计算器对话框类的代码。

在该文件中,需要实现对话框的初始化、按钮单击事件的处理等功能。

例如,可以在对话框的`OnInitDialog`函数中初始化计算器的状态,并将其他控件的消息映射到对应的成员函数上。

然后,在对应的成员函数中,可以编写相应的代码来处理按钮单击事件,进行计算,并将结果显示在屏幕上。

在编写计算器的核心功能时,可以使用`+`、`-`、`*`和`/`等运算符来实现加法、减法、乘法和除法。

此外,还可以添加其他功能,如取余、开方等。

为了实现这些功能,可以在对话框类中添加成员函数,然后在相应的按钮单击事件中调用这些函数。

最后,在项目的构建选项中,将“字符集”设置为“使用Unicode字符集”,以支持使用中文。

然后,编译并运行该项目,就可以看到一个MFC计算器应用程序在屏幕上显示出来。

总结起来,在VC6中编写一个计算器MFC应用程序需要完成以下步骤:1.创建新的MFC项目,并添加所需的控件。

2.在对话框类中声明和实现计算器界面的成员变量和函数。

3.在对应的按钮单击事件处理函数中编写计算器的核心功能。

4. 在项目的构建选项中设置字符集为Unicode字符集。

5.编译并运行项目,测试计算器应用程序。

以上是一个简单的使用VC6编写一个计算器MFC的步骤。

当然,具体的实现还有很多细节需要注意和完成,如错误处理、界面美化等。

mfc入门教程之实现一个简单的计算器

mfc入门教程之实现一个简单的计算器

mfc⼊门教程之实现⼀个简单的计算器mfc学习之前的了解什么是mfc?MFC是微软基础类的缩写(Microsoft Foundation Classes),是⼀个庞⼤的类库,可以理解为⼀种在Windows上开发软件的架构,是微软专为Visual C++定制的。

该类库提供⼀组通⽤的可重⽤的类库供开发⼈员使⽤。

没有MFC之前,Windows上⽤Win32 API进⾏编程,之后MFC出现,在⼀定程度上提⾼了软件开发效率,它是对win32 API的封装,所以易⽤性好,不过性能会⽐win32开发低⼀些,⼆者各有所长。

在Windows上开发界⾯程序以前⽤MFC最合适,能兼顾效率和性能。

简单来说mfc就是⽅便windows程序开发的框架,不单单是界⾯,更有很多类库。

mfc能⼲什么?在学习mfc之前想必⼤家都会关系这个问题,很多⼈学习了c++,或者是学习了c和c++之后发现还是只能⿊窗⼝下⾯做做数学题,写写算法,做不出什么实际的东西(这⾥不是说c/++做不出实际的东西,⽽是⼤多数的⼈做不出)。

问这个问题就像问⼀把剪⼑能⼲什么,剪⼑什么也⼲不了,我们可以拿着剪⼑剪东西,剪的好坏更多的是在于使⽤者⽽不是⼯具本⾝。

当使⽤⼀件⼯具熟练之后去使⽤同类的⼯具你会发现很轻松就能上⼿,因为它们看似有区别实则万变不离其宗。

mfc和qt的选择很多⼈会去推荐学习qt说mfc过时了,如果你想要跨平台那么qt⾮你莫属,如果只是在windows上,那么mfc⽆可替代。

⽆论是qt还是mfc在windows平台上内部的实现原理都是⼀样的,只是封装上有些区别。

mfc制作简单计算器-界⾯设计1.新建mfc项⽬启动vs2013,点击⽂件->新建->项⽬->vc++->mfc应⽤程序点击确定进⼊mfc应⽤程序向导下⼀步选择基于对话框,点击完成。

这时候mfc为我们⽣成了默认的界⾯,⼀个静态⽂本框,两个按钮。

2.计算器界⾯设计⾸先删除三个默认创建的控件,选中之后右键,删除或者直接按下delete键。

MFC实现简单计算器11页

MFC实现简单计算器11页

MFC实现简易计算器姓名柳超学号**********专业计算机科学与技术指导老师蒋年德2013年01月12日一、设计题目设计一个基于对话框的简单计算器,实现整数、小数的加减乘除四则运算以及开方、阶乘、取对数等操作。

二、运行环境硬件:Haier A60 Notebook,Celeron M 1.86GHz\512MB\250GB软件:Windows xp professional 5.1,visual C++ 6.0三、算法设计的思想打开计算器程序,输入数据,开始时编辑框成员变量m_num初始化为零。

按下数字按钮后,根据bool型变量b_zf判断m_num的正负号,对其进行相关处理,然后在判断是否有小数点,处理后输出结果。

同时根据judge的大小,判断是单目运算还是双目运算,进入不同的处理程序,最终输出结果。

若按下双目运算符,则把m_num存入num2,按下输入第二个操作数并算出结果。

若按下的是单目运算符,则直接对其处理得出结果。

若按下清零,则m_num 等于0.在运算中还要判断运算是否合法,以及结果是否超出显示范围,以做出相关提示,按下清零。

算出后把结果保存至num2。

若需用算出的结果继续运算则回到输入完第一个操作数后,若不需要则判断试否需要开始新一轮的运算,不需要则结束。

四、流程图五、算法分析设计在visual C++ 6.0中新建一个MFC APPWizard[exe]工程文件,文件名为CALU,应用程序类型选为基本对话,完成后,在Dialog中画出计算器的基本控件,包括0~10个数字按钮,符号转换按钮“+/-”,小数点符号“.”,加、减、乘、除四个双目运算符按钮,开方“sqrt”,阶乘“n!”,取对数“ln”等三个单目运算符按钮,计算并显示运算结果的等于号“=”按钮,以及用于退回的“backspace”按钮,清除“clear”按钮和退出“exit”按钮,一个编辑框,用于显示运算值。

最后给每个控件定义ID号和标题。

MFC简单计算器编程步骤

MFC简单计算器编程步骤

1,准备环境:Microsoft Visual C++6.0
2,打开Microsoft Visual C++6.0,选择【文件】,点击新建,再出现的对话框中选择MFC AppWizard(exe),然后设置工程名和位置,如下图所示,点击确定
3,在出现的对话框中选择(基本对话框),点击完成,如下图所示
4,再出现的对话框中添加编辑框和按钮,并进行布局如下图
注:点击按钮右键属性,即可设置按钮上的数字和运算符显示
5,然后单击编辑框,接着按组合键Ctrl+W,再出现的对话框内选择【Member Variable】,出现下图所示
6,然后选项按钮【Add Variable...】,再出现的对话框内进行设置,如下图中所示,接着点击【OK】,接着点击确定,返回最初的对话框
7,然后切换到ClassViewj界面,双击CCalculatorDlg,在public中定义如下变量8,然后进行数字设置,如双击【1】按钮,添加如下代码
9,然后进行等号设置,双击【=】按钮,添加如下代码
10,进行运算符设置,如双击【+】,添加如下代码11,进行CE设置,双击【CE】,添加如下代码
12,最后一步,调试运行,结果如下
因为时间和水品有限,只能做到这里了,希望对有兴趣的人有一定帮助
版权归孤独邪剑所有,尽请分享,哈哈。

MFC计算器实现步骤和代码

MFC计算器实现步骤和代码

MFC计算机程序步骤:1. 在进入VC++的第一个界面下,选择MFC AppWizard(exe),并设置工程名机器所在位置。

2. 在MFC AppWizard—step1 中选中Dialog based 选项,建立一个基于对话框的程序框架。

3. 使用资源编辑器建立对话框4. 编辑其中的各个控件的属性5. 插入菜单资源并编辑各项属性各属性为:Caption + * / ClearID ID_ADD_MENU ID_DIFFERENCE _MENU ID_MULTIPL Y_MENU ID_DEVIDE_MENU ID_CLEAR_MENUAbout ExitID_ABOUT_MENU ID_EXIT_MENU6. 添加代码使用Class Wizard 给编辑框连接变量(1)实现基本的加、减、乘、除的代码的添加。

(2)添加与菜单相关联的代码(3)填添加与滚动条相关联的代码在MFC AppWized(exe)项目下做。

界面自己做1.在对话框的头文件CalculatorDlg.h中添加#include<math.h>2.为CCalculatorDlg类添加成员数据和成员函数double number1,number2;int NumberState,OperationState;void cal();并在CCalculatorDlg类的构造函数中增加NumberState=1;3.添加消息按钮afx_msg void OnNumberKey(UINT nID);afx_msg void OnOperationKey(UINT nID);4.在CalculatorDlg.cpp文件中BEGIN_MESSAGE_MAP(CMy1Dlg, CDialog)和END_MESSAGE_MAP()间添加代码ON_COMMAND_RANGE(IDC_NUMBER1,IDC_NUMBER10,OnNumberKey)ON_COMMAND_RANGE(IDC_NUMBER11,IDC_NUMBER20,OnOperationKey)5.为成员函数OnNumberKey和OnOperationKey添加代码void CCalculatorDlg::OnNumberKey(UINT nID){int n=0;switch(nID){case IDC_NUMBER1:n=1;break;case IDC_NUMBER2:n=2;break;case IDC_NUMBER3:n=3;break;case IDC_NUMBER4:n=4;break;case IDC_NUMBER5:n=5;break;case IDC_NUMBER6:n=6;break;case IDC_NUMBER7:n=7;break;case IDC_NUMBER8:n=8;break;case IDC_NUMBER9:n=9;break;case IDC_NUMBER10:n=0;break;}if(NumberState==1){m_result=m_result*10+n;number1=m_result;UpdateData(FALSE); // 更新编辑框中的值}else{m_result=m_result*10+n;number2=m_result;UpdateData(FALSE);}}void CCalculatorDlg::OnOperationKey(UINT nID){switch(nID){case IDC_NUMBER13: // "/"按钮OperationState=1;UpdateData(FALSE);m_result=0;NumberState=2;break;case IDC_NUMBER14: // "*"按钮OperationState=2;UpdateData(FALSE);m_result=0;NumberState=2;break;case IDC_NUMBER15: // "+"按钮OperationState=3;UpdateData(FALSE);m_result=0;NumberState=2;break;case IDC_NUMBER16: // "-"按钮OperationState=4;UpdateData(FALSE);m_result=0;NumberState=2;break;case IDC_NUMBER17: // "C"按钮,撤消用,不需要可以删除number1=number2=m_result=0;UpdateData(FALSE);NumberState=1;break;case IDC_NUMBER20: // "="按钮cal(); // 调用cal成员函数break;}}6.为成员函数cal()添加代码void CCalculatorDlg::cal(){switch(OperationState){case 1:m_result=(double)number1/number2;UpdateData(FALSE); // 更新编辑框中的结果number1=m_result; // 把此次的运算结果作为下一次运算的第一个操作数NumberState=2; // 下次输入的数作为第二个操作数break;case 2:m_result=number1*number2;UpdateData(FALSE); // 更新编辑框中的结果number1=m_result;NumberState=2;break;case 3:m_result=number1+number2;UpdateData(FALSE); // 更新编辑框中的结果number1=m_result;NumberState=2;break;case 4:m_result=number1-number2;UpdateData(FALSE); // 更新编辑框中的结果number1=m_result;NumberState=2;break;}OperationState=0;} 注意按钮的ID号要和程序中的ID号相同!!!!。

用MFC制作简易计算器

用MFC制作简易计算器

面向对象编程技术课程设计课题名称:用VC++制作简单计算器用VC++制作简单计算器简述:该课程设计将实现一个简单计算器。

其类似于Windows附件中自带的计算器。

这个计算器可以实现简单的四则运算功能,而且具有简洁大方的图文外观。

系统具有良好的界面和必要的交互信息。

即时准确地获得需要的计算的结果,充分降低了数字计算的难度,从而节约了时间,对人们的生活有一定的帮助。

在课程设计中,程序设计设计语言采用Visual C++,在程序设计中,采用了面向对象解决问题的方法。

课题背景计算器是日常生活中十分便捷有效的工具,能实现加、减、乘、除简单运算的工具。

要实现计算功能,可以用VC++的知识编写程序来解决此问题。

该计算器大大的降低了数字计算的难度及提高了计算的准确度和精确度。

该计算器使用非常简单和方便,对广大中小学生的学习有巨大帮助作用,也对在职人员的工作有点帮助作用。

功能说明系统具有良好的界面;必要的交互信息;简约美观的效果。

使用人员能快捷简单地进行操作。

可单机按钮进行操作即时准确地获得需要的计算的结果,充分降低了数字计算的难度和节约了时间,对人们的生活有一定的帮助。

(1)包含的功能有:加、减、乘、除;(2)计算器上数字分为显示区,可以显示用户所点击的按键,最后显示结果;按键区,可以让用户选择所需的数字以及小数点;功能区,该区域提供用户所需的运算按钮;(3)计算功能基本上是用系统内部函数;(4)“AC”按钮可以清除所有已输入的数据从头计算;(5)“DEL”按钮可以删除所输入的最后以为数字;编辑资源创建步骤新建一个MFC基于对话框的工程VC++对话框界面右击按钮,修改按钮的属性建立类向导最后点击Edit Code就可以添加代码对其它按钮的操作与之类似,对编辑框的“建立类向导”有点区别,这里不附详细步骤代码展示“1”按钮对应的代码void CMyDlg::OnButton1(){UpdateData(1);if(pass1==1 )m_str="1";else m_str+="1";pass1=0;UpdateData(0);}“2”按钮对应的代码void CMyDlg::OnButton2(){UpdateData(1);if(pass1==1 )m_str="2";else m_str+="2";pass1=0;UpdateData(0);}“3”按钮对应的代码void CMyDlg::OnButton3(){UpdateData(1);if(pass1==1 )m_str="3";else m_str+="3";pass1=0;UpdateData(0);}“4”按钮对应的代码void CMyDlg::OnButton3(){UpdateData(1);if(pass1==1 )m_str="4";else m_str+="4";pass1=0;UpdateData(0);}“5、6、7、8、9、0”按钮对应的代码与“1、2、3、4”按钮对应的代码相近“=”按钮对应的代码void CMyDlg::Onresult(){UpdateData(1);int i,z,s,j,x=0,y=1,t,m=1;char b[10];double rate=10.0,itemp=0.0,a[20];for(i=0;i<20;i++)a[i]=1000000.0;for(i=0;i<10;i++)b[i]=' ';z=0;for(i=0;i<m_str.GetLength();i++) {if(isdigit(m_str.GetAt(i))){if(rate==10.0){ itemp=itemp*rate+(m_str.GetAt(i)-'0');if(i==m_str.GetLength()-1)a[z]=itemp;}else{itemp=itemp+rate*(m_str.GetAt(i)-'0');rate=rate/10;if(i==m_str.GetLength()-1)a[z]=itemp;}}else if(m_str.GetAt(i)=='.')rate=0.1;else if(m_str.GetAt(i)=='+') {a[z]=itemp;itemp=0;z++;b[z]='+';z++;rate=10.0;}else if(m_str.GetAt(i)=='-') {a[z]=itemp;itemp=0;z++;b[z]='-';z++;rate=10.0;}else if(m_str.GetAt(i)=='*')a[z]=itemp;itemp=0;z++;b[z]='*';z++;rate=10.0;}else if(m_str.GetAt(i)=='/'){a[z]=itemp;itemp=0;z++;b[z]='/';z++;rate=10.0;}}s=z;for(j=0;j<=s;j++){if(b[j]=='/'){a[j+1]=1/a[j+1];b[j]='*';}}for(j=0;j<=s;j++){if(b[j]=='*'){if(j-t==2){a[t-m]=a[t-m]*a[j+1];m=m+2;}elsea[j-1]=a[j-1]*a[j+1];a[j+1]=1000000.0;b[j]=' ';t=j;}}for(j=0;j<=s;j++){if(a[j]!=1000000.0) //如果a[i]的值不为0.0a[x]=a[j]; //把a[i]的值赋给a[x] x+=2; //x自加2}if(b[j]!=' ') //如果b[i]的值不为空格{b[y]=b[j]; //把b[i]的值赋给b[y]y=y+2; //y自加2}}for(j=0;j<=y-2;j++) {if(b[j]=='+') //如果b[i]等于加号a[0]=a[0]+a[j+1];else if(b[j]=='-') //如果b[i]等于减号a[0]=a[0]-a[j+1];}m_str.Format("%1f",a[0]);UpdateData(0);}“+”按钮对应的代码void CMyDlg::Onadd(){UpdateData(1);m_str+="+";UpdateData(0);}“-”按钮对应的代码void CMyDlg::Onjian(){UpdateData(1);m_str+="-";UpdateData(0);}“*”按钮对应的代码void CMyDlg::Oncheng(){UpdateData(1);m_str+="*";UpdateData(0);}“/”按钮对应的代码void CMyDlg::Onchu(){UpdateData(1);m_str+="/";UpdateData(0);}“AC”按钮对应的代码void CMyDlg::Onac(){UpdateData(1);m_str="0";pass1=1;UpdateData(0);}“DEL”按钮对应的代码void CMyDlg::Ondel(){UpdateData(1);if(m_str!="0" && m_str.GetLength()>1)m_str=m_str.Left(m_str.GetLength()-1);else{m_str="0";}UpdateData(0);}“.”按钮对应的代码void CMyDlg::Onpoint(){UpdateData(1);if(pass1==1)m_str=".";elsem_str+=".";pass1=0;UpdateData(0);}效果图。

手把手教你MFC编程计算器.docx

手把手教你MFC编程计算器.docx

STEP 1 (页面设计部分与控件添加部分)首先打开VC,选择MFC AppWizard[exe],设定好路径和工程名(这里我设置工程名为为“My')。

这里要注意的是在创建向导步骤1的时候,我们选择基本对话框”。

之后我们可以点击完成便看到以下界面此时我们把当前页面上原配的控件按 Delete 全部清除(如下图)口工悴(D Atit'U Sfi MLkd.工Sb 粗煙也 m®a )工冋(D 旨□世i 耳邑*Q0 H ■:・—!<<endl_*jMICUYOlg 巳 HN_CUCK£IJQ I K3置逛曲门圉m 中ui 血a' :Win3?PchugIp I ■+ 厚 MY cigs sesI V I I 14 P 4 II Fl I' ■ I I I)(| r :h 切丼斤胎耳i,吒它IT 丰習養看孔中咅滇專哗圖.>.沁 叱吟网/ \ *N|]粤|肄轉韓姑 I 曰 $ m 暮口r*ia;_ ?M \. I C sn v uGEKW (遞试l 在文律L 中暨復\在艾弊沖Ji 找二詁舉\佩曲吨皿/1 *JJ「]斑臥酚書0.0r 320x200接着我们按照 MFC 自带的控件选项进行我们本次计算器的控件添加(以下是控件)岂建辟①涌陽IT 弧扎⑴工程®狙連眠齐馬3二总© 稱勘⑩ _ SCMYI )I <] 【[悩| 日・理 mci!ilw 「T 「・CMVDI|t * FH ▼;□阖宙喰<<rndl・1 - 1 w0 tH n ©a II S(£] 13击注阖M&屯占ul 4 I , +| Win 議Dc^U. — 討 徐88爲:?旬曲[L4. ill JI ai ('a I ■■!■■ J B I L BI *ltadbdll ・li ・l ・・ii ・・ lltulijll列毎邂為湎口 口区宀枣圍陰C □日西我们在原先清空的界面中依次用上图控件画出一个基本的计算器页面(如下图)。

mfc编写计算器程序

mfc编写计算器程序

计算器的介绍(1)在运行程序后,系统会弹出一个基于对话框的计算器界面,如下图所示:图1.1 计算器界面(2)在计算器程序中,主要通过一个编辑框来获取表达式和显示计算结果,表达式可以通过键盘和单击按钮2种方式输入,输入后的结果如下图所示:图1.2 输入表达式后的界面(3)在输入完表达式后,单击“=”后,开始对表达式进行计算,计算完成后,在编辑框中显示计算的结果。

图1.3 计算后的结果(4)计算器可以实现十进制转化为十六进制或二进制,其实现的操作为先输入一个十进制整数,再单击按钮“转化为二进制”或“转化为十六进制。

图1.4 输入一个十进制数100图1.5 100转化为二进制后的结果图1.6 100转化为十六进制后的结果(4)另外,计算器还可以实现一些简单的函数运算,实现的操作和十六进制/二进制转化类似,是先输入一个数字,在单击想要进行的函数的按钮,单击后就会在编辑框中显示运算的结果。

1算法的实现2.1把字符串转化为数字和运算符的算法(1)如果字符串中只有数字。

这个情况用来实现一些简单函数的运算。

在进行简单函数的运算时,都是先输入一个数字,再单击要进行运算的按钮,然后编辑框显示运算的结果。

程序用了一个函数double GetaStr(CString str)来实现这个功能,该函数以编辑框变量m_strResult为实参,再得到m_strResult的值后,调用GetAt函数,一个字符一个字符的读取,如果碰到整数,执行“itemp=itemp*rate+(str.GetAt(i)-'0');”,其中变量itemp初始值为0,变量rate初始值为10,如果碰到了小数点,改变rate的值,使其等于0.1,再向后继续读取,再碰到整数时执行“itemp=itemp+rate*(str.GetAt(i)-'0');rate=rate/10;”,函数的最后确定返回值为itemp。

以下是这个函数的代码[2]:double CMyDlg::GetaStr(CString str){int i=0;double rate=10.0,itemp=0.0;for(;i<str.GetLength();i++){if(isdigit(str.GetAt(i))) //如果字符串str.GetAt(i)的内容是整数{if(rate==10.0) //整数部分itemp=itemp*rate+(str.GetAt(i)-'0');//获得整数else //小数部分{itemp=itemp+rate*(str.GetAt(i)-'0');//获得小数rate=rate/10; //每次让rate小10倍}}else if(str.GetAt(i)=='.') //如果str.GetAt(i)是小数点rate=0.1; //让rate=0.1,开始计算小数部分 }return (itemp);}(2)如果字符串中有运算符和数字,但是没有括号。

MFC实现简易计算器

MFC实现简易计算器

MFC实现简易计算器©Free Copy操作简便,还有帮助提示,支持double类型的数据进行运算,显示清除无效0. By: 杜运福计算器类结构如下:class CCalculatorDlg : public CDialog{// Constructionpublic:CCalculatorDlg(CWnd* pParent = NULL); // standard constructor// Dialog Data//{{AFX_DA TA(CCalculatorDlg)enum { IDD = IDD_CALCULA TOR_DIALOG };double m_Num;//}}AFX_DA TAdouble num1,num2; //第一、二操作数char cal; //运算符号BYTE dotflag; //小数点标志BYTE numflag; //键入数字标志long quan2; //小数部分权值// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CCalculatorDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL// Implementationprotected:HICON m_hIcon;// Generated message map functions//{{AFX_MSG(CCalculatorDlg)virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnNum0();afx_msg void OnNum1();afx_msg void OnNum2();afx_msg void OnNum3();afx_msg void OnNum4();afx_msg void OnNum5();afx_msg void OnNum6();afx_msg void OnNum7();afx_msg void OnNum8();afx_msg void OnNum9();afx_msg void OnAdd();afx_msg void OnSub();afx_msg void OnMul();afx_msg void OnDiv();afx_msg void OnEqual();afx_msg void OnSign();afx_msg void OnInv();afx_msg void OnMod();afx_msg void OnSqrt();afx_msg void OnDot();afx_msg void OnClear();afx_msg void OnBackspace();afx_msg void OnHelp();//}}AFX_MSGDECLARE_MESSAGE_MAP()};完整实现代码如下:// CalculatorDlg.cpp : implementation file///****************************************************************************** *********** 简易计算器***** by 追梦2011-4-18******************************************************************************* *****/#include "stdafx.h"#include "Calculator.h"#include "CalculatorDlg.h"#include "math.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialog{public:CAboutDlg();// Dialog Data//{{AFX_DA TA(CAboutDlg)enum { IDD = IDD_ABOUTBOX };//}}AFX_DA TA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support//}}AFX_VIRTUAL// Implementationprotected://{{AFX_MSG(CAboutDlg)//}}AFX_MSGDECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){//{{AFX_DA TA_INIT(CAboutDlg)//}}AFX_DA TA_INIT}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DA TA_MAP(CAboutDlg)//}}AFX_DA TA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)//{{AFX_MSG_MAP(CAboutDlg)// No message handlers//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CCalculatorDlg dialogCCalculatorDlg::CCalculatorDlg(CWnd* pParent /*=NULL*/): CDialog(CCalculatorDlg::IDD, pParent){//{{AFX_DA TA_INIT(CCalculatorDlg)m_Num = 0.0;//}}AFX_DA TA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CCalculatorDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DA TA_MAP(CCalculatorDlg)DDX_Text(pDX, IDC_Num, m_Num);//}}AFX_DA TA_MAP}BEGIN_MESSAGE_MAP(CCalculatorDlg, CDialog) //{{AFX_MSG_MAP(CCalculatorDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_Num0, OnNum0)ON_BN_CLICKED(IDC_Num1, OnNum1)ON_BN_CLICKED(IDC_Num2, OnNum2)ON_BN_CLICKED(IDC_Num3, OnNum3)ON_BN_CLICKED(IDC_Num4, OnNum4)ON_BN_CLICKED(IDC_Num5, OnNum5)ON_BN_CLICKED(IDC_Num6, OnNum6)ON_BN_CLICKED(IDC_Num7, OnNum7)ON_BN_CLICKED(IDC_Num8, OnNum8)ON_BN_CLICKED(IDC_Num9, OnNum9)ON_BN_CLICKED(IDC_Add, OnAdd)ON_BN_CLICKED(IDC_Sub, OnSub)ON_BN_CLICKED(IDC_Mul, OnMul)ON_BN_CLICKED(IDC_Div, OnDiv)ON_BN_CLICKED(IDC_Equal, OnEqual)ON_BN_CLICKED(IDC_Sign, OnSign)ON_BN_CLICKED(IDC_Inv, OnInv)ON_BN_CLICKED(IDC_Mod, OnMod)ON_BN_CLICKED(IDC_Sqrt, OnSqrt)ON_BN_CLICKED(IDC_Dot, OnDot)ON_BN_CLICKED(IDC_Clear, OnClear)ON_BN_CLICKED(IDC_Backspace, OnBackspace) ON_BN_CLICKED(IDC_Help, OnHelp)//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CCalculatorDlg message handlers//////////////////////////////////////////////////////////////////////////// BOOL CCalculatorDlg::OnInitDialog(){CDialog::OnInitDialog();// Add "About..." menu item to system menu.// IDM_ABOUTBOX must be in the system command range.ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARA TOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// Set the icon for this dialog. The framework does this automatically// when the application's main window is not a dialogSetIcon(m_hIcon, TRUE); // Set big iconSetIcon(m_hIcon, FALSE); // Set small icon// TODO: Add extra initialization herequan2 = 1;dotflag = 0;numflag = 0;return TRUE; // return TRUE unless you set the focus to a control}void CCalculatorDlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);}}// If you add a minimize button to your dialog, you will need the code below// to draw the icon. For MFC applications using the document/view model,// this is automatically done for you by the framework.void CCalculatorDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);// Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// Draw the icondc.DrawIcon(x, y, m_hIcon);}else{CDialog::OnPaint();}}// The system calls this to obtain the cursor to display while the user drags// the minimized window.HCURSOR CCalculatorDlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}//键入0void CCalculatorDlg::OnNum0(){UpdateData();if(dotflag){quan2 *= 10;m_Num += 0 / (double)quan2;}else{if(numflag){m_Num = m_Num * 10 + 0;}else m_Num = 0;}numflag = 1;UpdateData(FALSE);}//键入 1void CCalculatorDlg::OnNum1(){UpdateData();if(dotflag){quan2 *= 10;m_Num += 1 / (double)quan2;}else{if(numflag){m_Num = m_Num * 10 + 1;}else m_Num = 1;}numflag = 1;UpdateData(FALSE);}//键入 2void CCalculatorDlg::OnNum2(){UpdateData();if(dotflag){quan2 *= 10;m_Num += 2 / (double)quan2;}else{if(numflag){m_Num = m_Num * 10 + 2;}else m_Num = 2;}numflag = 1;UpdateData(FALSE);}//键入 3void CCalculatorDlg::OnNum3(){UpdateData();if(dotflag){quan2 *= 10;m_Num += 3 / (double)quan2;}else{if(numflag){m_Num = m_Num * 10 + 3;}else m_Num = 3;}numflag = 1;UpdateData(FALSE);}//键入 4void CCalculatorDlg::OnNum4(){UpdateData();if(dotflag){quan2 *= 10;m_Num += 4 / (double)quan2;}else{if(numflag){m_Num = m_Num * 10 + 4;}else m_Num = 4;}numflag = 1;UpdateData(FALSE);}//键入 5void CCalculatorDlg::OnNum5(){UpdateData();if(dotflag){quan2 *= 10;m_Num += 5 / (double)quan2;}else{if(numflag){m_Num = m_Num * 10 + 5;}else m_Num = 5;}numflag = 1;UpdateData(FALSE);}//键入 6void CCalculatorDlg::OnNum6(){UpdateData();if(dotflag){quan2 *= 10;m_Num += 6 / (double)quan2;}else{if(numflag){m_Num = m_Num * 10 + 6;}else m_Num = 6;}numflag = 1;UpdateData(FALSE);}//键入7void CCalculatorDlg::OnNum7(){UpdateData();if(dotflag){quan2 *= 10;m_Num += 7 / (double)quan2;}else{if(numflag){m_Num = m_Num * 10 + 7;}else m_Num = 7;}numflag = 1;UpdateData(FALSE);}//键入8void CCalculatorDlg::OnNum8(){UpdateData();if(dotflag){quan2 *= 10;m_Num += 8 / (double)quan2;}else{if(numflag){m_Num = m_Num * 10 + 8;}else m_Num = 8;}numflag = 1;UpdateData(FALSE);}//键入9void CCalculatorDlg::OnNum9(){UpdateData();if(dotflag){quan2 *= 10;m_Num += 9 / (double)quan2;}else{if(numflag){m_Num = m_Num * 10 + 9;}else m_Num = 9;}numflag = 1;UpdateData(FALSE);}//键入+void CCalculatorDlg::OnAdd(){UpdateData();num1 = m_Num;cal = '+';numflag = 0;dotflag = 0;quan2 = 1;}//键入-void CCalculatorDlg::OnSub(){UpdateData();num1 = m_Num;cal = '-';numflag = 0;dotflag = 0;quan2 = 1;}//键入*void CCalculatorDlg::OnMul(){UpdateData();num1 = m_Num;cal = '*';numflag = 0;dotflag = 0;quan2 = 1;}//键入/void CCalculatorDlg::OnDiv(){UpdateData();num1 = m_Num;cal = '/';numflag = 0;dotflag = 0;quan2 = 1;}//键入%void CCalculatorDlg::OnMod(){UpdateData();num1 = m_Num;cal = '%';numflag = 0;dotflag = 0;quan2 = 1;}//键入=void CCalculatorDlg::OnEqual(){UpdateData();num2 = m_Num;switch(cal){case '+': m_Num = num1 + num2; break;case '-': m_Num = num1 - num2; break;case '*': m_Num = num1 * num2; break;case '/': m_Num = num1 / num2; break;case '%': m_Num = (int)num1 % (int)num2; break;}numflag = 0;dotflag = 0;quan2 = 1;UpdateData(FALSE);}//键入+/-void CCalculatorDlg::OnSign(){UpdateData();m_Num = 0 - m_Num;UpdateData(FALSE);}//键入1/xvoid CCalculatorDlg::OnInv(){UpdateData();m_Num = 1 / m_Num;numflag = 0;dotflag = 0;quan2 = 1;UpdateData(FALSE);}//键入sqrtvoid CCalculatorDlg::OnSqrt(){UpdateData();m_Num = sqrt(m_Num);numflag = 0;dotflag = 0;quan2 = 1;UpdateData(FALSE);}//键入'.' 小数点void CCalculatorDlg::OnDot(){UpdateData();dotflag = 1;m_Num += 0.0;UpdateData(FALSE);}void CCalculatorDlg::OnClear(){UpdateData();m_Num = 0;num1 = 0;num2 = 0;numflag = 0;dotflag = 0;quan2 = 1;UpdateData(FALSE);}//撤销之前键入的数,可以依次撤销所有整数位或小数位void CCalculatorDlg::OnBackspace(){UpdateData();static int dotquan = quan2; //一次初始化long temp;if(dotflag && numflag) //撤销小数部分{if(dotquan >= 10){temp = (long)(m_Num * dotquan);m_Num= (double)(temp/10);dotquan /= 10;m_Num= m_Num / dotquan;}}else //撤销整数部分{if(numflag && m_Num){ m_Num = (long)m_Num /10;}}UpdateData(FALSE);}//帮助提示void CCalculatorDlg::OnHelp(){const char tipname[]="简易计算器帮助by 追梦";MessageBox("\t简易计算器\tby追梦\n\n 只用一个文本编辑框,用于输入和输出,接受粘贴或键盘输入。

C语言MFC基础之计算器详解

C语言MFC基础之计算器详解

C语⾔MFC基础之计算器详解⽬录基于MFC计算器(基础点)需求:把计算器运算的过程呈现出来。

基础点总结基于MFC计算器(基础点)主要是在实现MFC计算器的过程中碰到的⼀些问题,和补充的⼀些知识。

需求:把计算器运算的过程呈现出来。

想法:利⽤两个队列,⼀个存储输⼊的字符串(表达式),⼀个存放结果。

分别命名为queue1,和myqueue,让字符串从左到右依次⼊队列。

但之后按照⾃⼰的思路去推演,发现如果进⼊队列的是1+23,如果下⼀个字符⼊队的是“+”,那么先计算23的结果⼊队myqueue中,⽽queue1中还储存1,但下⼀个“+”⼊ queue1之后,此时queue1中包含1+,最后把myqueue中的元素和queue1结合,最终在编辑框⽂本中显⽰的是:1+6;如果下⼀个运算符是“*”,那么直接输出队列中的字符串。

在实现的过程中会涉及到类型转换,⽐如CString转换成浮点型。

⽬前还没有实现,主要原因在于对基础的语法不熟悉,还不太会使⽤先总结前⼀段时间碰到的⼀些问题,和解决⽅案。

基础点stack,queue,⽽map函数映射库是char到int的映射,实现了优先级的定义。

C++中的compare():涌来进⾏字符串以及⼦串之间的⽐较。

getline():读整⾏,包括前导和嵌⼊的空格并将其储存在字符串对象中。

length=strlen():遍历字符串strlen():可以做⼀个计数器,从内存的某个位置扫描,直到碰到第⼀个字符串结束符‘\0'为⽌,返回计算器值bool类型做判断:true,falsef分别是:对错,是⾮,正反atof():把字符转化为浮点数ofstream():写操作ofstream fout:是对C++SIT中对⽂件操作的合集,包含了常⽤的所有⽂件操作:插⼊器,析取器fout.open(“txt”,ios::out):打开⽂件流ifstream():读操作,从硬盘到内存fstream():同时进⾏读写ios:in,⽂件以输⼊的⽅式打开。

MFC入门教程之简易计算器制作

MFC入门教程之简易计算器制作

MFC入门之简易计算器制作最近自学MFC,入门的时候走了不少弯路,所以特做此教程,希望能帮助一些人能够快速入门,少走一些弯路。

这个教程就是通过一个简易计算器的制作让大家了解MFC界面编程的基本步骤和几个常用控件的使用方法。

使用软件Visual C++ 6.0.首先,新建一个MFC基于对话框的工程。

点击文件-新建,在工程选项卡里选择MFC AppWizard[exe],给工程命名Jisuan。

点击确定。

在接下来的向导里选择基于对话框,其他选项使用默认即可,之间点击完成。

先给大家介绍一下Visual C++ 6.0的界面。

左边框起来的是文件资源控制区,默认有三个选项卡,分别是ClassView、ResourceView和FileView。

分别用来显示类、资源和文件。

中间这个主要操作区呢,就是我们用来设计界面和编程的窗口了。

现在这个是IDD_JISUAN_DIALOG资源,如图所示。

右边那个是控件工具箱,如果没有显示的话可以右击菜单栏空白区域,把控件前打上对号即可。

然后给大家介绍一下今天需要用到的控件。

如左图所示,今天主要需要用到四个控件。

第一个是静态文本控件,就是可以往对话框上放一些静态的文字。

第二个是编辑框,它是可以往里面输入文字的。

第三个是组合框,它是把用来给对话框分区,使界面更加美观明了。

第四个是按钮控件,是用来点一下产生某个操作的。

上面那个是编辑框,下面这个是按钮控件。

点一下控件,拖到对话框上,即可使用。

下面我们可以这样布局:上面两个编辑框里输入数字,中间四个按钮分别是+ - * /,然后下面编辑框里显示数字。

下面开始给大家介绍第一个最重要的操作,就是属性操作。

我们想让这些控件的显示文字改变,就需要修改它的属性。

选定某个控件,右击,选择属性,即可来改变它们的属性了。

我们挨个控件介绍。

首先是组合框。

组合框的属性,我们看到有一个ID,一个标题。

首先说明一点,每个控件都必须有一个ID值,而且一般每个控件的ID值不能相同。

VC6.0制作简易计算器MFC[整理]

VC6.0制作简易计算器MFC[整理]

1、单击File(文件)菜单,选中New(新建),创建新工程。

2、选择工程栏中MFC AppWizard[exe]应用程序,并命名工程名称为calculator.(如图)3、选择MFC应用程序为“基于对话框”类型,其他选项默认。

单击完成(如图)4、修改界面。

经过前3步骤,VC6.0生成的工作界面如图所示。

先将对话框中的“TODO:在这里设置对话控制”静态文字控件和“确定”按钮控件删除,再使用工具箱将界面拖动控件修改为如图所示的界面。

该图所示是使用工具箱的控件拖放制作的计算器初始界面。

由于这些控件都有默认的名字,所以我们要对控件进行改名,右击Button1按钮,选中Properties(属性)选项以修改控件的属性,如图所示。

在弹出的对话框中,将Button1按钮的Caption(标题)属性修改为“+”,此时初始界面同时变成相应的“+”如下图所示。

修改后的界面如图所示,控件的Caption属性就是控件显示出来的值。

按照前文所讲述的方式,将界面上的按钮控件和静态文本控件的Caption属性都做相应的修改,修改后的界面如图所示。

5、为Edit(编辑)控件添加类的成员变量。

首先,右击Edit控件,选择ClassWizard(建立类向导)选项,如下图所示。

在弹出的对话框中,选择上方MemberVariables选项卡,选中DIC_EDIT1,然后单击单击右侧的Add Variable按钮,如图所示。

单击Add Variable按钮后会跳出,如图所示的对话框,该对话框是设置成员变量的命名和数据类型,在此可以命名为m_data1.注意:控件的ID只是标记一个控件,程序中不能直接控制ID,只能通过修改变量来改变控件的状态。

00相应的,再将另外两个Edit控件命名,本项目就将这3个Edit控件命名为:●IDC_EDIT1:m_data1,类型为double.●IDC_EDIT2:m_data2,类型为double.●IDC_EDIT3:m_result,类型为double.6、添加按钮控件的消息处理函数。

MFC下的科学计算器

MFC下的科学计算器

MFC下的科学计算器MFC (Microsoft Foundation Classes) 是Microsoft在windows上用于构建图形用户界面 (GUI) 的一套类库。

在MFC下开发一个科学计算器,可以实现基本的数学运算,包括加、减、乘、除,以及科学计数、平方、开方等功能。

首先,我们需要创建一个新的MFC应用程序项目。

在Visual Studio中选择“新建项目”,然后选择“MFC应用程序”。

在项目向导中,选择“单文档”视图,点击“完成”创建项目。

在代码视图中,我们可以使用Class Wizard来添加的响应函数。

打开Class Wizard,切换到“消息映射”选项卡,在列表中选择“控件”和“消息”,然后点击“添加函数”来添加事件处理函数。

除了基本的加减乘除功能,我们还可以添加其他的科学计算功能,例如平方、开方、三角函数等。

这些功能使用C++的数学库函数实现。

在完成功能的设计和实现后,我们可以进行调试和优化。

在调试期间,我们可以使用断点来跟踪代码的执行过程,检查变量的值和程序的状态。

如果遇到错误或异常情况,可以使用调试工具和日志功能来定位和解决问题。

同时,我们还可以根据用户的反馈和需求,对功能和界面进行优化和改进。

最后,我们可以将应用程序编译成可执行文件,方便用户安装和使用。

可以使用发布功能来生成安装程序,然后将可执行文件和相关文件打包,发布给用户。

总结一下,使用MFC开发一个科学计算器需要以下几个步骤:创建MFC应用程序项目、设计用户界面、实现计算功能、调试和优化、发布应用程序。

通过这个过程,我们可以了解和掌握MFC开发的基本流程和技巧,进一步提升编程能力和开发经验。

MFC的计算器制作解析

MFC的计算器制作解析
转存到定义的变量中false时把变量中的数据显示到界面上,当把空间名定义为value类型时,界面与变量之间的值交换
就用UpUpdateData().它跟新的数据是DoDataExchange()中所有DDX_Text()里的数据。
即结果是程序算好赋给它的而不是自己写上去的。因此把它的属性还要变成不可写
有两种方法。一、继续在properties中General项里修改,选择Disable.二、在代码里写
。在OnInitDialog()函数里(所有跟窗体有关的数据赋初值都在这个函数中,与窗体无关的
任然在构造函数中赋初值。)在最后写上 控件名.EnableWindow(FALSE);对于下拉菜单,选择
combo box控件,点击右键,选则最后一个properties,在Styles中Tpye里选择 drop list,此时
下拉菜单里的内容只能通过下拉列表选择,不可手动填写。若希望下拉菜单中内容显示顺序与
自己填的顺序相同,不需要排序,则sort 前的勾去掉。
5.给各控件起名字。点击右键,选则classwizard (类向导),在number variables项中修改。选中
控件ID号,点击右边的 ADD Variables,Gategory中选control,控件名字自己输入。
6.写实现计算器功能的代码。在主对话框窗体名上点击右键,选择ADD Number Function ,一般设成保护的。然后在里面填代码。
7.添加控件需要的消息处理。在主对话框窗体名上点击右键,选择ADD Windows Message Handle,为需要的控件增加处理。
用基本对话框做计算器的步骤:
1.新建一个MFC APPWizard(exe)的工程

基于MFC的科学计算器编程

基于MFC的科学计算器编程

三,特殊功能介绍
(1)屏蔽键盘信息,代码如下: CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDT_OUTPUT); pEdit->SetReadOnly(true); //将编辑框设置为只读模式(屏蔽键盘消息) 之后添加消息处理函数 BOOL CCalculator::PreTranslateMessage(MSG* pMsg)实现捕捉键盘信 息的功能(仅限于数字)。 (2)动态改变光标位置,将编辑框上显示的字符串定义为 m_string,以当前光标所在位置
}
}
else if(m_stringcal.GetAt(n)=='.')
{
rate=0.1f;
}
else
{
break;
}
}
float intempcal = sqrtf(itemp);
CString strtempr =
m_stringcal.Right(m_stringcal.GetLength()-n);
m = m + 1;
Cha[m] = '+';
m = m + 1;
rate = 10.0f;
mark = 0;
}
else
{
Cha[m] = '+'; m = m + 1; } } else if(m_stringcal.GetAt(i)=='-') { if(mark == 1) { Num[m] = itemp; itemp = 0; m = m + 1; Cha[m] = '-'; m = m + 1; rate = 10.0f; mark = 0; } else { Cha[m] = '-'; m = m + 1; } } else if(m_stringcal.GetAt(i)=='x') { if(mark == 1) { Num[m] = itemp; itemp = 0; m = m + 1; Cha[m] = 'x'; m = m + 1; rate = 10.0f; mark = 0; } else { Cha[m] = 'x'; m = m + 1; } } else if(m_stringcal.GetAt(i)=='/') { if(mark == 1) {

简易计算器MFC程序

简易计算器MFC程序

1、编写一个对话框应用程序,添加三按钮,三文本编辑框,实现加、减、乘、除简单运算,并实现编辑框的文本复制、粘贴、清空;程序代码:实验4View.cppvoid C实验4View::OnModelDialog(){CMyDlg dlg;dlg.DoModal();}void C实验4View::OnModellessDialog(){CMyDlg *pDlg=new CMyDlg;pDlg->Create(IDD_DIALOG1,this);pDlg->ShowWindow(SW_SHOW);}MyDlg.hpublic:CEdit m_edit1;CEdit m_edit2;CEdit m_edit3;CEdit m_edit4;CEdit m_edit5;afx_msg void OnBnClickedAdd();afx_msg void OnBnClickedSubtact();afx_msg void OnBnClickedMultiply();afx_msg void OnBnClickedDivide();afx_msg void OnBnClickedClearwrite();afx_msg void OnBnClickedClearsave();afx_msg void OnBnClickedCopy();afx_msg void OnBnClickedPaste();afx_msg void OnEnSetfocusEdit4();afx_msg void OnEnSetfocusEdit5();};MyDlg.cppint nEDITtemp;//全局变量BEGIN_MESSAGE_MAP(CMyDlg, CDialog)ON_BN_CLICKED(IDM_ADD, &CMyDlg::OnBnClickedAdd)ON_BN_CLICKED(IDM_SUBTACT, &CMyDlg::OnBnClickedSubtact)ON_BN_CLICKED(IDM_MULTIPLY, &CMyDlg::OnBnClickedMultiply)ON_BN_CLICKED(IDM_DIVIDE, &CMyDlg::OnBnClickedDivide)ON_BN_CLICKED(IDM_CLEARWRITE, &CMyDlg::OnBnClickedClearwrite) ON_BN_CLICKED(IDM_CLEARSAVE, &CMyDlg::OnBnClickedClearsave) ON_BN_CLICKED(IDM_COPY, &CMyDlg::OnBnClickedCopy)ON_BN_CLICKED(IIDM_PASTE, &CMyDlg::OnBnClickedPaste)ON_EN_SETFOCUS(IDC_EDIT4, &CMyDlg::OnEnSetfocusEdit4)ON_EN_SETFOCUS(IDC_EDIT5, &CMyDlg::OnEnSetfocusEdit5)END_MESSAGE_MAP()// CMyDlg 消息处理程序void CMyDlg::OnBnClickedAdd()//加法{// TODO: 在此添加控件通知处理程序代码double num1, num2, num3;int i=0;CString ch1, ch2, ch3;m_edit1.GetWindowText(ch1);m_edit2.GetWindowText(ch2);num1 =_tstof(ch1);num2 =_tstof(ch2);num3 = num1 + num2;ch3.Format(_T("%g"), num3);m_edit3.SetWindowText(ch3);}void CMyDlg::OnBnClickedSubtact()//减法{// TODO: 在此添加控件通知处理程序代码double num1, num2, num3;CString ch1, ch2, ch3;m_edit1.GetWindowText(ch1);m_edit2.GetWindowText(ch2);num1 = _tstof(ch1);num2 = _tstof(ch2);num3 = num1 - num2;ch3.Format(_T("%g"), num3);m_edit3.SetWindowText(ch3);}void CMyDlg::OnBnClickedMultiply()//乘法// TODO: 在此添加控件通知处理程序代码double num1, num2, num3;CString ch1, ch2, ch3;m_edit1.GetWindowText(ch1);m_edit2.GetWindowText(ch2);num1 = _tstof(ch1);num2 = _tstof(ch2);num3 = num1 * num2;ch3.Format(_T("%g"), num3);m_edit3.SetWindowText(ch3);}void CMyDlg::OnBnClickedDivide()//除法{// TODO: 在此添加控件通知处理程序代码double num1, num2, num3;CString ch1, ch2, ch3;m_edit1.GetWindowText(ch1);m_edit2.GetWindowText(ch2);num1 = _tstof(ch1);num2 = _tstof(ch2);num3 = num1 / num2;ch3.Format(_T("%g"), num3);m_edit3.SetWindowText(ch3);}void CMyDlg::OnBnClickedClearwrite()//初始化编辑框数据{// TODO: 在此添加控件通知处理程序代码m_edit1.SetSel(0,-1);m_edit1.Clear();m_edit2.SetSel(0,-1);m_edit2.Clear();m_edit3.SetSel(0,-1);m_edit3.Clear();}void CMyDlg::OnBnClickedClearsave()//初始化保存框数据{// TODO: 在此添加控件通知处理程序代码m_edit4.SetSel(0,-1);m_edit4.Clear();m_edit5.SetSel(0,-1);m_edit5.Clear();}void CMyDlg::OnBnClickedCopy()//复制// TODO: 在此添加控件通知处理程序代码m_edit3.SetSel(0,-1);m_edit3.Copy();}void CMyDlg::OnBnClickedPaste()//粘贴{// TODO: 在此添加控件通知处理程序代码if (nEDITtemp==1)m_edit4.Paste();else if(nEDITtemp==2)m_edit5.Paste();}void CMyDlg::OnEnSetfocusEdit4()//判断光标是否在SAVEREASULT1指示框中{// TODO: 在此添加控件通知处理程序代码nEDITtemp=1;}void CMyDlg::OnEnSetfocusEdit5()//判断光标是否在SAVEREASULT2指示框中{// TODO: 在此添加控件通知处理程序代码nEDITtemp=2;}运行结果:。

使用VC6编写一个计算器MFC

使用VC6编写一个计算器MFC

使用VC6.0编写一个简易的计算器效果图第一步:启动Visual C++6.0第二步:新建一个工程第三步:选择MFC AppWizard[exe],给工程命名,点击确定。

第四步:点选“基本对话框”,然后点击“完成”。

切记:不要点“下一步”第五步:点击“确定”,就完成工程建立了!第六步:看到这个页面后,就进入了面板的设计。

通过旁边的“控件”在面板中放置相应的按钮,编辑框,文本框等内容。

(这里讲的简易计算器需要按钮,编辑框这两个控件。

一般如果有需要的话还可以加入文本框用于说明。

)第七步:对每个对象建立类向导,但编写计算器只限于编辑框。

点击进入类向导后,点击横向按钮中的第二个按钮,在“Control IDs”中找到编辑框对应的名字,没有前期改动过的,一般都是IDC_EDIT1,点击“IDC_EDIT1”出现的对话框中,Variable type中选择CString,命名。

点击“OK”。

最后编写代码了:将面板上面的所有按钮和编辑框全部双击一遍,就会在“计算器Dlg.CPP”文件中生成控制其功能的空函数。

你需要在这些空函数中写入相应的代码以实现按钮的功能。

(请着重看红色加粗部分的代码,那才是真正的精髓)以下是“计算器Dlg.CPP”文件全部程序代码// 计算器Dlg.cpp : implementation file//#include "stdafx.h"#include "计算器.h"#include "计算器Dlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endifclass CAboutDlg : public CDialog{public:CAboutDlg();// Dialog Data//{{AFX_DATA(CAboutDlg)enum { IDD = IDD_ABOUTBOX };//}}AFX_DATA//{{AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUALprotected:DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)END_MESSAGE_MAP()CMyDlg::CMyDlg(CWnd* pParent): CDialog(CMyDlg::IDD, pParent){//{{AFX_DATA_INIT(CMyDlg)num = _T("");//}}AFX_DATA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CMyDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CMyDlg)DDX_Text(pDX, IDC_EDIT1, num);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CMyDlg, CDialog)//{{AFX_MSG_MAP(CMyDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON1, OnButton1)ON_BN_CLICKED(IDC_BUTTON2, OnButton2)ON_BN_CLICKED(IDC_BUTTON3, OnButton3)ON_BN_CLICKED(IDC_BUTTON4, OnButton4)ON_BN_CLICKED(IDC_BUTTON5, OnButton5)ON_BN_CLICKED(IDC_BUTTON6, OnButton6)ON_BN_CLICKED(IDC_BUTTON7, OnButton7)ON_BN_CLICKED(IDC_BUTTON8, OnButton8)ON_BN_CLICKED(IDC_BUTTON9, OnButton9)ON_BN_CLICKED(IDC_BUTTON10, OnButton10)ON_BN_CLICKED(IDC_BUTTON11, OnButton11)ON_BN_CLICKED(IDC_BUTTON12, OnButton12)ON_BN_CLICKED(IDC_BUTTON13, OnButton13)ON_BN_CLICKED(IDC_BUTTON14, OnButton14)ON_BN_CLICKED(IDC_BUTTON15, OnButton15)ON_BN_CLICKED(IDC_BUTTON16, OnButton16)ON_BN_CLICKED(IDC_BUTTON17, OnButton17)ON_BN_CLICKED(IDC_BUTTON18, OnButton18)ON_BN_CLICKED(IDC_BUTTON20, OnButton20)ON_BN_CLICKED(IDC_BUTTON19, OnButton19)ON_EN_CHANGE(IDC_EDIT1, OnChangeEdit1)//}}AFX_MSG_MAPEND_MESSAGE_MAP()BOOL CMyDlg::OnInitDialog(){CDialog::OnInitDialog();ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}SetIcon(m_hIcon, TRUE);SetIcon(m_hIcon, FALSE);return TRUE;}void CMyDlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);}}void CMyDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this);SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;dc.DrawIcon(x, y, m_hIcon);}else{CDialog::OnPaint();}}HCURSOR CMyDlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}void CMyDlg::OnChangeEdit1() {}double num1,num2;char sys;void CMyDlg::OnButton1() {UpdateData(true);num+='1';UpdateData(false);}void CMyDlg::OnButton2() {UpdateData(true);num+='2';UpdateData(false);}void CMyDlg::OnButton3() {UpdateData(true);num+='3';UpdateData(false);}void CMyDlg::OnButton4() {UpdateData(true);num+='4';UpdateData(false);}void CMyDlg::OnButton5() {UpdateData(true);num+='5';UpdateData(false);}void CMyDlg::OnButton6() {UpdateData(true);num+='6';UpdateData(false);}void CMyDlg::OnButton7() {UpdateData(true);num+='7';UpdateData(false);}void CMyDlg::OnButton8() {UpdateData(true);num+='8';UpdateData(false);}void CMyDlg::OnButton9() {UpdateData(true);num+='9';UpdateData(false);}void CMyDlg::OnButton10() {UpdateData(true);num+='0';UpdateData(false);}void CMyDlg::OnButton11() {if(-1==num.Find('.')){UpdateData(true);num+='.';}UpdateData(false);}void CMyDlg::OnButton12() {UpdateData(true);num2=-num2;char rs[20];sprintf(rs,"%g",num2);num=rs;UpdateData(false);}void CMyDlg::OnButton13() {UpdateData(true);num1=atof(num);num='\0';sys='+';UpdateData(false);}void CMyDlg::OnButton14() {UpdateData(true);num1=atof(num);num='\0';sys='-';UpdateData(false);}void CMyDlg::OnButton15() {UpdateData(true);num1=atof(num);num='\0';sys='*';UpdateData(false);}void CMyDlg::OnButton16() {UpdateData(true);num1=atof(num);num='\0';sys='/';UpdateData(false);}void CMyDlg::OnButton17() {if(!num.IsEmpty()){UpdateData(true);num=num.Left(num.GetLength()-1);}UpdateData(false);}void CMyDlg::OnButton18() {UpdateData(true);num='\0';UpdateData(false);}void CMyDlg::OnButton20() {UpdateData(true);num1=atof(num);num='\0';sys='^';UpdateData(false);}void CMyDlg::OnButton19(){UpdateData(true);char rs[50];memset(rs,0,50);switch(sys){case'+':num2=num1+atof(num);sprintf(rs,"%g",num2);num=rs;break;case'-':num2=num1-atof(num);sprintf(rs,"%g",num2);num=rs;break;case'*':num2=num1*atof(num);sprintf(rs,"%g",num2);num=rs;break;case'/':num2=num1/atof(num);sprintf(rs,"%g",num2);num=rs;break;case'^':num2=1;for(inti=0;i<atof(num);i++)num2=num1*num2;sprintf(rs,"%g",num2);num=rs;break;}; UpdateData(false);}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

STEP 1(页面设计部分与控件添加部分)首先打开VC,选择MFC AppWizard[exe],设定好路径和工程名(这里我设置工程名为为“My”)。

这里要注意的是在创建向导步骤1的时候,我们选择“基本对话框”。

之后我们可以点击完成便看到以下界面此时我们把当前页面上原配的控件按Delete全部清除(如下图)接着我们按照MFC自带的控件选项进行我们本次计算器的控件添加(以下是控件)我们在原先清空的界面中依次用上图控件画出一个基本的计算器页面(如下图)。

当然作为“所见即所得”的MFC控件设计,干净整齐的界面是基本要求,甚至会影响用户的心情。

上图我们用按钮控件添加一共15个按钮,分别是数字“ 0 ~ 9” 以及“+ - * /”。

每个控件“属性”都有属于它自己的ID,默认的按钮按键为IDC_BUTTON0,而且Cap当然我们为了“顾名思义”,对控件ID进行修改成我们容易辨认的(也可以不改),添加完控件并修改ID之后。

(如下图)这里我们把数字按钮0 设置ID为IDC_BUTTON14_NUM0,其他的依次类推完成修改ID后,就需给控件添加消息响应了,基本操作可以是直接双击控件,便会有向导提示。

MFC默认下了的响应信息都为On_开头,而且以下显示的是数字5的消息响应.之后所有的依次类推,这步骤一般不对成员函数名称做任何修改,直接点击OK即可之后就会跳转到具体的代码实现过程这里我们依次给每一个控件添加消息响应函数(以下仅列出一部分)到此为止我们基本上完成了计算器页面的前半部分预备工作,下来是我们的对控件具体实现代码的添加这里我把添加的控件消息响应函数列出来这里忘记了,提醒一点编辑框控件的ID是IDC_EDIT1IDC_EDIT2IDC_EDIT3还有加减乘除的控件添加当初没有进行名字的设置默认为void CMyDlg::OnButton1()//加void CMyDlg::OnButton2()//减void CMyDlg::OnButton3()//乘void CMyDlg::OnButton4()//除////////////////////////////////////////////////////在开始第二步之前有一项工作时必须要做的,那便是添加3个成员变量和一个CEdit类的变量具体添加方法,就是右键主对话框CMyDlg->Add Member Variable也可以是在菜单栏中选择“查看”->“建立类向导”这里我们把3个编辑框控件内的变量都改变为double型的(因为进行四则运算难免出现小数点)之后再在控件IDC_EDIT3中选择"Add Variable"并且数据类型选择 Control类型此时变量自动改为了 CEdit类这步的意思是说我们把编辑框控件3的设置为CEdit类并且设置一个成员对象是m_CResult。

////////////////////////////////////////////////////////////////////////// STEP 2(控件消息响应函数具体代码添加部分)首先从加法开始void CMyDlg::OnButton1(){// TODO: Add your control notification handler code here UpdateData();double n_result;n_result = m_num1 + m_num2;m_result = n_result;char sz[20];sprintf(sz,"%f",m_result);m_CResult.SetWindowText(sz);}UpdateData() 是MFC的窗口函数,用来刷新数据的由于我们进行基本运算需要更新数据所以必须添加这个函数。

(可以认为是必须的)n_result = m_num1 + m_num2;m_result = n_result;char sz[20];sprintf(sz,"%f",m_result);以上代码是进行加法的基本语句,然后数组保存并格式化打印输出。

m_CResult.SetWindowText(sz);此句是把结果输出在之前用CEdit类创建的对象m_CResult,m_CResult调用SetWindowText(sz);把结果显示在编辑框中。

无独有偶剩下的减法乘法和除法也是大同小异(只是把符号小改一下便可~~)这里贴出所有加减乘除的代码void CMyDlg::OnButton1(){// TODO: Add your control notification handler code hereUpdateData();double n_result;n_result = m_num1 + m_num2;m_result = n_result;char sz[20];sprintf(sz,"%f",m_result);m_CResult.SetWindowText(sz);}void CMyDlg::OnButton2(){// TODO: Add your control notification handler code hereUpdateData();double n_result;n_result = m_num1 - m_num2;m_result = n_result;char sz[20];sprintf(sz,"%f",m_result);m_CResult.SetWindowText(sz);}void CMyDlg::OnButton3(){// TODO: Add your control notification handler code here UpdateData();double n_result;n_result = m_num1 * m_num2;m_result = n_result;char sz[20];sprintf(sz,"%f",m_result);m_CResult.SetWindowText(sz);}void CMyDlg::OnButton4(){// TODO: Add your control notification handler code here UpdateData();double n_result;n_result = m_num1 / m_num2;m_result = n_result;char sz[20];sprintf(sz,"%f",m_result);m_CResult.SetWindowText(sz);}这里我特地说明一下由于我们预设了2个编辑框所想实现的功能是,如在编辑框1内输入一个输入30,然后再编辑框2内输入另一个数字20,并且再进行运算。

那么存在一个问题。

这个问题其实困惑了我很久,那就是,如何用判断用户是在哪个编辑框上输入了数字,所以我们需要给程序加入一个功能,那便是判断用户是在编辑框1输入,还是编辑框2内输入。

那么我们想,在日常我们用电脑的过程中,一般都是用鼠标去点击编辑框来进行一系列操作。

那么我可以加入一个鼠标左键点击WM_LBUTTONDOWN消息和一个EN_SETFOCUS事件来响应这个鼠标消息。

EN_SETFOCUS为判断焦点事件(通俗点说,那便是判断光标在什么地方)这样一来,一切逻辑都理顺了。

我们用户用鼠标选择并点击编辑框的时候,我们用WM_LBUTTONDOWN消息去响应,然后与此同此,我们把响应的和EN_SETFOCUS联系起来,我们预设一个全局变量nEditFlag ,作为在EN_SETFOCUS函数里的一个标记,并在鼠标点下的时候用nEditFlag 去表示编辑框目前被选定的状态,nEditFlag ==1 的时候我们就判断用户选择了编辑框1 ,再者当nEditFlag ==2的时候说明编辑框2被选定。

这里我告诉大家如何添加事件EN_SETFOCUS,由于EN_SETFOCUS是一个判断焦点的,所以对象应该是编辑框1和编辑框2里添加,所以我们回到对话框编辑页面。

“右键编辑框1”->点击“事件”-> “选择EN_SETFOCUS”(这里程序默认的响应函数是OnsetfocusEdit1)依次类推我们也给编辑框2添加事件响应函数OnsetfocusEdit2,方法同上如下图设置好之后,我们还要做一些初始化工作,在程序运行之初,我们先初始化nEditFlag = 0;那么在哪里初始化呢?很简单,正如大家想的一样在OnInitDialog()内进行初始化我们只需在OnInitDialog()函数中加入一句nEditFlag = 0;便可以了(如下图黑条字体部分)////////////////////////////////////////////////////////////////////////////////之后我们再为两个事件响应函数进行OnsetfocusEdit1()和OnsetfocusEdit2()添加代码当用户选定编辑框1的时候,nEditFlag = 1;当用户选定编辑框2的时候,nEditFlag = 2;而鼠标消息WM_LBUTTONDOWN具体代码如下//////////////////////////////////////////////////////////////////////////////STEP 3(按键0~9的响应部分)这里由于代码都大同小异,所以就用数字按钮1,2来进行简要说明用if语句去判断标记常量 nEditFlag 从而给判断是m_num1还是m_num2进行操作这里m_num1是编辑框1内的数字m_num2是编辑框2内的数字剩下了3~9代码以上大同小异。

这里进行一个说明m_num2=m_num2*10+1; 很多人会问这步是说明意思,这步乍看貌似有点一头雾水(当初我也是这样)但是仔细看看还是能看明白的。

比方说用户想打出自然数“234”用户第一次点的数字是2 那么此时对应代码执行是这段m_num2=m_num2*10+2; 那么m_num2 = 0*10 +2 (初始化时m_num2 = 0)之后如果在点击3的时候执行的代码是m_num2=m_num2*10+3; (此时经过第一步m_num2已经为2了,再点了3 结果为m_num2= 2*10+3 = 23)最后点击4 执行的代码是m_num2=m_num2*10+4;(23*10 +4=234)通过以上小例子大家明白了吧~ 为什么要“先乘以10 再加数字”////////////////////////////////////////////////////////////////////总结,其实这次非主流计算器编写,(说是非主流,说白了就是有2个编辑框输入数字,人家XP只有1个编辑框)。

相关文档
最新文档