端午节这两天没什么事,就用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编写计算器的更多相关文章

  1. 第六次作业——利用MFC实现计算器图形界面以及简单四则运算表达式批处理

    参考资料:      1.MFC响应键盘      2.计算器实例      3.MFC文件对话框      4.MFCUpdateData()函数的使用      5.MFC教程      6.wi ...

  2. JavaScript编写计算器的发展史

    JavaScript编写计算器的发展史: 编写一个普通的四则运算: <!DOCTYPE html> <html lang="en"> <head> ...

  3. VS2010/MFC编程入门之二(利用MFC向导生成单文档应用程序框架)

    VS2010/MFC编程入门之二(利用MFC向导生成单文档应用程序框架)-软件开发-鸡啄米 http://www.jizhuomi.com/software/141.html   上一讲中讲了VS20 ...

  4. 纯javascript代码编写计算器程序

    今天来分享一下用纯javascript代码编写的一个计算器程序,很多行业都能用到这个程序,例如做装修预算.贷款利率等等. 首先来看一下完成后的效果: 具体代码如下:(关注我的博客,及时获取最新WEB前 ...

  5. LoadRunner利用ODBC编写MySql脚本

    最近做了几周的LoadRunner测试,有一些心得,记录下来,以便以后查找. LoadRunner测试数据库是模拟客户端去连接数据库服务器,因此,需要协议(或者说驱动的支持).LoadRunner本身 ...

  6. Python开发——利用正则表达式实现计算器算法

    Python开发--利用正则表达式实现计算器算法 (1)不使用eval()等系统自带的计算方法 (2)实现四则混合运算.括号优先级解析 思路: 1.字符串预处理,将所有空格去除 2.判断是否存在括号运 ...

  7. 利用反射编写私有 Private 方法的单元测试

    利用反射编写私有 Private 方法的单元测试 最近在添加一个新feature时,鉴于要给自己的代码一是增加代码的强壮性,二是增加代码测试的覆盖率.但是遇到了有些方法是 Private 的,但是在调 ...

  8. 利用java编写的盲注脚本

    之前在网上见到一个盲注的题目,正好闲来无事,便用java写了个盲注脚本,并记录下过程中的坑 题目源码: <?php header("Content-Type: text/html;ch ...

  9. 品味性能之道<九>:利用Loadrunner编写socket性能测试脚本简述

            一.概述         Loadrunner拥有极为丰富的工具箱,供予我们制造出各种奇妙魔法的能力.其中就有此次要讨论的socket套接字操作.     二.socket概述     ...

随机推荐

  1. hdu_4828_Grids(卡特兰数+逆元)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4828 题意:中文,不解释 题解:实际就是一个卡特兰递推: Catalan(n+1)= Catalan( ...

  2. Ubuntu14.04+cuda 7.5+cudnn_v4+tensorflow安装

    系统环境:Ubuntu14.04 64位.Windows7 64位 双系统 CUDA 版本: 7.5 总结一下,我的安装建议是: 一定要下一份CUDA官方的安装文档,按照它的步骤一步步慢慢来,不可偷懒 ...

  3. 【Python爬虫实战--1】深入理解urllib;urllib2;requests

    摘自:http://1oscar.github.io/blog/2015/07/05/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3urllib;urllib2;reques ...

  4. Chrome不支持showModalDialog模态对话框和无法返回returnValue的问题

    父窗体部分js代码: var returnValue = window.showModalDialog("son.html ", window); //for chrome if ...

  5. unable to connect to :5555

    有可能批处理文件用的adb和eclipse的adb不兼容.把你的批处理文件用的adb换成eclipse的adb就可以了: 运行结果:

  6. android 焦点问题

    今天解决了一个Android平台下的焦点问题.发现其中关键问题的所在是Android的touchMode.从JavaSwing平台过来的人,都会关注setFocusable()和requestFocu ...

  7. PHP set_error_handler()函数的使用【转载】

    我们写程序,难免会有问题(是经常会遇到问题 ),而PHP遇到错误时,就会给出出错脚本的位置.行数和原因.有很多人说,这并没有什么大不了.确实,在调试程序阶段,这确实是没啥的,而且我认为给出错误路径是必 ...

  8. external 里面文件的介绍

    搞了半天android,竟然对external下的库一无所知?不能容忍! 马上解决: android-mock:编译为java静态库.说明:Android Mock is a framework fo ...

  9. 外部连VPN的方法

    1)安装网络挂件vpnc使用命令:sudo apt-get install vpnc 2)找到公司的默认配置文件xxx_common.pcf ,使用命令将其转换为对应的配置文件:sudo pcf2vp ...

  10. Lua 基础 -- 学习笔记

    标签(空格分隔): Lua 1. Lua可以一次性给多个变量赋值 变量比赋值多,多的变量就赋值nil 变量比赋值少,多的赋值舍弃 local a, b, c = 1, 2, 3 print( a, b ...