端午节这两天没什么事,就用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. 解决mac下atom安装插件失败问题

    activate-power-mode的超炫编辑效果打动了我,花时间安装了atom,之后在package,install里面找到了这个插件,但是安装失败,如下图所示: gyp info it work ...

  2. shell之路【第一篇】shell简介与入门

    shell简介 1.Shell 诞生于 Unix,Unix的第一个脚本语言,是与 Unix/Linux 交互的工具,单独地学习 Shell 是没有意义的,shell使用的熟练程度反映了用户对Unix/ ...

  3. device-mapper: multipath: Failing path recovery【转载】

      digoal 2016-04-05 10:09:42 浏览180 评论0 摘要: 由于扇区损坏导致多路径设备failed. 现象如下 :  # dmesg : device-mapper: mul ...

  4. MyEclipse运行到断点也跳过的问题

    如果是B/S开发也就是javaWeb开发的话,Tomcat 的启动模式要设置成Debug模式 还有下面是没运行时断点的样子: 运行的时候,断点会变成对钩,表示执行到它所在代码的时候会停下来:

  5. 一篇很全面的freemarker教程 前端工程师必备

    FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成: 1,文本:直接输出的部分 2,注释:<#-- ... -->格式部分,不会输 ...

  6. 前台改变asp button控件的值,后台取值没有改变的问题

    前台: <asp:Button ID="btnEdit" Style="margin-left: 600px;" runat="server&q ...

  7. WPF Template模版之DataTemplate与ControlTemplate的关系和应用【二】

    1. DataTemplate和ControlTemplate的关系 学习过DataTemplate和ControlTemplate,你应该已经体会到,控件只是数据的行为和载体,是个抽象的概念,至于它 ...

  8. libmysql.dll 找不到

    在用C#开发的时候,需要连接MySQL  ,系统提示  libmysql.dll 找不到模块. 我们可以找到 MySQL安装文件夹下的 C:\Program Files\MySQL\MySQL Ser ...

  9. 字段为空sql语句,设置当前模式

    delete from t_corpinfo  where CORPID='' and CORPNAME=''  该命令是删除字段为空的记录 SET CURRENT SCHEMA DB2INST1;

  10. [转]ubuntu的which、whereis、locate和find命令

     which 只能寻找执行文件 ,并在PATH变量里面寻找. whereis 从linux文件数据库(/var/lib/slocate/slocate.db)寻找,所以有可能找到刚刚删除,或者没有发现 ...