前言

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

这是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. Oracle JET mobile cordove navigator.app对象

    在使用 Oracle JET 开发 webapp 时,会使用到 ojrouter ,ojrouter 默认含有历史记录推送功能.在调试 Android 时会发现返回键总是返回到上一次浏览记录(App ...

  2. MIME 类型,ContentType

    MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准. MIME 消息能包含文本.图像.音频.视频以及其他应用程序专用的数据. 官方 ...

  3. ES6实现数组去重

    ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Array.from方法可以将 Set 结构转为数组. 扩展运算符内部调用的是数据结构的 Iterator 接 ...

  4. 求旋转数组的最小数字(剑指offer)

    把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数 ...

  5. RandomAccessFile 文件读写中文乱码解决方案!

    RandomAccessFile 读写文件时,不管文件中保存的数据编码格式是什么   使用 RandomAccessFile对象方法的 readLine() 都会将编码格式转换成 ISO-8859-1 ...

  6. HTML学习之==>HTML标签

    前端的三把利器: HTML:一个人 CSS:这个人的衣服 JS:这个人的行为 HTML(超文本标记语言) html代码实际上就是一套能够被浏览器所识别的规则代码,由一个个标签组成.html代码就是一大 ...

  7. Discrete Mathematics and Its Applications | 1 CHAPTER The Foundations: Logic and Proofs | 1.4 Predicates and Quantifiers

    The statements that describe valid input are known as preconditions and the conditions that the outp ...

  8. DG on Windows 10 S: 执行任意代码

    DG on Windows 10 S: 执行任意代码 windows 10 S版本是什么鬼? 众所周知,我们使用的是windows 10企业版 LTSC.更准确一点,CMD运行winver,我的版本是 ...

  9. docker 安装mysql 并将文件挂载到本地

    首先准备好挂载的文件路径 执行mysql创建以及挂载的命令(这里还可以使用-e环境变量来创建新用户MYSQL_USER,MYSQL_PASSWORD) docker run -d -p : --res ...

  10. Flask框架(一)—— Flask简介

    Flask框架(一)—— Flask简介 目录 Flask框架介绍 一.Flask简介 二.flask安装与使用 1.安装 2.使用 3.简单案例——flask实现用户登录 Flask框架介绍 一.F ...