前言

学习了鸡啄米网页的前三部分后,我们就可以做一个小软件出来了,我选择先做一个计算器。

这是Win7系统自带的计算器:

为了提升成就感,我将计算器的大部分内容去除,于是就变成这样:

这样就只剩下了16个按钮和一个文本显示框,这样就简单多了!

新建一个MFC对话框应用程序

打开VS2010点击Start Page中的New Project(新建工程),或者菜单栏File -> New -> Project 弹出新建项目对话框,在左侧选择MFC,然后在中间选择MFC Application

在下面三个编辑框中输入工程名称及路径。VS2010会在Location中选择的路径下建立名为Solution Name的文件夹用来放置工程有关的所有文件包括源文件、资源文件、工程文件、调试记录、可执行文件等等,并在该文件夹下创建名为Name的文件夹放置程序员编写的.h和.cpp文件以及程序员建立的一些资源文件,当然这个文件夹可以有程序员根据自己的编程习惯进行一些修改。

下一步进入VS的新建MFC应用程序欢迎对话框:

下一步选择工程类型:

在1处选择基于对话框的应用程序,2处可以选择对话框使用的语言(我暂时未发现使用英文版对创建中文对话框的影响),3处去掉勾,我在这里不使用宽字符,4处我选择第二项,使用静态链接库。

接下来的几步都选择默认即可,也可以在设置完工程类型后直接点击Finish按钮完成创建工程。

这样,我们就得到了一个基于MFC对话框的应用程序模板

使用键盘快捷键Alt+Enter调出Properties窗口,Ctrl+Shift+C调出ClassView窗口,Ctrl+Alt+X调出Toolbox窗口,Ctrl+Shift+E调出资源窗口,这些都是在MFC中常用的一些窗口。

建立计算器外观框架

1、将MFC默认的控件删除:选中后按下键盘【Delete】

2、从Toolbox中拖出16个按钮控件(Button)输入内容并调整大小、位置

选中一个按钮控件,在Properties窗口中将Caption属性改为“1”,用类似的方法更改其他15个按钮内容;将其中一个按钮选中更改为合适的大小,按下键盘【Ctrl】,同时鼠标点击选中其他所有的按钮,最后点击选中已经调整好大小的按钮,放开键盘【Ctrl】,在工具栏找到[Make Same Width]和[Make Same Height](图片中红色方框)并点击;

通过图片中黄色方框中的几个工具将按钮位置调整好。

3、从Toolbox中拖出一个文本编辑框(EditControl),调整大小和位置,调整属性ModalFrame为True,ReadOnly为True

4、调整对话框的大小

这样就可以得到一个建议的计算器了,不过编译链接后只是显示出了计算器的外观而已,按下按钮并没有任何反应,这是因为还没有对按钮添加响应事件:

工程文件

创建应用程序后,VS2010会在工程下自动创建一些文件和资源:

如果在新建工程选择工程类型时选择简体中文,那么工程文件说明在ReadMe.txt中以中文的形式呈现给程序员。

同时,可见的这3个cpp源文件中,程序员并不会找到应用程序的入口函数WinMain(),这是因为VS已经封装好了,VS将入口函数放在appmodul.cpp中,为AfxWinMain()函数(可以按下F10键进入调试状态,自动定位到程序入口处)。

在ReadMe.txt中这样描述对话框类:

应用程序向导创建一个对话框类:

CalculatorDlg.h,CalculatorDlg.cpp - 对话框

这些文件包含 CCalculatorDlg 类。该类定义应用程序主对话框的行为。该对话框的模板位于 Calculator.rc 中,该文件可以在 Microsoft Visual C++ 中进行编辑。

在CalculatorDlg.h 中可以看到类CCalculatorDlg是基于类CDialogEx的,这样,我们可以编辑这个类从而使软件运行起来。

为对话框类添加变量及响应函数

1、打开类视图,为对话框类CCalculatorDlg添加变量:右键点击类名称:

出现添加成员变量的对话框,添加CString类型变量m_strCal用来储存用户输入的算式

2、右键点击编辑框,为控件添加变量Control类型CEdit变量m_edRes:

         

3、为类添加无返回值无参成员函数UpdateEditRes:

      

进入CalculatorDlg.cpp中进行编辑,代码如下:

void CCalculatorDlg::UpdateEditRes(void)
{
m_edRes.SetWindowTextA(m_strCal);
}

4、右键点击按钮“1”,添加事件处理程序OnBn1,点击Add and Edit转到CalculatorDlg.cpp中进行编辑:

       

代码如下:

void CCalculatorDlg::OnBn1()
{
// TODO: Add your control notification handler code here
m_strCal += "";
this->UpdateEditRes();
}

5、同理为其他按钮添加事件处理,除了“C”按钮和“=”按钮外其他事件处理基本相同。

6、“C”按钮用于初始化类成员变量:

void CCalculatorDlg::OnBnC()
{
// TODO: Add your control notification handler code here
m_edRes.SetWindowTextA("");
m_strCal = "";
}

7、“=”按钮由于计算最终用户输入的算式:(为了演示效果简化算法只进行一步运算)

void CCalculatorDlg::OnBnEqual()
{
// TODO: Add your control notification handler code here
CString str;
char *a;
int num[] = {, }; //储存左右两个操作数
int i = ;
char op; //储存操作运算符
while (!m_strCal.IsEmpty())//分析输入的字符串获得操作数和运算符
{
str = m_strCal.Left();
a = str.GetBuffer();
str.ReleaseBuffer();
switch (a[])
{
case '': num[i]=num[i]*+; break;
case '': num[i]=num[i]*+; break;
case '': num[i]=num[i]*+; break;
case '': num[i]=num[i]*+; break;
case '': num[i]=num[i]*+; break;
case '': num[i]=num[i]*+; break;
case '': num[i]=num[i]*+; break;
case '': num[i]=num[i]*+; break;
case '': num[i]=num[i]*+; break;
case '': num[i]=num[i]*+; break;
default: op= a[]; i++; break;
}
m_strCal = m_strCal.Mid();
}
int res; //储存运算结果
switch (op) //分析操作符,得到结果
{
case '+': res=num[]+num[]; break;
case '-': res=num[]-num[]; break;
case '*': res=num[]*num[]; break;
case '/': if(num[]==) AfxMessageBox("除数不能为"); else res=num[]/num[]; break;
}
CString strres;
strres.Format("%d", res); //将结果数拼装为字符串用于显示
m_edRes.SetWindowTextA(strres);
m_strCal = "";
}

8、界面优化

根据软件功能分析效果:只能有两个操作数,只能在两个操作数之间放置一个操作运算符,所以为了防止用户误操作,我们可以使用控件的EnableWindow函数控制按钮的可用与否:

为按钮“+” “-” “*” “/”添加变量m_bnPlus,m_bnMinus,m_bnMultiply,m_bnDivide:并调整他们的属性Disabled为True

在CCalculatorDlg类中添加bool类型变量m_bOp

然后在按钮“+” “-” “*” “/”消息函数中添加如下代码:

   m_bnPlus.EnableWindow(FALSE);
m_bnMinus.EnableWindow(FALSE);
m_bnMultiply.EnableWindow(FALSE);
m_bnDivide.EnableWindow(FALSE);
m_bOp = true;

在按钮“C”消息函数中添加如下代码:

   m_bnPlus.EnableWindow(FALSE);
m_bnMinus.EnableWindow(FALSE);
m_bnMultiply.EnableWindow(FALSE);
m_bnDivide.EnableWindow(FALSE);

在按钮“1”“2”“3”“4”“5”“6”“7”“8”“9”“0”中添加如下代码:

   if (!m_bOp)
{
m_bnPlus.EnableWindow();
m_bnMinus.EnableWindow();
m_bnMultiply.EnableWindow();
m_bnDivide.EnableWindow();
}

在“=”按钮最开始处中添加如下代码:

   if (m_strCal.IsEmpty())
{
return ;
}

在“=”按钮末尾处中添加如下代码:

   m_bnPlus.EnableWindow(FALSE);
m_bnMinus.EnableWindow(FALSE);
m_bnMultiply.EnableWindow(FALSE);
m_bnDivide.EnableWindow(FALSE);
m_bOp = false;

这样一个最简单的计算器程序就做好了!!!

总结

整个对话框工程中运用了按钮和文本编辑框两类控件及其简单的成员函数,包括设置编辑框文本、设置按钮可用与否状态;为对话框添加成员变量、成员函数;一个调出消息框的函数AfxMessageBox函数;CString类的一些简单成员函数应用如CString:: IsEmpty(),CString:: Left(),CString::Mid(),CString:: Format()等。

最后,望各位同道中人给我提出宝贵意见

MFC学习笔记2---简单计算器的更多相关文章

  1. MFC 学习笔记

    MFC 学习笔记 一.MFC编程基础: 概述: 常用头文件: MFC控制台程序: MFC库程序: 规则库可以被各种程序所调用,扩展库只能被MFC程序调用. MFC窗口程序: 示例: MFC库中类的简介 ...

  2. JSP学习笔记(三):简单的Tomcat Web服务器

    注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...

  3. JAVA WEB学习笔记(三):简单的基于Tomcat的Web页面

    注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...

  4. Spark学习笔记0——简单了解和技术架构

    目录 Spark学习笔记0--简单了解和技术架构 什么是Spark 技术架构和软件栈 Spark Core Spark SQL Spark Streaming MLlib GraphX 集群管理器 受 ...

  5. Html学习笔记(二) 简单标签

    标签的重点 标签的用途 标签在浏览器中的默认样式 <body>标签: 在网页上显示的内容 <p>标签: 添加段落 <hx>标签: 添加标题 标签一共有6个,h1.h ...

  6. Netty学习笔记(六) 简单的聊天室功能之WebSocket客户端开发实例

    在之前的Netty相关学习笔记中,学习了如何去实现聊天室的服务段,这里我们来实现聊天室的客户端,聊天室的客户端使用的是Html5和WebSocket实现,下面我们继续学习. 创建客户端 接着第五个笔记 ...

  7. Java设计模式学习笔记(二) 简单工厂模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 正文开始... 1. 简介 简单工厂模式不属于GoF23中设计模式之一,但在软件开发中应用也较为 ...

  8. MFC学习笔记1---准备工作

    什么是MFC MFC,全称Microsoft Foundation Classes,微软基础类库,顾名思义,是微软的攻城狮们将一些常用的基础的Windows API 函数用C++的形式封装成类,简化程 ...

  9. CSS学习笔记09 简单理解BFC

    引子 在讲BFC之前,先来看看一个例子 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...

随机推荐

  1. [CSP-S模拟测试]:异或(数学)

    题目描述 给定$L,R$,我们希望你求出:$$\sum\limits_{i=L}^R\sum\limits_{j=L}^R(i\oplus j)$$其中这里的$\oplus$表示异或运算.答案对$10 ...

  2. webpack配置之webpack.config.js文件配置

    webpack配置之webpack.config.js文件配置 webpack.config.js webpack resolve  1.总是手动的输入webpack的输入输出文件路径,是一件非常繁琐 ...

  3. system系统调用返回值判断命令是否执行成功

    system函数对返回值的处理,涉及3个阶段: 阶段1:创建子进程等准备工作.如果失败,返回-1. 阶段2:调用/bin/sh拉起shell脚本,如果拉起失败或者shell未正常执行结束(参见备注1) ...

  4. JUnit@Before失效

    在学习Shiro的过程中需要使用到JUnit@Before注解配合测试,但是无论如何,@Before下面的方法都不按照预期的执行,困扰良久,后来各种百度终于找到根源,今分享于诸公,望能解诸公之急: J ...

  5. 设计模式(4): 给组件实现单独的store

    概述 最近最近做项目的时候总会思考一些大的应用设计模式相关的问题,我把自己的思考记录下来,供以后开发时参考,相信对其他人也有用. 组件自身的store 我们在开发组件的时候,时常都有这种需求,就是希望 ...

  6. 关于db4o的透明激活与激活声明

    关于db4o的透明激活与激活声明 有关于透明激活,其介绍可以参看这里:http://www.cnblogs.com/redmoon/archive/2008/02/23/1078619.html 文中 ...

  7. 中国MOOC_零基础学Java语言_第7周 函数_1分解质因数

    第7周编程题 查看帮助 返回   第7周编程题 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截 ...

  8. Ehlib好用的版本

    EhLib 6.2

  9. pycharm运行测试用例遇到错误:ZeroDivisionError: float division by zero的原因

    运行测试用例报错:ZeroDivisionError: float division by zero 一般是因为测试用例模块命名没有以test开头,导致unittest找不到用例,用例总数为0,导致除 ...

  10. 【Linux开发】【Qt开发】ARM QT移植详细步骤教程

    ARM QT移植详细步骤教程 米尔SAM9X5和A5D3X上默认的Qt版本是4.5.3,当这个版本的Qt库不能满足实际开发需求时,可通过此方法制定Qt开发.运行环境. 移植的步骤如下: 1.下载新版q ...