C++使用MFC编写一个简易计算器应用程序

本篇文章主要讲解利用C++中的MFC框架编写一个简易的计算器应用程序,希望通过此例能够让大家更好地理解MFC框架。

一.MFC简介

1.定义
MFC的全称是Microsoft Foundation Classes是微软基础类库的简称,是微软公司实现的一个C++类库,其中,主要封装了大部分windows API函数

2.设计原理
MFC是应用程序开发框架,是库的集合,它向程序开发人员提供了一组服务来协助开发。通常情况下,应用程序开发框架被设计为尽可能地使开发过程合理化以及简化繁琐的编程任务。MFC可以简化大部分的Windows API的使用,MFC中采用了API中的一些功能,例如窗口管理图形输出或消息路由选择,且用C++类进行包装,使开发者更易于使用。

3.MFC的优势
MFC是面向对象的设计将Windows API中的相关部分组合到C++类或者对象中。比如,CWnd类封装了绝大部分API编程功能,作为开发人员,不必记忆大量的API函数调用。只需要实例化CWnd类并调用成员函数就可以实现其对应功能。

4.MFC特性
MFC提供的特性数量很多,主要支持的特性如下:
1).文档/视图体系结构
2).多文档界面(MDI)
3).打印以及打印预览支持
4).使用并创建ActiveX控件
5).ODBC以及Access数据库支持
6).Internet(TCP/IP)编程支持
7).Windows常用控件支持
8).多线程支持

二.MFC实例演示----编写简易计算器(基于VS2010)

第一部分讲了MFC的一些基础概念,现在,向大家演示使用MFC编写一个简易计算器的例子。

1.创建计算器工程项目及对话框:
选择"文件"->新建->项目。
在这里插入图片描述
点击项目后弹出"新建项目"对话框,选择"Visual C++“下的“MFC”,在右侧选择"MFC应用程序”。
在这里插入图片描述
在下面的"名称"编辑框中输入工程名称取名为"Calculator",在"位置"编辑框中选择工程的保存路径,然后点击"确定"。
在这里插入图片描述
点击"下一步"到"应用程序类型"对话框,在"应用程序类型"下选择"基于对话框",其它为默认设置,点击"完成"。
在这里插入图片描述
此时会生成工程视图
在这里插入图片描述
在"解决方案"视图中可以看到"头文件"、"源文件"和"资源文件"等文件。

双击"资源文件"下的"Calculator.rc"可以看到有四个子项
在这里插入图片描述
在这里插入图片描述
其中:Dialog是对话框的视图,Icon是一些图标,String Table是字符串表,Version是版本。
点击箭头展开Dialog项
在这里插入图片描述
出现两个对话框模板,它们的ID为"IDD_ABOUTBOX"和"IDD_CALCULATOR_DIALOG",前者是"关于"对话框模板,后者是主对话框模板,ID是资源的唯一标识,便于我们区分对话框模板。

此时,创建对话框已经完成,如果需要添加对话框时,可以右键Dialog选择"插入 Dialog"就可以新建对话框,并且会自动分配ID。
在这里插入图片描述
2.设置对话框模板属性:
点击Dialog下的ID为"IDD_CALCULATOR_DIALOG"的主对话框模板,右键主对话框模板,选择"属性",就可以查看对话框模板的属性。
在这里插入图片描述
弹出的属性列表如下:
在这里插入图片描述

其中主要的有:
1).Caption:对话框标题。默认为工程名,我们修改为"计算器"。
2).Border:边框类型,有四种类型:None、Thin、Resizing和Dialog Fram,选择默认。
在这里插入图片描述
3).style:对话框类型。有三种类型:Overlapped(重叠窗口)、Popup(弹出式窗口)和Child(子窗口),默认使用Popup。
在这里插入图片描述
4).System Menu:是否带有系统菜单,默认使用True
5).Title Bar:是否带有标题栏,默认使用True
6).Font(Size):字体类型及大小。默认使用True设置为系统字体

3.添加控件
1).添加一个静态文本框(Static Text),显示数字A,先删除自动添加的标题为"TODO: 在此放置对话框控件。“的静态文本框,点击此文本框按"Delete"键就可删除。
2).点击拖动Static Text至主对话框模板
在这里插入图片描述右键点击静态文本框选择"属性”,修改静态文本框标题为"数字A",ID为"IDC_NUMBERA_STATIC"。
同理:添加另一个静态文本框,显示"数字B",ID为"IDC_NUMBERB_STATIC"。效果如下:
在这里插入图片描述

3).分别为数字A和数字B添加编辑框(Edit Control),用来输入数字A和数字B。
步骤:拖动Edit Control至主对话框模板,点击右键选择属性,修改ID为"IDC_NUMBERA_EDIT"和"IDC_NUMBERB_EDIT"。
此时对话框效果如下:
在这里插入图片描述

接着,添加结果静态文本框和编辑框,ID分别为"IDC_RESULT_STATIC"和"IDC_RESULT_EDIT"。

4).添加两个单选按钮为"加法"和"减法",设置属性ID为"IDC_ADD_RADIO"和"IDC_MINUS_RADIO",添加静态文本框为"请选择计算类型"并且删除原来默认的"确定"按钮,将"取消"按钮改为"退出"。
效果如下:
在这里插入图片描述

4.为控件添加变量
静态文本框是不变的,不需要添加变量,按钮是用来操作的,也不要添加变量,而数字是会变的,需要为控件关联变量。

步骤:
1).为数字A和数字B的编辑框添加变量。在编辑框点击右键,选择"添加变量"。
在这里插入图片描述
2).在弹出的对话框中设置"类别"为"Value",变量类型为"double",变量名取为"m_editNumberA"
在这里插入图片描述

3).同理,分别为数字B和结果添加变量,分别为double型"m_editNumberB"和double型"m_editResult",点击"完成"。

5.相关函数

1).数据交换和检验函数DoDataExchange()
控件的属性修改后MFC会相应地修改控件关联的变量值。这种同步的改变是通过对话框类自动生成的成员函数DoDataExchange()来实现的。
代码如下:

void CCalculatorDlg::DoDataExchange(CDataExchange* pDX)
{
 CDialogEx::DoDataExchange(pDX);//处理数据交接
 DDX_Text(pDX, IDC_NUMBERA_EDIT, m_editNumberA);//处理控件IDC_NUMBERA_EDIT和m_editNumberA的数据交换
 DDX_Text(pDX, IDC_NUMBERB_EDIT, m_editNumberB);//处理控件IDC_NUMBERB_EDIT和m_editNumberB的数据交换
 DDX_Text(pDX, IDC_RESULT_EDIT, m_editResult);//处理控件IDC_RESULT_EDIT和m_editResult的数据交换
}

2).显示函数UpdateData()
CDialogEx::UpdateData()函数原型为:BOOL UpdateData(BOOL bSaveAndValidate= TRUE);
其中,参数bSaveAndValidate用于指示数据传输方向,True表示从控件传给变量,FALSE表示从变量传给控件。默认为True,表示从控件传给变量。

6.添加消息处理函数
我们设置的计算按钮是用来点击后进行计算,所以,需要给按钮添加消息处理函数。

方式一:使用MFC Class Wizard添加消息处理函数。
右键点击"计算"按钮,选择类向导。

在这里插入图片描述
弹出MFC类向导对话框,此时,默认按钮的单击处理函数已经选择好了,我们选择"添加处理程序"就可以为计算按钮添加单击事件。
在这里插入图片描述
方式二:右键点击计算按钮,选择"添加事件处理程序",直接点击"添加编辑"。
在这里插入图片描述
在这里插入图片描述
方式三:在计算按钮属性视图中添加消息处理函数,右键点击计算按钮,选择属性,点击"Control Events"按钮,类似于闪电标志。
在这里插入图片描述
选择"BN_CLICKED"消息,点击箭头,出现"OnBnClickedAddButton",点击它就可以添加消息处理函数。
在这里插入图片描述
方式四:双击计算按钮直接添加消息处理函数。
在这里插入图片描述
7.完成代码逻辑编写
1).我们设置单选按钮的作用是选择计算类型是加法还是减法,在CCalculatorDlg::OnInitDialog()函数中添加单选按钮默认设置为"选上加法",这样程序运行时,默认会在加法单选按钮上选上。

// TODO: 在此添加额外的初始化代码
((CButton*)GetDlgItem(IDC_ADD_RADIO))->SetCheck(BST_CHECKED);

2).在计算按钮单击后,添加计算结果


void CCalculatorDlg::OnClickedCalButton()
{
 // TODO: 在此添加控件通知处理程序代码
 //由控件向变量传值
 UpdateData(TRUE);
 //如果单选按钮选上加法
if(::SendMessage(::GetDlgItem(m_hWnd,IDC_ADD_RADIO),BM_GETCHECK,NULL,NULL)==BST_CHECKED)
 {
  m_editResult=m_editNumberA+m_editNumberB;
 }
  //如果单选按钮选上减法
 else if(::SendMessage(::GetDlgItem(m_hWnd,IDC_MINUS_RADIO),BM_GETCHECK,NULL,NULL)==BST_CHECKED)
 {
  m_editResult=m_editNumberA-m_editNumberB;
 }
 //由变量传给控件显示值
 UpdateData(FALSE);
}

运行结果:
当单选按钮选择"加法时":
在这里插入图片描述
当单选按钮选择"减法"时:
在这里插入图片描述
8.控件Tab顺序调整
我们在打开程序时,不进行任何操作,直接按回车,发现程序直接关闭,经过研究发现:程序打开时,默认"退出"按钮为顺序1的控件,就是第一个接受用户输入的控件。为了让"退出"按钮不是第一个接受用户输入的控件,我们需要对它进行调整。
在这里插入图片描述点击主菜单"格式"选择Tab键顺序
在这里插入图片描述
发现"退出"按钮确实是Tab顺序1
在这里插入图片描述
修改方式为:数字A编辑框第一个点击就会设置成1,然后依次点击就是依次排序,将退出设置为最后一个,这样,第一个接受用户输入的就是数字A的编辑框了。
在这里插入图片描述重新编译
效果:
在这里插入图片描述
发现编辑框为第一个接受输入的控件,由此,简易计算器的编写就完成了。

最后,虽然MFC已经逐渐被QT(图形用户界面应用程序开发框架)取代了,但完成一些简单快捷的应用程序,MFC还是可以轻松解决的。技术在进步,但也不能完成舍弃新技术的基础。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值