因为接触MFC没有多长时间,所以需要写一些小程序来熟悉基本操作,这次写的是一个简易计算器。

外观:

程序下载链接:

MFC简易计算器

写作思路:

这里感谢 逆风微光 博主的博文,基本参照他的思路

http://blog.csdn.net/dpsying/article/details/19047645

由于实现的功能并不多,所以只定义了一个CString变量来接收数据,两个double变量用来储存数据,并且运算符按钮只记录数据和操作,最后的运算在“=”按钮中完成,不过这样做会存在一些Bug。但是简易版计算器并没有考虑那么多=。=

主要代码:

Easy_CalculatorDlg.h

// Easy_CalculatorDlg.h : 头文件
//#pragma once
#include "afxwin.h"// CEasy_CalculatorDlg 对话框
class CEasy_CalculatorDlg : public CDialogEx
{
// 构造
public:CEasy_CalculatorDlg(CWnd* pParent = NULL);  // 标准构造函数// 对话框数据
#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_EASY_CALCULATOR_DIALOG };
#endif//double变量用来储存数据double m_Number1;double m_Number2;//操作符int m_Operator;//储值函数void SaveValue();//清空函数void ClearAll();//字体变量CFont m_EditFont;protected:virtual void DoDataExchange(CDataExchange* pDX);  // DDX/DDV 支持// 实现
protected:HICON m_hIcon;// 生成的消息映射函数virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()
public:CString m_Temp;CEdit m_Edit;afx_msg void OnBnClickedButton1();afx_msg void OnBnClickedButton2();afx_msg void OnBnClickedButton3();afx_msg void OnBnClickedButton4();afx_msg void OnBnClickedButton5();afx_msg void OnBnClickedButton6();afx_msg void OnBnClickedButton7();afx_msg void OnBnClickedButton8();afx_msg void OnBnClickedButton9();afx_msg void OnBnClickedButton0();afx_msg void OnBnClickedButtonPoint();afx_msg void OnBnClickedButtonAbout();afx_msg void OnBnClickedButtonPlus();afx_msg void OnBnClickedButtonSubtract();afx_msg void OnBnClickedButtonMultiply();afx_msg void OnBnClickedButtonDivision();afx_msg void OnBnClickedButtonAc();afx_msg void OnBnClickedButtonBack();afx_msg void OnBnClickedButtonEqual();
};

Easy_CalculatorDlg.cpp

// Easy_CalculatorDlg.cpp : 实现文件
//#include "stdafx.h"
#include "Easy_Calculator.h"
#include "Easy_CalculatorDlg.h"
#include "afxdialogex.h"#ifdef _DEBUG
#define new DEBUG_NEW
#endif// 用于应用程序“关于”菜单项的 CAboutDlg 对话框class CAboutDlg : public CDialogEx
{
public:CAboutDlg();// 对话框数据
#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_ABOUTBOX };
#endifprotected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持// 实现
protected:DECLARE_MESSAGE_MAP()
};CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);
}BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()// CEasy_CalculatorDlg 对话框CEasy_CalculatorDlg::CEasy_CalculatorDlg(CWnd* pParent /*=NULL*/): CDialogEx(IDD_EASY_CALCULATOR_DIALOG, pParent), m_Temp(_T(""))
{m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}void CEasy_CalculatorDlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);DDX_Text(pDX, IDC_EDIT1, m_Temp);DDX_Control(pDX, IDC_EDIT1, m_Edit);
}BEGIN_MESSAGE_MAP(CEasy_CalculatorDlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON_1, &CEasy_CalculatorDlg::OnBnClickedButton1)ON_BN_CLICKED(IDC_BUTTON_2, &CEasy_CalculatorDlg::OnBnClickedButton2)ON_BN_CLICKED(IDC_BUTTON_3, &CEasy_CalculatorDlg::OnBnClickedButton3)ON_BN_CLICKED(IDC_BUTTON_4, &CEasy_CalculatorDlg::OnBnClickedButton4)ON_BN_CLICKED(IDC_BUTTON_5, &CEasy_CalculatorDlg::OnBnClickedButton5)ON_BN_CLICKED(IDC_BUTTON_6, &CEasy_CalculatorDlg::OnBnClickedButton6)ON_BN_CLICKED(IDC_BUTTON_7, &CEasy_CalculatorDlg::OnBnClickedButton7)ON_BN_CLICKED(IDC_BUTTON_8, &CEasy_CalculatorDlg::OnBnClickedButton8)ON_BN_CLICKED(IDC_BUTTON_9, &CEasy_CalculatorDlg::OnBnClickedButton9)ON_BN_CLICKED(IDC_BUTTON_0, &CEasy_CalculatorDlg::OnBnClickedButton0)ON_BN_CLICKED(IDC_BUTTON_POINT, &CEasy_CalculatorDlg::OnBnClickedButtonPoint)ON_BN_CLICKED(IDC_BUTTON_ABOUT, &CEasy_CalculatorDlg::OnBnClickedButtonAbout)ON_BN_CLICKED(IDC_BUTTON_PLUS, &CEasy_CalculatorDlg::OnBnClickedButtonPlus)ON_BN_CLICKED(IDC_BUTTON_SUBTRACT, &CEasy_CalculatorDlg::OnBnClickedButtonSubtract)ON_BN_CLICKED(IDC_BUTTON_MULTIPLY, &CEasy_CalculatorDlg::OnBnClickedButtonMultiply)ON_BN_CLICKED(IDC_BUTTON_DIVISION, &CEasy_CalculatorDlg::OnBnClickedButtonDivision)ON_BN_CLICKED(IDC_BUTTON_AC, &CEasy_CalculatorDlg::OnBnClickedButtonAc)ON_BN_CLICKED(IDC_BUTTON_BACK, &CEasy_CalculatorDlg::OnBnClickedButtonBack)ON_BN_CLICKED(IDC_BUTTON_EQUAL, &CEasy_CalculatorDlg::OnBnClickedButtonEqual)
END_MESSAGE_MAP()// CEasy_CalculatorDlg 消息处理程序BOOL CEasy_CalculatorDlg::OnInitDialog()
{CDialogEx::OnInitDialog();// 将“关于...”菜单项添加到系统菜单中。// IDM_ABOUTBOX 必须在系统命令范围内。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动//  执行此操作SetIcon(m_hIcon, TRUE);           // 设置大图标SetIcon(m_hIcon, FALSE);        // 设置小图标//设置字体m_EditFont.CreatePointFont(350, "黑体");m_Edit.SetFont(&m_EditFont);return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}void CEasy_CalculatorDlg::OnSysCommand(UINT nID, LPARAM lParam)
{if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialogEx::OnSysCommand(nID, lParam);}
}// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。void CEasy_CalculatorDlg::OnPaint()
{if (IsIconic()){CPaintDC dc(this); // 用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);// 使图标在工作区矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// 绘制图标dc.DrawIcon(x, y, m_hIcon);}else{CDialogEx::OnPaint();}
}//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CEasy_CalculatorDlg::OnQueryDragIcon()
{return static_cast<HCURSOR>(m_hIcon);
}void CEasy_CalculatorDlg::ClearAll()
{m_Number1 = 0.0;m_Number2 = 0.0;m_Operator = 0;m_Temp = _T("");
}void CEasy_CalculatorDlg::SaveValue()
{UpdateData(TRUE);m_Number1 = atof(m_Temp);m_Temp = _T("");UpdateData(FALSE);
}void CEasy_CalculatorDlg::OnBnClickedButton1()
{UpdateData(TRUE);m_Temp = m_Temp + _T("1");UpdateData(FALSE);
}void CEasy_CalculatorDlg::OnBnClickedButton2()
{UpdateData(TRUE);m_Temp = m_Temp + _T("2");UpdateData(FALSE);
}void CEasy_CalculatorDlg::OnBnClickedButton3()
{UpdateData(TRUE);m_Temp = m_Temp + _T("3");UpdateData(FALSE);
}void CEasy_CalculatorDlg::OnBnClickedButton4()
{UpdateData(TRUE);m_Temp = m_Temp + _T("4");UpdateData(FALSE);
}void CEasy_CalculatorDlg::OnBnClickedButton5()
{UpdateData(TRUE);m_Temp = m_Temp + _T("5");UpdateData(FALSE);
}void CEasy_CalculatorDlg::OnBnClickedButton6()
{UpdateData(TRUE);m_Temp = m_Temp + _T("6");UpdateData(FALSE);
}void CEasy_CalculatorDlg::OnBnClickedButton7()
{UpdateData(TRUE);m_Temp = m_Temp + _T("7");UpdateData(FALSE);
}void CEasy_CalculatorDlg::OnBnClickedButton8()
{UpdateData(TRUE);m_Temp = m_Temp + _T("8");UpdateData(FALSE);
}void CEasy_CalculatorDlg::OnBnClickedButton9()
{UpdateData(TRUE);m_Temp = m_Temp + _T("9");UpdateData(FALSE);
}void CEasy_CalculatorDlg::OnBnClickedButton0()
{UpdateData(TRUE);m_Temp = m_Temp + _T("0");UpdateData(FALSE);
}void CEasy_CalculatorDlg::OnBnClickedButtonPoint()
{UpdateData(TRUE);if (-1 == m_Temp.Find('.')){m_Temp = m_Temp + _T(".");}UpdateData(FALSE);
}void CEasy_CalculatorDlg::OnBnClickedButtonAbout()
{CAboutDlg Dlg;Dlg.DoModal();
}void CEasy_CalculatorDlg::OnBnClickedButtonPlus()
{SaveValue();m_Operator = 1;
}void CEasy_CalculatorDlg::OnBnClickedButtonSubtract()
{SaveValue();m_Operator = 2;
}void CEasy_CalculatorDlg::OnBnClickedButtonMultiply()
{SaveValue();m_Operator = 3;
}void CEasy_CalculatorDlg::OnBnClickedButtonDivision()
{SaveValue();m_Operator = 4;
}void CEasy_CalculatorDlg::OnBnClickedButtonAc()
{m_Number1 = 0.0;m_Number2 = 0.0;m_Operator = 0;m_Temp = _T("");UpdateData(FALSE);
}void CEasy_CalculatorDlg::OnBnClickedButtonBack()
{UpdateData(TRUE);if (!m_Temp.IsEmpty()){m_Temp = m_Temp.Left(m_Temp.GetLength() - 1);}UpdateData(FALSE);
}void CEasy_CalculatorDlg::OnBnClickedButtonEqual()
{UpdateData(TRUE);m_Number2 = atof(m_Temp);double n = 0.0;switch (m_Operator){case 1:n = m_Number1 + m_Number2;break;case 2:n = m_Number1 - m_Number2;break;case 3:n = m_Number1 * m_Number2;break;case 4:if (m_Number2 == 0){MessageBox(_T("ERROR"));ClearAll();}else{n = m_Number1 / m_Number2;}break;default:break;}m_Temp.Format("%f", n);m_Temp.TrimRight("0");m_Temp.TrimRight(".");UpdateData(FALSE);
}

背景图片是先引入资源然后用PictureCtrl控件显示,这里注意拖放控件的先后顺序,PictureCtrl控件应该首先被放置,否则会出现图片覆盖按钮的情况,此时需要更改控件顺序。

原博文中最后计算结果会出现16.75000000的情况,当然博主为了将16.000000显示为16采用了一种办法,这里给出一种更简单的处理办法,就是cpp末尾的几行代码。

 m_Temp.Format("%f", n);m_Temp.TrimRight("0");m_Temp.TrimRight(".");

这样无论是小数还是整数都可以去掉末尾的零。

字体大小改变是在OnInitDialog()函数中添加代码

 //设置字体m_EditFont.CreatePointFont(350, "黑体");m_Edit.SetFont(&m_EditFont);

这里感谢 守望者在这里 博主的博文。

文章地址:

http://blog.csdn.net/lxw907304340/article/details/46986915

由于简易计算器还存在一些bug,所以后期会考虑写一个功能更加完善的计算器=。=

MFC简易计算器实现相关推荐

  1. 基于VC6.0用MFC编写简易计算器

    功能介绍: 1> 标准型:能进行加.减.乘.除四则运算,具有清空.回退功能,还附加了添加小数点.化为百分数的功能. 2> 科学型:新增了求三角函数(sin.cos.tan).反三角函数(a ...

  2. MFC制作个人简易计算器(超长代码预警)

    学了快一年的c/c++,除了c语言能用来解数学题,c++多了个面向对象以外,什么都不会(可能在下学术不精,各位大佬勿喷).最近老师在讲vc++,终于可以做个真正的应用程序出来了,莫名有些兴奋,所以废了 ...

  3. 利用Visual Studio(C++)实现简易计算器(二)

    简易计算器代码部分的实现 在已创建好的MFC解决方案里打开头文件下的-Dlg.h文件(以下简称.h文件).源文件下的-Dlg.cpp文件(以下简称.cpp文件)和资源文件下.rc文件里的Dialog\ ...

  4. QT入门项目--简易计算器

    QT入门项目–简易计算器 目录 QT入门项目--简易计算器 一.前言 二.运行界面 三.代码 dialog.cpp doexpr.cpp check.cpp 四.总结 一.前言 C语言快要结课了,自然 ...

  5. 怎么用python自制计算公式_手把手教你用python制作简易计算器,能够记录你使用的情况...

    话不多说,首先先看效果图,它能够记录你在使用过程中的历史,方便你查看是否有错: 接下来就仔细分析一下是如何制作的: 简易计算器 第一步:导入资源库 在过程中使用到了tkinter这个资源库,win+R ...

  6. python表达式计算器_Python正则表达式实现简易计算器功能示例

    本文实例讲述了Python正则表达式实现简易计算器功能.分享给大家供大家参考,具体如下: 需求:使用正则表达式完成一个简易计算器. 功能:能够计算简单的表达式. 如:1*2*((1+2)/(2+3)+ ...

  7. PyQt5 简易计算器

    剩下计算函数(self.calculator)未实现,有兴趣的朋友可以实现它 [知识点] 1.利用循环添加按钮部件,及给每个按钮设置信号/槽 2.给按钮设置固定大小:button.setFixedSi ...

  8. JAVA(利用jsp+javabean+servlet)实现简易计算器

    代码解释基本都在代码中给出 1 <%@ page language="java" contentType="text/html; charset=UTF-8&quo ...

  9. 简单计算器的设计java_(基于java的简易计算器的设计.doc

    (基于java的简易计算器的设计 基于java的简易计算器的设计 摘要 自从java语言诞生以来,java语言就以不可抵挡的趋势很快成为国际上广泛流行的面向对象编程语言,它既具有高级语言的特点,又少了 ...

最新文章

  1. java拷贝文件权限_boto3 copy vs copy_object关于s3中的文件权限ACL
  2. Excel导入sqlserver
  3. oracle 数据语句优化,oracle 查询语句优化录
  4. IPv6推进将非常漫长
  5. 设置devenv命令的启动版本
  6. 解封装(三):AVFormatContext分析
  7. python宽度优先搜索算法并输出路径
  8. 【cocos】无法启动程序“..\proj.win32\Debug.win32\libcocos2d.dll
  9. svnsync 服务器代码备份
  10. Linux之unzip命令
  11. 安装VS2003 2005错误
  12. 已解决-怎么关CSDN的一周小结
  13. 浙江海洋大学计算机考研资料汇总
  14. 大学计算机基础教程实验答案,大学计算机基础试验教程习题参考答案
  15. 浏览器:CSDN的浏览器助手使用推荐
  16. 手机酷派4G5316 5313s 黑砖 求转成功 9008端口 9006端口 少走弯路选对镜像...
  17. eclipse svn too old to
  18. EAN-13 条码生成
  19. gps定位,根据经纬度;
  20. 寻找热门查询,300万个查询字符串中统计最热门的10个查询

热门文章

  1. 高新区万达(大连)编程猫学院(一)
  2. 一次无线网络故障排查
  3. DPVO:深度patch视觉里程计(arXiv 2022)
  4. 在VMware虚拟机建立共享磁盘
  5. SpringBoot MySQL #2 报错 ALTER command denied to ...
  6. 【有利可图网】一组优美的配色方案~
  7. 高基数数据特性是什么意思
  8. 如何利用js加密防止xss注入
  9. EmbeddedServletContainerException: Unable to start embedded Tomcat 内嵌Tomcat启动失败
  10. JS压缩图片并转换base64