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

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,也就是第一个数字已经录入,第二个数字还没有录入的状态这时
使用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简易计算器

上机指导书一、对话框编程1、建立一个基于对话框的应用程序Calculator;2、为CCalculatorDlg建立对话框资源,如下图所示3、为CCalculatorDlg添加成员变量:char m_buffer[100];//用来存贮需要显示的数字CString m_StrBegin;//记录初始操作数的字符串double m_end;//记录结果操作数double m_begin;//记录初始操作数int m_bit;//记录运算符int m_IsCheckPoint;//判断是否按下了小数点符号,当其为0时,表示没有按下4、为应用程序添加CEdit类的派生类CAdvEdit,并为该类添加三个成员函数:其中OnPaint()为虚函数。
这三个函数的函数体如下:void CAdvEdit::OnDisplay(LPCTSTR lpszStr){m_Caption=lpszStr; OnDraw();}void CAdvEdit::OnDraw(){CRect rect; GetClientRect(&rect);CDC *pDC=GetDC(); pDC-> SetBkMode(TRANSPARENT);CBrush *pBrush=new CBrush(RGB(255,255,255));pDC-> FillRect(&rect,pBrush); pDC-> SetTextColor(RGB(92,92,92));pDC-> DrawText(m_Caption,rect,DT_SINGLELINE|DT_VCENTER|DT_RIGHT);}void CAdvEdit::OnPaint(){CPaintDC dc(this); // device context for paintingOnDraw();}5、对话框资源中的编辑框添加控件类型的成员变量:CAdvEdit m_DspEdit;6、为应用程序CCalculatorDlg类添加成员函数Result()/,来处理运算符操作:void CCalculatorDlg::Result()//用来处理按下符号键时的函数,是计算的核心函数{m_IsCheckPoint = false;m_begin = atof(m_StrBegin);switch(m_bit){ case 1: m_end += m_begin; break; //处理+号case 2: m_end -= m_begin; break; //处理-号case 3: m_end *= m_begin; break; //处理*号,即乘法case 4: //处理/号,即除法if (m_begin==0) { m_DspEdit.OnDisplay("除数不能为零!"); return; }m_end /= m_begin; break;case 5: //处理sqrt号,即开方if (m_end<0) { m_DspEdit.OnDisplay("函数输入无效!"); return; }m_end = sqrt(m_end); break;case 6: //处理1/x号,即求倒数m_end = 1/m_end; break;default: m_end = m_begin; break;}m_begin = 0.0; m_bit = 0; m_StrBegin = "";int i = sprintf(m_buffer,"%10.12f",m_end);//将结果转换为字符串TrimZero(m_buffer,i); //去掉字符串尾部多余的零m_DspEdit.OnDisplay(m_buffer);}7、为对话框的运算符按钮添加消息处理函数:void CCalculatorDlg::AdvButtonPoint() //按下.键时的处理函数{ if (!m_IsCheckPoint && m_StrBegin != ""){ m_StrBegin = m_StrBegin+"."; m_DspEdit.OnDisplay(m_StrBegin);m_IsCheckPoint = true; } }void CCalculatorDlg::AdvButtonAdd(){ Result(); m_bit = 1; }void CCalculatorDlg::AdvButtonSub(){ Result(); m_bit = 2; }void CCalculatorDlg::AdvButtonMul(){ Result(); m_bit = 3; }void CCalculatorDlg::AdvButtonDiv(){ Result(); m_bit = 4; }void CCalculatorDlg::AdvButtonClear(){ m_IsCheckPoint = false; m_StrBegin = "";m_begin = 0.0; m_end = 0.0; m_bit = 0; m_DspEdit.OnDisplay("0."); }void CCalculatorDlg::AdvButtonSqrt(){ Result(); m_bit = 5; }void CCalculatorDlg::AdvButtonReverse(){ Result(); m_bit = 6; }void CCalculatorDlg::AdvButtonEqu() //按下=键时的处理函数{ Result(); m_bit = 7; }8、为对话框的数字按钮添加消息处理函数:void CCalculatorDlg::Button0()//按下0键时的处理函数{ m_StrBegin = m_StrBegin+"0";if (!m_IsCheckPoint) m_DspEdit.OnDisplay(m_StrBegin+"."); else m_DspEdit.OnDisplay(m_StrBegin); }void CCalculatorDlg::Button1(){ m_StrBegin = m_StrBegin+"1";if (!m_IsCheckPoint) m_DspEdit.OnDisplay(m_StrBegin+"."); else m_DspEdit.OnDisplay(m_StrBegin); }void CCalculatorDlg::Button2(){ m_StrBegin = m_StrBegin+"2";if (!m_IsCheckPoint) m_DspEdit.OnDisplay(m_StrBegin+"."); else m_DspEdit.OnDisplay(m_StrBegin); }void CCalculatorDlg::Button3(){ m_StrBegin = m_StrBegin+"3";if (!m_IsCheckPoint) m_DspEdit.OnDisplay(m_StrBegin+"."); else m_DspEdit.OnDisplay(m_StrBegin); }void CCalculatorDlg::Button4(){ m_StrBegin = m_StrBegin+"4";if (!m_IsCheckPoint) m_DspEdit.OnDisplay(m_StrBegin+"."); else m_DspEdit.OnDisplay(m_StrBegin); }void CCalculatorDlg::Button5(){ m_StrBegin = m_StrBegin+"5";if (!m_IsCheckPoint) m_DspEdit.OnDisplay(m_StrBegin+"."); else m_DspEdit.OnDisplay(m_StrBegin); }void CCalculatorDlg::Button6(){ m_StrBegin = m_StrBegin+"6";if (!m_IsCheckPoint) m_DspEdit.OnDisplay(m_StrBegin+"."); else m_DspEdit.OnDisplay(m_StrBegin); }void CCalculatorDlg::Button7(){ m_StrBegin = m_StrBegin+"7";if (!m_IsCheckPoint) m_DspEdit.OnDisplay(m_StrBegin+"."); else m_DspEdit.OnDisplay(m_StrBegin); }void CCalculatorDlg::vButton8(){ m_StrBegin = m_StrBegin+"8";if (!m_IsCheckPoint) m_DspEdit.OnDisplay(m_StrBegin+"."); else m_DspEdit.OnDisplay(m_StrBegin); }void CCalculatorDlg::vButton9(){ m_StrBegin = m_StrBegin+"9";if (!m_IsCheckPoint) m_DspEdit.OnDisplay(m_StrBegin+"."); else m_DspEdit.OnDisplay(m_StrBegin); }9、为应用程序CCalculatorDlg类添加成员函数TrimZerot()/,来去掉字符串尾部多余的零:void CCalculatorDlg::TrimZero(char *pStr,int iLen)//用于去掉字符串尾部多余的零。
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计算器

, m_cInNumber(0) { m_hIcon = AfxGetApp->LoadIcon(IDR_MAINFRAME); } void CCalcDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT, m_csEditText); } BEGIN_MESSAGE_MAP(CCalcDlg, CDialog) ON_WM_SYSCOMMAND ON_WM_PAINT ON_WM_QUERYDRAGICON //}}AFX_MSG_MAP ON_BN_CLICKED(IDC_BTNNUM0, &CCalcDlg::OnBnClickedBtnnum0) ON_BN_CLICKED(IDC_BTNNUM1, &CCalcDlg::OnBnClickedBtnnum1) ON_BN_CLICKED(IDC_BTNNUM2, &CCalcDlg::OnBnClickedBtnnum2) ON_BN_CLICKED(IDC_BTNNUM3, &CCalcDlg::OnBnClickedBtnnum3) ON_BN_CLICKED(IDC_BTNNUM4, &CCalcDlg::OnBnClickedBtnnum4) ON_BN_CLICKED(IDC_BTNNUM5, &CCalcDlg::OnBnClickedBtnnum5) ON_BN_CLICKED(IDC_BTNNUM6, &CCalcDlg::OnBnClickedBtnnum6) ON_BN_CLICKED(IDC_BTNNUM7, &CCalcDlg::OnBnClickedBtnnum7) ON_BN_CLICKED(IDC_BTNNUM8, &CCalcDlg::OnBnClickedBtnnum8)
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⼯程中。
下⾯是我封装的⼀个 Expression 类:Expression.h#pragma once#include <iostream>#include <sstream>#include <string>#include <vector>#include <stack>#include <utility>using namespace std;class Expression{public:Expression(string str);bool test(); // 外部接⼝,判断表达式是否合法double calculate(); // 外部接⼝,计算表达式的值private:vector<pair<string, int>> word;string expr; // 算术表达式int idx; // word下标int sym; // 单词种别编码int err; // 错误int word_analysis(vector<pair<string, int>>& , const string);void Next();void E();void T();void F();bool Right; // 保存表达式test结果private:int prior(int); // 获取运算符的优先级bool isOperator(int); // 通过种别编码判定是否是运算符vector<pair<string,int>> getPostfix(const vector<pair<string,int>>&); // 中缀转后缀void popTwoNumbers(stack<double>&, double&, double&); // 从栈中连续弹出两个操作数double stringToDouble(const string&); // 把string转换为doubledouble expCalculate(const vector<pair<string, int>>&); // 计算后缀表达式的值};Expression.cpp#include "Expression.h"// 构造函数Expression::Expression( string str ):expr(str),idx(0),err(0),Right(true){}// 外部接⼝bool Expression::test(){return Right;}int err_num = word_analysis(word, expr);if (-1 == err_num){Right = false;}else{// 词法正确,进⾏语法分析Next();E();if (sym == 0 && err == 0) // 注意要判断两个条件Right = true;elseRight = false;}return Right;}// 外部接⼝double Expression::calculate(){if (test()){return expCalculate(getPostfix(word));}else{exit(0);}}/*--------------------------------词法分析----------------------------*/int Expression::word_analysis(vector<pair<string, int>>& word, const string expr) {for(int i=0; i<expr.length(); ++i){// 如果是 + - x ÷ ( )if(expr[i] == '(' || expr[i] == ')' || expr[i] == '+'|| expr[i] == '-' || expr[i] == '*' || expr[i] == '/'){string tmp;tmp.push_back(expr[i]);switch (expr[i]){case '+':word.push_back(make_pair(tmp, 1));break;case '-':word.push_back(make_pair(tmp, 2));break;case '*':word.push_back(make_pair(tmp, 3));break;case '/':word.push_back(make_pair(tmp, 4));break;case '(':word.push_back(make_pair(tmp, 6));break;case ')':word.push_back(make_pair(tmp, 7));break;}}// 如果是数字开头else if(expr[i]>='0' && expr[i]<='9'){string tmp;while(expr[i]>='0' && expr[i]<='9'){tmp.push_back(expr[i]);++i;}if(expr[i] == '.'){++i;if(expr[i]>='0' && expr[i]<='9'){tmp.push_back('.');tmp.push_back(expr[i]);++i;}}else{return -1; // .后⾯不是数字,词法错误}}word.push_back(make_pair(tmp, 5));--i;}// 如果以.开头else{return -1; // 以.开头,词法错误}}return 0;}/*--------------------------------语法分析----------------------------*/ // 读下⼀单词的种别编码void Expression::Next(){if(idx < word.size())sym = word[idx++].second;elsesym = 0;}// E → T { +T | -T }void Expression::E(){T();while(sym == 1 || sym == 2){Next();T();}}// T → F { *F | /F }void Expression::T(){F();while(sym == 3 || sym == 4){Next();F();}}// F → (E) | dvoid Expression::F(){if (sym == 5){Next();}else if(sym == 6){Next();E();if (sym == 7){Next();}else{err = -1;}}else{err = -1;}}/*--------------------------------求值部分----------------------------*/ int Expression::prior(int sym){case 1:case 2:return 1;case 3:case 4:return 2;default:return 0;}}bool Expression::isOperator(int sym){switch (sym){case 1:case 2:case 3:case 4:return true;default:return false;}}vector<pair<string,int>> Expression::getPostfix( const vector<pair<string,int>>& expr){vector<pair<string, int>> output; // 输出stack<pair<string, int>> s; // 操作符栈for(int i=0; i<expr.size(); ++i){pair<string, int> p = expr[i];if(isOperator(p.second)){while(!s.empty() && isOperator(s.top().second) && prior(s.top().second)>=prior(p.second)) {output.push_back(s.top());s.pop();}s.push(p);}else if(p.second == 6){s.push(p);}else if(p.second == 7){while(s.top().second != 6){output.push_back(s.top());s.pop();}s.pop();}else{output.push_back(p);}}while (!s.empty()){output.push_back(s.top());s.pop();}return output;}void Expression::popTwoNumbers( stack<double>& s, double& first, double& second ){first = s.top();s.pop();second = s.top();s.pop();}double Expression::stringToDouble( const string& str ){double d;stringstream ss;ss << str;ss >> d;return d;double Expression::expCalculate( const vector<pair<string,int>>& postfix ){double first,second;stack<double> s;for(int i=0; i<postfix.size(); ++i){pair<string,int> p = postfix[i];switch (p.second){case 1:popTwoNumbers(s, first, second);s.push(second+first);break;case 2:popTwoNumbers(s, first, second);s.push(second-first);break;case 3:popTwoNumbers(s, first, second);s.push(second*first);break;case 4:popTwoNumbers(s, first, second);s.push(second/first);break;default:s.push(stringToDouble(p.first));break;}}double result = s.top();s.pop();return result;}使⽤⽅法(测试):int main(){Expression e("(1.5+2.5)*2+0.53");if(e.test()) // 判断表达式是否合法cout << e.calculate() << endl;return 0;}⼆、加⼊MFC⼯程OK,核⼼代码(表达式的合法性判断与求值)已经封装到 Expression 类中,下⾯要做的就是新建⼀个 MFC ⼯程,并把 Expression 类加⼊⼯程⾥,并实现按钮的功能就⾏了。
MFC编程简单计算器

第一步:设置界面,变量及函数首先打开VC,选择MFC AppWizard[exe],设定好路径和工程名(这里我设置工程名为为“My”)。
这里要注意的是在创建向导步骤1的时候,我们选择“基本对话框”。
之后我们可以点击完成便看到以下界面此时我们把当前页面上原配的控件按Delete全部清除(如下图)1、设置界面接着我们按照MFC自带的控件选项进行我们本次计算器的控件添加(以下是控件)我们在原先清空的界面中依次用上图控件画出一个基本的计算器页面(如下图)。
上图我们用按钮控件添加一共15个按钮,分别是数字“ 0 ~ 9”以及“+ - * /”。
每个控件“属性”都有属于它自己的ID,默认的按钮按键为IDC_BUTTON0,而且Cap当然我们为了“顾名思义”,对控件ID进行修改成我们容易辨认的(也可以不改),添加完控件并修改ID之后。
(如下图)这里我们把数字按钮0 设置ID为IDC_BUTTON14_NUM0,其他的依次类推2、添加变量添加3个成员变量和一个CEdit类的变量具体添加方法,就是右键主对话框CMyDlg->Add Member Variable 也可以是在菜单栏中选择“查看”->“建立类向导”这里我们把3个编辑框控件内的变量都改变为double型的(因为进行四则运算难免出现小数点)之后再在控件IDC_EDIT3中选择"Add Variable"并且数据类型选择 Control类型此时变量自动改为了 CEdit类这步的意思是说我们把编辑框控件3的设置为CEdit类并且设置一个成员对象是m_CResult。
3、添加消息相应函数完成修改ID后,就需给控件添加消息响应了,基本操作可以是直接双击控件,便会有向导提示。
MFC默认下了的响应信息都为On_开头,而且以下显示的是数字5的消息响应.之后所有的依次类推,这步骤一般不对成员函数名称做任何修改,直接点击OK即可到此为止我们基本上完成了计算器页面的前半部分预备工作,下来是我们的对控件具体实现代码的添加第2步:添加代码1、基本控件代码首先从加法开始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);}UpdateData() 是MFC的窗口函数,用来刷新数据的由于我们进行基本运算需要更新数据所以必须添加这个函数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
手把手教MFC做计算器(2010-10-27 16:20:15)转载分类:Cplusplus标签:杂谈上个月,国庆期间在研究MFC贪吃蛇的程序之余,很有兴致去想做一个“加法器”,顾名思义也就只能实现一个加法功能而已。
当初是做出来了,不过是只能用键盘输入数字的,这个和Windows自带的计算器有差别,再者,我当初做的加法器实现的方式很简单,就是用在对话框页面中添加2个编辑框控件和一个按钮控件“+”,然后关联ID,然后再CDialog中添加代码实现功能。
近日,在继续学习MFC的过程,看到这个半成品,就有完善它成为一个计算器的想法,当然就在此基础上。
这里声明,该计算器的制作方法和过程和百度上的有一些区别,并不是“很常规”的那种计算器写法,纵然是我自己练手的作品,但是一些基本的功能也是能实现的,现在就手把手教制作这个计算器。
////////////////////////////////////////////////////////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 V ariable也可以是在菜单栏中选择“查看”->“建立类向导”这里我们把3个编辑框控件内的变量都改变为double型的(因为进行四则运算难免出现小数点)之后再在控件IDC_EDIT3中选择"Add V ariable"并且数据类型选择Control类型此时变量自动改为了CEdit类这步的意思是说我们把编辑框控件3的设置为CEdit类并且设置一个成员对象是m_CResult。
//////////////////////////////////////////////////////////////////////////STEP 2(控件消息响应函数具体代码添加部分)首先从加法开始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);}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.SetWindowT ext(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.SetWindowT ext(sz);}void CMyDlg::OnButton3(){// 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.SetWindowT ext(sz);}void CMyDlg::OnButton4(){// 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.SetWindowT ext(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内的数字。