利用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 = 0;
num2 = 0;
result = 0.0;
str = "";
str_flag = FALSE;
continue_flg = FALSE;
downDot = FALSE;
count = 1;

//}}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(10,count) + numSize;
if (downDot)
{
num1 = num1/(pow(10,count));
count++;
}
}

return num1;
}
else //有运算符被按下
{
if (!continue_flg) //是否连续按下
{
num2 = numSize;
continue_flg =TRUE;
}
else
{
num2 = num2*pow(10,count) + numSize;
if (downDot)
{
num2 = num2/(pow(10,count));
count++;
}
}

return num2;
}
}

void CCounterDlg::OnButton0()
{
// TODO: Add your control notification handler code here

m_display = buttonDownNum(0);
UpdateData(FALSE);
}

void CCounterDlg::OnButton1()
{
// TODO: Add your control notification handler code here
m_display = buttonDownNum(1);
UpdateData(FALSE);
}

void CCounterDlg::OnButton2()
{
// TODO: Add your control notification handler code here

m_display = buttonDownNum(2);

UpdateData(FALSE);
}

void CCounterDlg::OnButton3()
{
// TODO: Add your control notification handler code here
m_display = buttonDownNum(3);
UpdateData(FALSE);
}

void CCounterDlg::OnButton4()
{
// TODO: Add your control notification handler code here
m_display = buttonDownNum(4);
UpdateData(FALSE);
}

void CCounterDlg::OnButton5()
{
// TODO: Add your control notification handler code here
m_display = buttonDownNum(5);
UpdateData(FALSE);
}

void CCounterDlg::OnButton6()
{
// TODO: Add your control notification handler code here
m_display = buttonDownNum(6);
UpdateData(FALSE);
}

void CCounterDlg::OnButton7()
{
// TODO: Add your control notification handler code here
m_display = buttonDownNum(7);
UpdateData(FALSE);
}

void CCounterDlg::OnButton8()
{
// TODO: Add your control notification handler code here
m_display = buttonDownNum(8);
UpdateData(FALSE);
}

void CCounterDlg::OnButton9()
{
// TODO: Add your control notification handler code here
m_display = buttonDownNum(9);
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 = 1;
UpdateData(FALSE);
}

void CCounterDlg::OnButtonSub() //减
{
// TODO: Add your control notification handler code here
str = "-";
str_flag = TRUE;
continue_flg = FALSE;
downDot = FALSE;
count = 1;
UpdateData(FALSE);
}

void CCounterDlg::OnButtonMult() //乘
{
// TODO: Add your control notification handler code here
str = "*";
str_flag = TRUE;
continue_flg = FALSE;
downDot = FALSE;
count = 1;
UpdateData(FALSE);
}

void CCounterDlg::OnButtonDiv() //除
{
// TODO: Add your control notification handler code here
str = "/";
str_flag = TRUE;
continue_flg = FALSE;
downDot = FALSE;
count = 1;
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 = 1;
UpdateData(FALSE);
}

void CCounterDlg::OnButtonClear()
{
// TODO: Add your control notification handler code here

num1 = 0;
num2 = 0;
m_display = 0;
continue_flg = FALSE;
str_flag = FALSE;
downDot = FALSE;
count = 1;
UpdateData(FALSE);
}

利用MFC编写计算器

时间: 2024-10-25 12:46:38

利用MFC编写计算器的相关文章

利用多线程编写 生产者-消费者 关系

package ace; import java.util.ArrayList; import java.util.Timer; import java.util.TimerTask; /** * 利用多线程编写 生产者-消费者 关系 */ public class ProductionAndConsumption { private static ArrayList<String> products = new ArrayList<String>(); // 产品 private

看我如何利用Shell编写vsftpd管理软件

今天弄服务器的时候无意间用到此脚本,觉得当时写的虽然不咋样,但还是有点借鉴意义,就拿出来给大家看看.希望大家喜欢 先看看演示视频 看我如何利用Shell编写vsftpd管理软件 高清版下载: 百度云下载 OK然后我们来看看脚本的实现过程,时间有点久了当时的想法可能现在有点想不起来了,解释的不对的地方望见谅 脚本分为7个部分,这里我只做简单的解释 第一部分 脚本开始就利用awk提取日志中的用户名字段保存到tmp目录下的ftplog-userlist.txt文件中,方便后面查询 然后开始信息的展示,

如何利用CSS3编写一个满屏的布局

如何利用CSS3编写一个满屏的布局 css3的出现能帮助我们更加轻松的实现各种想要的效果,例如写一个刚好满屏的布局,我们就可以利用CSS3的弹性盒模型来实现. 先来贴出html布局代码: 1 <%- include header %> 2 <div class="wrapper"> 3 <div id="appswall"> 4 <div class="adsapp-title"><butto

纯javascript代码编写计算器程序

今天来分享一下用纯javascript代码编写的一个计算器程序,很多行业都能用到这个程序,例如做装修预算.贷款利率等等. 首先来看一下完成后的效果: 具体代码如下:(关注我的博客,及时获取最新WEB前端开发源代码) <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

品味性能之道&lt;九&gt;:利用Loadrunner编写socket性能测试脚本简述

一.概述 Loadrunner拥有极为丰富的工具箱,供予我们制造出各种奇妙魔法的能力.其中就有此次要讨论的socket套接字操作. 二.socket概述 socket是操作系统中I/O系统的网络延伸部分,它扩展了操作系统的基本I/O到网络通信,使进程和机器之间的通信成为可能.如果想完全地理解socket在Loadrunner中如何工作的,熟悉一些关于它的历史会很有帮助. 当前常用的socket,最早起源于BSD UNIX类的操作系统.在UNIX系统上,比如BSD,把对网络的支持加入操作系统,以一

备份_利用word编写导出多表语句

原创作品,出自 "深蓝的blog" 博客,欢迎转载,转载时请务必注明以下出处,否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlong/article/details/42104599 实验目标:利用word编写使用exp工具导出用户多表时的书写格式 实验环境: 操作系统:WINDOWS2008 64bit 数据库:ORACLE 11G R2 64bit 使用软件:word 2010.excel 2010.UltraEdit.PL/SQ

SA:T1法利用Matlab编写主函数实现对一元函数优化求解——Jason niu

%SA:T1法利用Matlab编写主函数实现对一元函数优化求解--Jason niu x = 1:0.01:2; y = sin(10*pi*x) ./ x; figure plot(x,y,'linewidth',1.5) ylim([-1.5, 1.5]) xlabel('x') ylabel('y') title('SA:T1法利用Matlab编写主函数实现对一元函数y = sin(10*pi*x) / x优化求解-Jason niu') hold on [maxVal,maxIndex]

[python网络编程]利用socket编写简单的服务器

利用socket编写简单的服务器 步骤解析 建立socket对象 这一步跟我们上次使用socket做客户端是一样的,都需要有一个socket连接 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 设置socket选项(setsockopt) 选项介绍setsockopt(set socket option),参数设置格式:setsockopt(level,optname,value) 各选项的关系:1.level:level的设定决定了op

软帝学院教你用java编写计算器(二)

软帝学院教你用java编写计算器(二) import java.awt.BorderLayout; import java.awt.GridBagLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.