简单的MFC 计算器

冷不防 2022-06-04 02:26 239阅读 0赞

采用vs2012软件中带的MFC基础类库,编写了带有一个编辑框加20个按钮的计算器。

能实现整数和小数的加减乘除、开方、平方、退格和清除等功能。输入一组数后,按下运算符按妞,编辑框自动更新。另外编辑框的数字也可通过键盘输入。

界面效果图如下:

Center

程序实现主要代码如下:

  1. // CalculatorDlg.h : 头文件
  2. #pragma once
  3. // CCalculatorDlg 对话框
  4. class CCalculatorDlg : public CDialogEx
  5. {
  6. // 构造
  7. public:
  8. CCalculatorDlg(CWnd* pParent = NULL); // 标准构造函数
  9. void SaveValue1();
  10. // 对话框数据
  11. enum { IDD = IDD_CALCULATOR_DIALOG };
  12. protected:
  13. virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
  14. // 实现
  15. protected:
  16. HICON m_hIcon;
  17. // 生成的消息映射函数
  18. virtual BOOL OnInitDialog();
  19. afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
  20. afx_msg void OnPaint();
  21. afx_msg HCURSOR OnQueryDragIcon();
  22. DECLARE_MESSAGE_MAP()
  23. public:
  24. afx_msg void OnBnClickedButton0();
  25. afx_msg void OnBnClickedButton1();
  26. afx_msg void OnBnClickedButton2();
  27. afx_msg void OnBnClickedButton3();
  28. afx_msg void OnBnClickedButton4();
  29. afx_msg void OnBnClickedButton5();
  30. afx_msg void OnBnClickedButton6();
  31. afx_msg void OnBnClickedButton7();
  32. afx_msg void OnBnClickedButton8();
  33. afx_msg void OnBnClickedButton9();
  34. afx_msg void OnBnClickedPoint();
  35. afx_msg void OnBnClickedButtonJia();
  36. afx_msg void OnBnClickedButtonJian();
  37. afx_msg void OnBnClickedButtonCheng();
  38. afx_msg void OnBnClickedButtonChu();
  39. afx_msg void OnBnClickedButtonAc();
  40. afx_msg void OnBnClickedButtonGenhao();
  41. afx_msg void OnBnClickedButtonCifang();
  42. afx_msg void OnBnClickedButtonBack();
  43. afx_msg void OnBnClickedButtondDeng();
  44. afx_msg void OnEnChangeEdit1();
  45. double m_fNumber1;
  46. double m_fNumber2;
  47. int m_iSign;
  48. //计算
  49. void Calculator();
  50. void CCalculatorDlg::OnButtonKaiFang() ;
  51. void CCalculatorDlg::OnButtonPingFang();
  52. void CCalculatorDlg::OnButtonClear();
  53. CString m_str;
  54. afx_msg void OnBnClickedButton10();
  55. afx_msg void OnBnClickedButton12();
  56. afx_msg void OnBnClickedButton11();
  57. afx_msg void OnBnClickedButton13();
  58. };
  59. // CalculatorDlg.cpp : 实现文件
  60. #include "stdafx.h"
  61. #include "Calculator.h"
  62. #include "CalculatorDlg.h"
  63. #include "afxdialogex.h"
  64. #include <stdlib.h>
  65. #include <math.h>
  66. #include<stdio.h>
  67. #ifdef _DEBUG
  68. #define new DEBUG_NEW
  69. #endif
  70. // 用于应用程序“关于”菜单项的 CAboutDlg 对话框
  71. class CAboutDlg : public CDialogEx
  72. {
  73. public:
  74. CAboutDlg();
  75. // 对话框数据
  76. enum { IDD = IDD_ABOUTBOX };
  77. protected:
  78. virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
  79. // 实现
  80. protected:
  81. DECLARE_MESSAGE_MAP()
  82. };
  83. CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
  84. {
  85. }
  86. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  87. {
  88. CDialogEx::DoDataExchange(pDX);
  89. }
  90. BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
  91. END_MESSAGE_MAP()
  92. // CCalculatorDlg 对话框
  93. CCalculatorDlg::CCalculatorDlg(CWnd* pParent /*=NULL*/)
  94. : CDialogEx(CCalculatorDlg::IDD, pParent)
  95. , m_str(_T(""))
  96. {
  97. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  98. }
  99. void CCalculatorDlg::DoDataExchange(CDataExchange* pDX)
  100. {
  101. CDialogEx::DoDataExchange(pDX);
  102. DDX_Text(pDX, IDC_EDIT1, m_str);
  103. DDX_Text(pDX, IDC_EDIT1, m_str);
  104. }
  105. BEGIN_MESSAGE_MAP(CCalculatorDlg, CDialogEx)
  106. ON_WM_SYSCOMMAND()
  107. ON_WM_PAINT()
  108. ON_WM_QUERYDRAGICON()
  109. ON_BN_CLICKED(IDC_BUTTON_0, &CCalculatorDlg::OnBnClickedButton0)
  110. ON_BN_CLICKED(IDC_BUTTON_6, &CCalculatorDlg::OnBnClickedButton6)
  111. ON_BN_CLICKED(IDC_BUTTON_1, &CCalculatorDlg::OnBnClickedButton1)
  112. ON_BN_CLICKED(IDC_BUTTON_7, &CCalculatorDlg::OnBnClickedButton7)
  113. ON_BN_CLICKED(IDC_BUTTON_JIA, &CCalculatorDlg::OnBnClickedButtonJia)
  114. ON_BN_CLICKED(IDC_BUTTON_AC, &CCalculatorDlg::OnBnClickedButtonAc)
  115. ON_BN_CLICKED(IDC_BUTTON_GENHAO, &CCalculatorDlg::OnBnClickedButtonGenhao)
  116. ON_BN_CLICKED(IDC_BUTTON_CIFANG, &CCalculatorDlg::OnBnClickedButtonCifang)
  117. ON_BN_CLICKED(IDC_BUTTON_CHU, &CCalculatorDlg::OnBnClickedButtonChu)
  118. ON_BN_CLICKED(IDC_BUTTON_BAIFEN, &CCalculatorDlg::OnBnClickedButtonBack)
  119. ON_BN_CLICKED(IDC_BUTTOND_DENG, &CCalculatorDlg::OnBnClickedButtondDeng)
  120. ON_BN_CLICKED(IDC_POINT, &CCalculatorDlg::OnBnClickedPoint)
  121. ON_BN_CLICKED(IDC_BUTTON_JIAN, &CCalculatorDlg::OnBnClickedButtonJian)
  122. ON_BN_CLICKED(IDC_BUTTON_8, &CCalculatorDlg::OnBnClickedButton8)
  123. ON_BN_CLICKED(IDC_BUTTON_9, &CCalculatorDlg::OnBnClickedButton9)
  124. ON_BN_CLICKED(IDC_BUTTON_CHENG, &CCalculatorDlg::OnBnClickedButtonCheng)
  125. ON_EN_CHANGE(IDC_EDIT1, &CCalculatorDlg::OnEnChangeEdit1)
  126. ON_BN_CLICKED(IDC_BUTTON_10, &CCalculatorDlg::OnBnClickedButton10)
  127. ON_BN_CLICKED(IDC_BUTTON_12, &CCalculatorDlg::OnBnClickedButton12)
  128. ON_BN_CLICKED(IDC_BUTTON_11, &CCalculatorDlg::OnBnClickedButton11)
  129. ON_BN_CLICKED(IDC_BUTTON_13, &CCalculatorDlg::OnBnClickedButton13)
  130. END_MESSAGE_MAP()
  131. // CCalculatorDlg 消息处理程序
  132. BOOL CCalculatorDlg::OnInitDialog()
  133. {
  134. CDialogEx::OnInitDialog();
  135. // 将“关于...”菜单项添加到系统菜单中。
  136. // IDM_ABOUTBOX 必须在系统命令范围内。
  137. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  138. ASSERT(IDM_ABOUTBOX < 0xF000);
  139. CMenu* pSysMenu = GetSystemMenu(FALSE);
  140. if (pSysMenu != NULL)
  141. {
  142. BOOL bNameValid;
  143. CString strAboutMenu;
  144. bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
  145. ASSERT(bNameValid);
  146. if (!strAboutMenu.IsEmpty())
  147. {
  148. pSysMenu->AppendMenu(MF_SEPARATOR);
  149. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  150. }
  151. }
  152. // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
  153. // 执行此操作
  154. SetIcon(m_hIcon, TRUE); // 设置大图标
  155. SetIcon(m_hIcon, FALSE); // 设置小图标
  156. // TODO: 在此添加额外的初始化代码
  157. return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
  158. }
  159. void CCalculatorDlg::OnSysCommand(UINT nID, LPARAM lParam)
  160. {
  161. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  162. {
  163. CAboutDlg dlgAbout;
  164. dlgAbout.DoModal();
  165. }
  166. else
  167. {
  168. CDialogEx::OnSysCommand(nID, lParam);
  169. }
  170. }
  171. // 如果向对话框添加最小化按钮,则需要下面的代码
  172. // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
  173. // 这将由框架自动完成。
  174. \\void CCalculatorDlg::OnPaint()
  175. {
  176. if (IsIconic())
  177. {
  178. CPaintDC dc(this); // 用于绘制的设备上下文
  179. SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
  180. // 使图标在工作区矩形中居中
  181. int cxIcon = GetSystemMetrics(SM_CXICON);
  182. int cyIcon = GetSystemMetrics(SM_CYICON);
  183. CRect rect;
  184. GetClientRect(&rect);
  185. int x = (rect.Width() - cxIcon + 1) / 2;
  186. int y = (rect.Height() - cyIcon + 1) / 2;
  187. // 绘制图标
  188. dc.DrawIcon(x, y, m_hIcon);
  189. }
  190. else
  191. {
  192. CDialogEx::OnPaint();
  193. }
  194. }
  195. //当用户拖动最小化窗口时系统调用此函数取得光标
  196. //显示。
  197. HCURSOR CCalculatorDlg::OnQueryDragIcon()
  198. {
  199. return static_cast<HCURSOR>(m_hIcon);
  200. }
  201. void CCalculatorDlg::OnBnClickedButton2()
  202. {
  203. // TODO: 在此添加控件通知处理程序代码
  204. UpdateData(TRUE);
  205. m_str = m_str + '2';
  206. UpdateData(FALSE);
  207. }
  208. void CCalculatorDlg::OnBnClickedButton3()
  209. {
  210. // TODO: 在此添加控件通知处理程序代码
  211. UpdateData(TRUE);
  212. m_str = m_str + '3';
  213. UpdateData(FALSE);
  214. }
  215. void CCalculatorDlg::OnBnClickedButton5()
  216. {
  217. // TODO: 在此添加控件通知处理程序代码
  218. UpdateData(TRUE);
  219. m_str = m_str + '5';
  220. UpdateData(FALSE);
  221. }
  222. void CCalculatorDlg::OnBnClickedButton0()
  223. {
  224. // TODO: 在此添加控件通知处理程序代码
  225. UpdateData(TRUE);
  226. m_str = m_str + '0';
  227. UpdateData(FALSE);
  228. }
  229. void CCalculatorDlg::OnBnClickedButton6()
  230. {
  231. // TODO: 在此添加控件通知处理程序代码
  232. UpdateData(TRUE);
  233. m_str = m_str + '6';
  234. UpdateData(FALSE);
  235. }
  236. void CCalculatorDlg::OnBnClickedButton1()
  237. {
  238. // TODO: 在此添加控件通知处理程序代码
  239. UpdateData(TRUE);
  240. m_str = m_str + '1';
  241. UpdateData(FALSE);
  242. }
  243. void CCalculatorDlg::OnBnClickedButton7()
  244. {
  245. // TODO: 在此添加控件通知处理程序代码
  246. UpdateData(TRUE);
  247. m_str= m_str + '7';
  248. UpdateData(FALSE);
  249. }
  250. void CCalculatorDlg::OnBnClickedButtonJia()
  251. {
  252. // TODO: 在此添加控件通知处理程序代码
  253. SaveValue1();
  254. m_iSign = 0;
  255. }
  256. void CCalculatorDlg::OnBnClickedButtonAc()
  257. {
  258. // TODO: 在此添加控件通知处理程序代码
  259. UpdateData(TRUE);
  260. m_str = "";
  261. m_fNumber1 = 0.0;
  262. m_fNumber2 = 0.0;
  263. m_iSign = 0;
  264. UpdateData(FALSE);
  265. }
  266. void CCalculatorDlg::OnBnClickedButtonGenhao()
  267. {
  268. // TODO: 在此添加控件通知处理程序代码
  269. UpdateData(TRUE);
  270. m_fNumber1 = _ttof (m_str);
  271. double f = sqrt(m_fNumber1);
  272. //如果浮点数其实是个整数
  273. if (f - int(f) <= 1e-5)
  274. {
  275. m_str.Format("%d", (int)f);
  276. }
  277. else
  278. {
  279. m_str.Format("%f", f);
  280. }
  281. UpdateData(FALSE);
  282. m_fNumber1 = f;
  283. m_fNumber2 = 0.0;
  284. m_iSign = 5;
  285. }
  286. void CCalculatorDlg::OnBnClickedButtonCifang()
  287. {
  288. // TODO: 在此添加控件通知处理程序代码
  289. // TODO: Add your control notification handler code here
  290. UpdateData(TRUE);
  291. m_fNumber1 = _ttof (m_str);
  292. double f = m_fNumber1 * m_fNumber1;
  293. //如果浮点数其实是个整数
  294. if (f - int(f) <= 1e-5)
  295. {
  296. m_str.Format("%d", (int)f);
  297. }
  298. else
  299. {
  300. m_str.Format("%f", f);
  301. }
  302. UpdateData(FALSE);
  303. m_fNumber1 = f;
  304. m_fNumber2 = 0.0;
  305. m_iSign = 4;
  306. }
  307. void CCalculatorDlg::OnBnClickedButtonChu()
  308. {
  309. // TODO: 在此添加控件通知处理程序代码
  310. SaveValue1();
  311. m_iSign = 3;
  312. }
  313. void CCalculatorDlg::OnBnClickedButtonBaifen()
  314. {
  315. // TODO: 在此添加控件通知处理程序代码
  316. UpdateData(TRUE);
  317. //移除最右边一个字符
  318. if (!m_str.IsEmpty())
  319. {
  320. m_str = m_str.Left(m_str.GetLength()-1);
  321. }
  322. UpdateData(FALSE);
  323. }
  324. void CCalculatorDlg::OnBnClickedButtondDeng()
  325. {
  326. // TODO: 在此添加控件通知处理程序代码
  327. Calculator();
  328. }
  329. void CCalculatorDlg::OnBnClickedPoint()
  330. {
  331. // TODO: 在此添加控件通知处理程序代码
  332. UpdateData(TRUE);
  333. //如果没有小数点,则加上一个小数点,如果已有小数点就忽略此次的小数点,保证最多只有1个
  334. if (-1 == m_str.Find('.'))
  335. {
  336. m_str = m_str + '.';
  337. }
  338. UpdateData(FALSE);
  339. }
  340. void CCalculatorDlg::OnBnClickedButtonJian()
  341. {
  342. // TODO: 在此添加控件通知处理程序代码
  343. SaveValue1();
  344. m_iSign = 1;
  345. }
  346. void CCalculatorDlg::OnBnClickedButton8()
  347. {
  348. // TODO: 在此添加控件通知处理程序代码
  349. UpdateData(TRUE);
  350. m_str = m_str + '8';
  351. UpdateData(FALSE);
  352. }
  353. void CCalculatorDlg::OnBnClickedButton9()
  354. {
  355. // TODO: 在此添加控件通知处理程序代码
  356. UpdateData(TRUE);
  357. m_str = m_str + '9';
  358. UpdateData(FALSE);
  359. }
  360. void CCalculatorDlg::OnBnClickedButtonCheng()
  361. {
  362. // TODO: 在此添加控件通知处理程序代码
  363. SaveValue1();
  364. m_iSign = 2;
  365. }
  366. void CCalculatorDlg::SaveValue1()
  367. {
  368. UpdateData(TRUE);
  369. m_fNumber1 = _ttof (m_str);
  370. m_str = "";
  371. UpdateData(FALSE);
  372. }
  373. void CCalculatorDlg::Calculator()
  374. {
  375. UpdateData(TRUE);
  376. m_fNumber2 = _ttof(m_str);
  377. double f = 0.0;
  378. switch (m_iSign)
  379. {
  380. //加
  381. case 0:
  382. f = m_fNumber1 + m_fNumber2;
  383. break;
  384. //减
  385. case 1:
  386. f = m_fNumber1 - m_fNumber2;
  387. break;
  388. //乘
  389. case 2:
  390. f = m_fNumber1 * m_fNumber2;
  391. break;
  392. //除
  393. case 3:
  394. if (m_fNumber2 == 0.0)
  395. {
  396. f = m_fNumber1;
  397. }
  398. else
  399. {
  400. f = m_fNumber1 / m_fNumber2;
  401. }
  402. break;
  403. //平方
  404. default:
  405. break;
  406. }
  407. //如果浮点数其实是个整数
  408. if (f - int(f) <= 1e-5)
  409. {
  410. m_str.Format("%d", (int)f);
  411. }
  412. else
  413. {
  414. m_str.Format("%f", f);
  415. }
  416. UpdateData(FALSE);
  417. m_fNumber1 = f;
  418. m_fNumber2 = 0.0;
  419. }
  420. void CCalculatorDlg::OnEnChangeEdit1()
  421. {
  422. // TODO: 如果该控件是 RICHEDIT 控件,它将不
  423. // 发送此通知,除非重写 CDialogEx::OnInitDialog()
  424. // 函数并调用 CRichEditCtrl().SetEventMask(),
  425. // 同时将 ENM_CHANGE 标志“或”运算到掩码中。
  426. // TODO: 在此添加控件通知处理程序代码
  427. }

出现一些问题的解决

1)mfc140ud.lib缺失问题

从网上下载(但是没找到),一开始用的VS2012,后来下了VS2017,从vs2012中修改了一下依赖库,把依赖库地址设为vs2017中该文件的所在文件夹。

2)输出结果为0的问题

在进行运算过程中出现了按下按钮“=”后,出现输出结果为“0”;猜测应该是double转字符的过程中出现了问题,一开始用的sprintf_s,借用新建buffer数组缓存,后来改为

.Format(“%d”,(int)f)但是确报错,经查找资料,在视图菜单栏下找到属性,进去后点击配置属性下的常规项找到倒数第四行的字符集,将使用Unicode改为多字节。

3)字符转double问题

采用函数_ttof头文件为取代了一开始的atof_,成功解决。

4)自定义标题栏图像和标题文字

利用网上的ico在线转换工具,将自己的图像修改为ico格式,并添加到Calculator\res下。并在Resource.h中添加代码#define IDI_ICON1 128,成功生成新的可执行文件图标。

在BOOL CCalculatorDlg::OnInitDialog()下添加代码SetWindowText(“爱吸猫薛定谔的计算器”);

成功修改标题栏文字。

发表评论

表情:
评论列表 (有 0 条评论,239人围观)

还没有评论,来说两句吧...

相关阅读

    相关 简单MFC 计算器

    采用vs2012软件中带的MFC基础类库,编写了带有一个编辑框加20个按钮的计算器。 能实现整数和小数的加减乘除、开方、平方、退格和清除等功能。输入一组数后,按下运算符按妞,

    相关 简单计算器

    简单计算器 读入一个只包含 +, -, \, / 的非负整数计算表达式,计算该表达式的值。 Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过2

    相关 JSP 简单计算器

    要求: 2、编写一个类实现加、减、乘、除、取余 计算,在JSP页面中完成如下功能: (1)输入两个操作数,选择运算符号,提交数据; (2)接收数据,进行运算,将运算结

    相关 简单计算器

     突然想到学了这么长时间C语言,除了写题,似乎没干过别的事了。。。![奋斗][struggle.gif]  闲着写了一个计算器,纯手工模拟,虽然只能实现简单的加减乘除和取余。

    相关 简单计算器

    简单计算器 功能 模拟简单计算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,4种运算符的优先级相同,按从左到右的顺序计算。 知识点 1.