利用MFC编写计算器
端午节这两天没什么事,就用MFC写了一个简单的计算器,界面做的也比较简单,如下图1,可以进行简单的加、减、乘和除功能,小数点显示这块做的不是很好,比如输入1.2,不会一个个的显示,而是先显示“1”,后同时显示“.2”,还有就是遇到0.00时,显示的也不够人性化,哎,就这样吧。。。

图1
1、建立工程:New -> Projects,选择Win32 MFC AppWizard(exe),并输入工程(counter)名字及设置好路径,点击OK,选择“Dialog based”,基于对话框,直接点finish。
2、将对话框进行简单的处理,把无关的按钮删掉,添加自己的按钮及Edit Box,如图2。

图2
3、对按钮及Edit Box进行属性设置,比如按钮1属性设置为“IDC_BUTTON_1”,2设置为IDC_BUTTON_2,一直类推。Edit Box不仅要设置ID(IDC_DISPLAY),还要设置相关连的成员变量,右键,选择ClasssWizard..,在点击Add Variable..,这里设置为double m_display。
4、对每个按钮添加消息处理函数,只需双击该按钮,按照提示点OK,就进入到了该函数入口处。
1设置void CCounterDlg::OnButton1();
2设置void CCounterDlg::OnButton2();
....
其他类推。
加 void CCounterDlg::OnButtonAdd();
减void CCounterDlg::OnButtonSub();
乘void CCounterDlg::OnButtonMult();
除void CCounterDlg::OnButtonDiv();
= void CCounterDlg::OnButtonEqual();
5、定义成员变量
int count; //计数
BOOL dot_flg; //小数点标志
BOOL continue_flg;//没按运算符,是否一直连续按数字按钮标志
BOOL str_flag;//有没按运算符标志
CString str;//记录当前按的运算符
double result; //num1和num2运算的结果
double num1; //按运算符之前的第一个数
double num2; //按运算符之后的第二个数
6、定义成员函数,该函数主要是对按下的数字进行叠加,跟踪num1和num2:
double CCounterDlg::buttonDownNum(int numSize);
7、当按下之后数字要及时显示出来,需要用到:
UpdateData(FALSE); //该函数是对Edit Box的内容进行更新,FALSE是有内部数成员的数据值更新到界面上,TRUE是从界面上更新到内部的数据成员上。
GetDlgItem(IDC_DISPLAY)->SetWindowText("小数点");//可以利用这个语句直接在Edit Box上显示内容“小数点”。只是提示自己也可以用这个来显示,程序中注释掉了。
8、代码实现:
//贴出自己添加的代码,其他代码默认有的
#include "math.h" // CCounterDlg dialog
CCounterDlg::CCounterDlg(CWnd* pParent /*=NULL*/)
: CDialog(CCounterDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CCounterDlg)
//初始化
m_display = 0.0;
num1 = ;
num2 = ;
result = 0.0;
str = "";
str_flag = FALSE;
continue_flg = FALSE;
downDot = FALSE;
count = ; //}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
} double CCounterDlg::buttonDownNum(int numSize)
{
if (!str_flag) //运算符没有被按下,那就是num1
{
if (!continue_flg) //按下一次
{
num1 = numSize;
continue_flg =TRUE;
}
else
{
num1 = num1*pow(,count) + numSize;
if (downDot)
{
num1 = num1/(pow(,count));
count++;
}
} return num1;
}
else //有运算符被按下
{
if (!continue_flg) //是否连续按下
{
num2 = numSize;
continue_flg =TRUE;
}
else
{
num2 = num2*pow(,count) + numSize;
if (downDot)
{
num2 = num2/(pow(,count));
count++;
}
} return num2;
}
} void CCounterDlg::OnButton0()
{
// TODO: Add your control notification handler code here m_display = buttonDownNum();
UpdateData(FALSE);
} void CCounterDlg::OnButton1()
{
// TODO: Add your control notification handler code here
m_display = buttonDownNum();
UpdateData(FALSE);
} void CCounterDlg::OnButton2()
{
// TODO: Add your control notification handler code here m_display = buttonDownNum(); UpdateData(FALSE);
} void CCounterDlg::OnButton3()
{
// TODO: Add your control notification handler code here
m_display = buttonDownNum();
UpdateData(FALSE);
} void CCounterDlg::OnButton4()
{
// TODO: Add your control notification handler code here
m_display = buttonDownNum();
UpdateData(FALSE);
} void CCounterDlg::OnButton5()
{
// TODO: Add your control notification handler code here
m_display = buttonDownNum();
UpdateData(FALSE);
} void CCounterDlg::OnButton6()
{
// TODO: Add your control notification handler code here
m_display = buttonDownNum();
UpdateData(FALSE);
} void CCounterDlg::OnButton7()
{
// TODO: Add your control notification handler code here
m_display = buttonDownNum();
UpdateData(FALSE);
} void CCounterDlg::OnButton8()
{
// TODO: Add your control notification handler code here
m_display = buttonDownNum();
UpdateData(FALSE);
} void CCounterDlg::OnButton9()
{
// TODO: Add your control notification handler code here
m_display = buttonDownNum();
UpdateData(FALSE);
} void CCounterDlg::OnButtonDot() //小数点
{
// TODO: Add your control notification handler code here
downDot = TRUE;
// GetDlgItem(IDC_DISPLAY)->SetWindowText("小数点"); //可以利用该函数在编辑框中显示信息
} void CCounterDlg::OnButtonAdd() //加
{
// TODO: Add your control notification handler code here
str = "+";
str_flag = TRUE;
continue_flg = FALSE;
downDot = FALSE;
count = ;
UpdateData(FALSE);
} void CCounterDlg::OnButtonSub() //减
{
// TODO: Add your control notification handler code here
str = "-";
str_flag = TRUE;
continue_flg = FALSE;
downDot = FALSE;
count = ;
UpdateData(FALSE);
} void CCounterDlg::OnButtonMult() //乘
{
// TODO: Add your control notification handler code here
str = "*";
str_flag = TRUE;
continue_flg = FALSE;
downDot = FALSE;
count = ;
UpdateData(FALSE);
} void CCounterDlg::OnButtonDiv() //除
{
// TODO: Add your control notification handler code here
str = "/";
str_flag = TRUE;
continue_flg = FALSE;
downDot = FALSE;
count = ;
UpdateData(FALSE);
} void CCounterDlg::OnButtonEqual()
{
// TODO: Add your control notification handler code here
if(str == "+")
result = num1 + num2;
else if(str == "-")
result = num1 - num2;
else if(str == "*")
result = num1 * num2;
else if(str == "/")
{
result = double(num1) / double(num2);
} num1 = result;
m_display = result;
str_flag = FALSE;
continue_flg = FALSE;
downDot = FALSE;
count = ;
UpdateData(FALSE);
} void CCounterDlg::OnButtonClear()
{
// TODO: Add your control notification handler code here num1 = ;
num2 = ;
m_display = ;
continue_flg = FALSE;
str_flag = FALSE;
downDot = FALSE;
count = ;
UpdateData(FALSE);
}
利用MFC编写计算器的更多相关文章
- 第六次作业——利用MFC实现计算器图形界面以及简单四则运算表达式批处理
参考资料: 1.MFC响应键盘 2.计算器实例 3.MFC文件对话框 4.MFCUpdateData()函数的使用 5.MFC教程 6.wi ...
- JavaScript编写计算器的发展史
JavaScript编写计算器的发展史: 编写一个普通的四则运算: <!DOCTYPE html> <html lang="en"> <head> ...
- VS2010/MFC编程入门之二(利用MFC向导生成单文档应用程序框架)
VS2010/MFC编程入门之二(利用MFC向导生成单文档应用程序框架)-软件开发-鸡啄米 http://www.jizhuomi.com/software/141.html 上一讲中讲了VS20 ...
- 纯javascript代码编写计算器程序
今天来分享一下用纯javascript代码编写的一个计算器程序,很多行业都能用到这个程序,例如做装修预算.贷款利率等等. 首先来看一下完成后的效果: 具体代码如下:(关注我的博客,及时获取最新WEB前 ...
- LoadRunner利用ODBC编写MySql脚本
最近做了几周的LoadRunner测试,有一些心得,记录下来,以便以后查找. LoadRunner测试数据库是模拟客户端去连接数据库服务器,因此,需要协议(或者说驱动的支持).LoadRunner本身 ...
- Python开发——利用正则表达式实现计算器算法
Python开发--利用正则表达式实现计算器算法 (1)不使用eval()等系统自带的计算方法 (2)实现四则混合运算.括号优先级解析 思路: 1.字符串预处理,将所有空格去除 2.判断是否存在括号运 ...
- 利用反射编写私有 Private 方法的单元测试
利用反射编写私有 Private 方法的单元测试 最近在添加一个新feature时,鉴于要给自己的代码一是增加代码的强壮性,二是增加代码测试的覆盖率.但是遇到了有些方法是 Private 的,但是在调 ...
- 利用java编写的盲注脚本
之前在网上见到一个盲注的题目,正好闲来无事,便用java写了个盲注脚本,并记录下过程中的坑 题目源码: <?php header("Content-Type: text/html;ch ...
- 品味性能之道<九>:利用Loadrunner编写socket性能测试脚本简述
一.概述 Loadrunner拥有极为丰富的工具箱,供予我们制造出各种奇妙魔法的能力.其中就有此次要讨论的socket套接字操作. 二.socket概述 ...
随机推荐
- 解决mac下atom安装插件失败问题
activate-power-mode的超炫编辑效果打动了我,花时间安装了atom,之后在package,install里面找到了这个插件,但是安装失败,如下图所示: gyp info it work ...
- shell之路【第一篇】shell简介与入门
shell简介 1.Shell 诞生于 Unix,Unix的第一个脚本语言,是与 Unix/Linux 交互的工具,单独地学习 Shell 是没有意义的,shell使用的熟练程度反映了用户对Unix/ ...
- device-mapper: multipath: Failing path recovery【转载】
digoal 2016-04-05 10:09:42 浏览180 评论0 摘要: 由于扇区损坏导致多路径设备failed. 现象如下 : # dmesg : device-mapper: mul ...
- MyEclipse运行到断点也跳过的问题
如果是B/S开发也就是javaWeb开发的话,Tomcat 的启动模式要设置成Debug模式 还有下面是没运行时断点的样子: 运行的时候,断点会变成对钩,表示执行到它所在代码的时候会停下来:
- 一篇很全面的freemarker教程 前端工程师必备
FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成: 1,文本:直接输出的部分 2,注释:<#-- ... -->格式部分,不会输 ...
- 前台改变asp button控件的值,后台取值没有改变的问题
前台: <asp:Button ID="btnEdit" Style="margin-left: 600px;" runat="server&q ...
- WPF Template模版之DataTemplate与ControlTemplate的关系和应用【二】
1. DataTemplate和ControlTemplate的关系 学习过DataTemplate和ControlTemplate,你应该已经体会到,控件只是数据的行为和载体,是个抽象的概念,至于它 ...
- libmysql.dll 找不到
在用C#开发的时候,需要连接MySQL ,系统提示 libmysql.dll 找不到模块. 我们可以找到 MySQL安装文件夹下的 C:\Program Files\MySQL\MySQL Ser ...
- 字段为空sql语句,设置当前模式
delete from t_corpinfo where CORPID='' and CORPNAME='' 该命令是删除字段为空的记录 SET CURRENT SCHEMA DB2INST1;
- [转]ubuntu的which、whereis、locate和find命令
which 只能寻找执行文件 ,并在PATH变量里面寻找. whereis 从linux文件数据库(/var/lib/slocate/slocate.db)寻找,所以有可能找到刚刚删除,或者没有发现 ...