前言

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

这是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. sqli-lab(15)

    要考四级了 翻译过来就是 基于时间的单引号盲注 0X01盲注 的了解 https://www.cnblogs.com/ldhbetter/p/9201840.html 这里写的清清楚楚 A 先拆解长度 ...

  2. php curl http digest

    php用curl访问有http digest验证的网址时,不能直接加在URL上,例如: http://user:pass@xxx.xxx.xxx.xxx/index.php?a=1&b=2 这 ...

  3. C语言的AES加密

    C语言的AES加密 稍微封装了几个函数 方便使用 #if 1 #include <stdio.h> #include <stdlib.h> #include <strin ...

  4. 一、基础篇--1.1Java基础-重载和重写的区别

    重载和重写的区别 重写: 1.也叫子类的方法覆盖父类的方法,要求返回值.方法名和参数都相同: 2.子类抛出的异常不能超过父类相应方法抛出的异常.(子类异常不能超出父类异常): 3.子类方法的的访问级别 ...

  5. Linux编译部署vsftp服务

    部署vsftp服务   Hostname OS IP Software Vsftpsvr RHEL-5.8 10.0.0.58 yum install -y vsftpd yum install –y ...

  6. iOS应用将强制使用HTTPS安全加密-afn配置https(190926更新)

    WWDC 2016苹果开发者大会上,苹果在讲解全新的iOS10中提到了数据安全这一方面,并且苹果宣布iOS应用将从2017年1月起启用名为App Transport Security的安全传输功能. ...

  7. framework7 底部弹层popup js关闭方法

    <div class="u-sd-btns"> <button>同意</button> <button class="popup ...

  8. 终极Shell - Oh My Zsh

    介绍 zsh: 与 bash 同为 shell 软件,适用于 linux 和 mac,mac 与百度开发机已自带. oh-my-zsh:zsh 的一个开源配置方案,即下即用,免去复杂的配置过程.配置后 ...

  9. 数据库之DML

    1.表的有关操作: 1.1.表的创建格式: CREATE TABLE IF NOT EXISTS 表名(属性1 类型,属性2 类型,....,属性n 类型):# 标记部分表示可以省略 1.2.表的修改 ...

  10. java中的命名规则

    转载自:http://growstep.diandian.com/post/2011-08-17/3989094 1.类名首字母应该大写.属性(成员变量).方法.对象变量以及所有标识符(如形式参数.实 ...