编写MFC计算器

时间: 2023-08-13 18:03:11 浏览: 64
以下是一个简单的 MFC 计算器的代码: 首先,可以使用 MFC 库中的 CWnd 类来创建窗口和处理事件。我们需要创建一个派生自 CWnd 的类,我们称之为 CCalculatorWnd。 CCalculatorWnd.h 文件: ```cpp #pragma once class CCalculatorWnd : public CWnd { public: CCalculatorWnd(); protected: afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags); afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnPaint(); DECLARE_MESSAGE_MAP() private: CString m_strDisplay; double m_dResult; CString m_strOperator; BOOL m_bDecimal; BOOL m_bNewNumber; BOOL m_bError; }; ``` CCalculatorWnd.cpp 文件: ```cpp #include "stdafx.h" #include "Calculator.h" #include "CalculatorWnd.h" #ifdef _DEBUG #define new DEBUG_NEW #endif CCalculatorWnd::CCalculatorWnd() { m_strDisplay = _T("0"); m_dResult = 0.0; m_strOperator = _T(""); m_bDecimal = FALSE; m_bNewNumber = TRUE; m_bError = FALSE; } BEGIN_MESSAGE_MAP(CCalculatorWnd, CWnd) ON_WM_CHAR() ON_WM_LBUTTONDOWN() ON_WM_PAINT() END_MESSAGE_MAP() void CCalculatorWnd::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { if (m_bError) { m_strDisplay = _T("0"); m_dResult = 0.0; m_strOperator = _T(""); m_bDecimal = FALSE; m_bNewNumber = TRUE; m_bError = FALSE; } switch (nChar) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (m_bNewNumber) { m_strDisplay = _T(""); m_bNewNumber = FALSE; } m_strDisplay += nChar; break; case '.': if (m_bNewNumber) { m_strDisplay = _T("0"); m_bNewNumber = FALSE; } if (!m_bDecimal) { m_strDisplay += nChar; m_bDecimal = TRUE; } break; case '+': case '-': case '*': case '/': if (!m_strOperator.IsEmpty()) { OnLButtonDown(0, CPoint(0, 0)); } m_bNewNumber = TRUE; m_bDecimal = FALSE; m_strOperator = nChar; break; case '=': OnLButtonDown(0, CPoint(0, 0)); m_strOperator = _T(""); break; case '\b': if (m_strDisplay.GetLength() > 1) { m_strDisplay = m_strDisplay.Left(m_strDisplay.GetLength() - 1); } else { m_strDisplay = _T("0"); m_bNewNumber = TRUE; } break; case 'c': case 'C': m_strDisplay = _T("0"); m_dResult = 0.0; m_strOperator = _T(""); m_bDecimal = FALSE; m_bNewNumber = TRUE; break; } Invalidate(); } void CCalculatorWnd::OnLButtonDown(UINT nFlags, CPoint point) { double dOperand = _wtof(m_strDisplay); if (m_strOperator.IsEmpty()) { m_dResult = dOperand; } else { switch (m_strOperator[0]) { case '+': m_dResult += dOperand; break; case '-': m_dResult -= dOperand; break; case '*': m_dResult *= dOperand; break; case '/': if (dOperand == 0.0) { m_strDisplay = _T("Error"); m_bError = TRUE; return; } else { m_dResult /= dOperand; } break; } } CString strResult; strResult.Format(_T("%g"), m_dResult); m_strDisplay = strResult; m_bNewNumber = TRUE; m_bDecimal = FALSE; } void CCalculatorWnd::OnPaint() { CPaintDC dc(this); CRect rcClient; GetClientRect(&rcClient); CBrush brush; brush.CreateSolidBrush(RGB(255, 255, 255)); dc.FillRect(&rcClient, &brush); CFont font; font.CreateFont(20, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, _T("Arial")); dc.SelectObject(&font); rcClient.DeflateRect(5, 5); dc.DrawText(m_strDisplay, &rcClient, DT_RIGHT | DT_SINGLELINE | DT_VCENTER); } ``` 最后,在主函数中创建窗口并运行: ```cpp #include "stdafx.h" #include "Calculator.h" #include "CalculatorWnd.h" #ifdef _DEBUG #define new DEBUG_NEW #endif int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); AfxWinInit(hInstance, NULL, ::GetCommandLine(), 0); CCalculatorWnd wnd; wnd.Create(NULL, _T("Calculator"), WS_OVERLAPPEDWINDOW, CRect(0, 0, 200, 200)); wnd.ShowWindow(nCmdShow); wnd.UpdateWindow(); MSG msg; while (::GetMessage(&msg, NULL, 0, 0)) { ::TranslateMessage(&msg); ::DispatchMessage(&msg); } return (int)msg.wParam; } ``` 现在,你就可以编译和运行代码,得到一个简单的 MFC 计算器。

相关推荐

最新推荐

recommend-type

通俗易懂版基于MFC科学计算器

《基于MFC的科学计算器详解》 在计算机科学与编程领域,计算器开发是一个常见的实践项目,尤其是对于初学者来说,它能帮助...在编写代码的过程中,不断学习和优化,最终的成果将是既实用又具有教育意义的计算器程序。
recommend-type

任意数学表达式计算 mfc

描述中提到这是一个用MFC编写的文档,而不是代码,因此我们将主要关注理论和设计思路,而不是具体的代码实现。这个计算器能够处理的表达式包括但不限于简单的加减乘除、带有函数(如sin、cos等)的表达式,以及包含...
recommend-type

C语言编在VC环境下带界面的计算器

本文将探讨如何在Visual C++(简称VC)环境下,利用C语言编写一个带界面的计算器程序,实现基本的加减乘除功能。 首先,我们需要了解VC环境。Visual C++是微软公司提供的一个集成开发环境,它集成了编译器、调试器...
recommend-type

高级计算器设计与开发 c/c++ 课程设计

- 在课程设计中,学生需要利用MFC的对话框模板创建计算器的用户界面,并处理用户输入和响应。 3. **动态链接库(DLL)技术**: - DLL是Windows操作系统中的一种共享库,可以被多个程序同时使用,节省内存资源。 ...
recommend-type

mfc++小程序教程,从零起步的

教程通过一系列实例,如静态控件的使用、编辑框应用、单选钮、计算器、自定义对话框、数据库编程、文件操作和多媒体操作,帮助初学者逐步掌握MFC编程技巧。实例1展示了如何创建基于对话框的应用并添加静态控件,而...
recommend-type

程序员面试必备:实用算法集锦

在IT行业的求职过程中,程序员面试中的算法能力是至关重要的考察点。本书《程序员面试算法》专门针对这个需求,提供了大量实用的面试技巧和算法知识,旨在帮助求职者提升在面试中的竞争力。作者包括来自The University of Texas at Austin的Adnan Aziz教授,他在计算机工程领域有着深厚的学术背景,曾在Google、Qua1comm、IBM等公司工作,同时他还是一位父亲,业余时间与孩子们共享天伦之乐。 另一位作者是Amit Prakash,作为Google的技术人员,他专注于机器学习问题,尤其是在在线广告领域的应用。他的研究背景同样来自The University of Texas at Austin,拥有IIT Kanpur的本科学历。除了专业工作,他也热衷于解决谜题、电影欣赏、旅行探险,以及与妻子分享生活的乐趣。 本书涵盖了广泛的算法主题,可能包括但不限于排序算法(如快速排序、归并排序)、搜索算法(深度优先搜索、广度优先搜索)、图论、动态规划、数据结构(如链表、树、哈希表)以及现代技术如机器学习中的核心算法。这些内容都是为了确保求职者能够理解和应用到实际编程问题中,从而在面试时展现出扎实的算法基础。 面试官通常会关注候选人的算法设计、分析和优化能力,以及解决问题的逻辑思维。掌握这些算法不仅能证明应聘者的理论知识,也能展示其在实际项目中的实践经验和解决问题的能力。此外,对于面试官来说,了解应聘者是否能将算法应用于实际场景,如广告个性化推荐或网页搜索性能优化,也是评估其潜力的重要标准。 《程序员面试算法》是一本为准备面试的程序员量身打造的宝典,它不仅提供理论知识,还强调了如何将这些知识转化为实际面试中的表现。对于正在求职或者希望提升自我技能的程序员来说,这本书是不可或缺的参考资料。通过阅读和练习书中的算法,求职者将更有信心面对各种复杂的编程挑战,并在竞争激烈的面试中脱颖而出。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

多维数据库在零售领域的应用:客户细分、个性化营销和库存优化

![多维数据库在零售领域的应用:客户细分、个性化营销和库存优化](https://runwise.oss-accelerate.aliyuncs.com/sites/15/2021/03/%E4%BD%93%E9%AA%8C%E8%90%A5%E9%94%80-4-1024x576.png) # 1. 多维数据库概述** 多维数据库是一种专门用于分析多维数据的数据库技术。它将数据组织成多维立方体,其中每个维度代表一个不同的数据属性。与传统关系数据库相比,多维数据库在处理复杂查询和分析大量数据时具有显著的优势。 多维数据库的主要特点包括: - **多维数据模型:**数据组织成多维立方体,每
recommend-type

AttributeError: 'tuple' object has no attribute 'shape

`AttributeError: 'tuple' object has no attribute 'shape'` 这是一个常见的Python错误,它发生在尝试访问一个元组(tuple)对象的`shape`属性时。元组是一种有序的数据集合,它的元素不可变,因此`shape`通常是用于表示数据数组或矩阵等具有形状信息的对象,如numpy数组。 在这个错误中,可能是你在尝试像处理numpy数组那样操作一个普通的Python元组,但元组并没有内置的`shape`属性。如果你预期的是一个具有形状的结构,你需要检查是否正确地将对象转换为了numpy数组或其他支持该属性的数据结构。 解决这个问题的关键
recommend-type

《算法导论》第三版:最新增并行算法章节

《算法导论》第三版是计算机科学领域的一本权威著作,由Thomas H. Cormen、Charles E. Leiserson、Ronald L. Rivest和Clifford Stein四位知名专家合作编写。这本书自2009年发行以来,因其详尽且全面的讲解,成为了学习和研究算法理论的经典教材。作为真正的第三版,它在前两版的基础上进行了更新和完善,不仅包含了经典的算法设计和分析方法,还特别增加了关于并行算法的新章节,反映了近年来计算机科学中对并行计算日益增长的关注。 在本书中,读者可以深入理解基础的算法概念,如排序、搜索、图论、动态规划等,并学习如何设计高效的算法来解决实际问题。作者们以其清晰的逻辑结构、严谨的数学推导和丰富的实例演示,使复杂的问题变得易于理解。每一章都附有习题和解答,以便读者检验理解和深化学习。 并行算法部分则探讨了如何利用多处理器和分布式系统的优势,通过并发执行来加速算法的执行速度,这对于现代高性能计算和云计算时代至关重要。这部分内容涵盖了并行算法的设计原则,以及如何将这些原则应用到各种实际场景,如MapReduce模型和GPU编程。 此外,《算法导论》第三版还提供了广泛的参考文献和索引,方便读者进一步探索相关领域的前沿研究和技术进展。书中使用的Times Roman和Mathtime Pro 2字体以及高质量的印刷制作,确保了阅读体验的良好。 《算法导论》第三版是一本不可或缺的工具书,无论是对于计算机科学专业的学生,还是从事软件开发、数据结构设计或理论研究的专业人士,都是提升算法技能和理论素养的重要资源。无论你是初学者还是经验丰富的专业人士,都能在本书中找到深入学习和持续进阶所需的知识和技巧。