吕鑫MFC视频第二章答案之计算器.doc_第1页
吕鑫MFC视频第二章答案之计算器.doc_第2页
吕鑫MFC视频第二章答案之计算器.doc_第3页
吕鑫MFC视频第二章答案之计算器.doc_第4页
吕鑫MFC视频第二章答案之计算器.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

吕鑫MFC视频第二章答案之计算器按照题目要求做一个计算器可以进行加减乘除四项运算,我还照着window系统本身计算器的那样来做,增加了清屏,清行,以及删除,并且支持浮点数运算。使用的是vs2013.如果发现错误,请大家多多指正!项目下载 /cgs5LjVHijzNG 7ed8程序下载 /cgs5jrJcY7yHJ 8436首先建立一个工程,我建立的工程名为“cal”,选择对话框程序,然后建立按钮,编辑框进行界面布置,这个随意id设置自己知道就行了,我的id为上面的编辑框为:IDC_UP,属性多行,垂直滚动条,垂直滚动条居左,文本居右,禁止输入;下面的编辑框id为:IDC_DOWN,属性禁止输入,文本居右,数字按钮id等于IDC_(数字的英语单词),等于id为:IDOK,小数点:IDC_DOT,加:IDC_ADD,减:IDC_MINUS,乘:IDC_MULTIPLY,除:IDC_REMOVE,CE:IDC_CE,C:IDC_C,:IDC_DELETE,,把对话框禁止改变大小,只使用最小化,最大化不适用,然后创建函数,这些不清楚的在看看吕老师的视频。 头文件/ calDlg.h : 头文件/#pragma once/ CcalDlg 对话框class CcalDlg : public CDialogEx/ 构造public:CcalDlg(CWnd* pParent = NULL);/ 标准构造函数/ 对话框数据enum IDD = IDD_CAL_DIALOG ;protected:virtual void DoDataExchange(CDataExchange* pDX);/ DDX/DDV 支持/ 实现protected:HICON m_hIcon;/ 生成的消息映射函数virtual BOOL OnInitDialog();afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()public:afx_msg void OnBnClickedOk();afx_msg void OnBnClickedC();afx_msg void OnBnClickedThree();afx_msg void OnBnClickedOne();afx_msg void OnBnClickedTwo();afx_msg void OnBnClickedDelete();afx_msg void OnBnClickedCe();afx_msg void OnBnClickedFour();afx_msg void OnBnClickedFive();afx_msg void OnBnClickedSix();afx_msg void OnBnClickedSeven();afx_msg void OnBnClickedEnght();afx_msg void OnBnClickedNine();afx_msg void OnBnClickedNull();afx_msg void OnBnClickedRemove();afx_msg void OnBnClickedMultiply();afx_msg void OnBnClickedMinus();afx_msg void OnBnClickedAdd();double m_dLeft,m_dRight;/左值和右值CString m_szUp, m_szDown;/上面编辑框和下面编辑框,上面用于记录输入算式,下面用于接收输入BOOL m_bDot;int m_nCount;afx_msg void OnBnClickedDot();double sztod(CString str);/afx_msg void OnSize(UINT nType, int cx, int cy);/afx_msg void OnSize(UINT nType, int cx, int cy);/afx_msg void OnSize(UINT nType, int cx, int cy);virtual BOOL PreTranslateMessage(MSG* pMsg);源文件/ calDlg.cpp : 实现文件/#include stdafx.h#include cal.h#include calDlg.h#include afxdialogex.h#ifdef _DEBUG#define new DEBUG_NEW#endif/ CcalDlg 对话框CcalDlg:CcalDlg(CWnd* pParent /*=NULL*/): CDialogEx(CcalDlg:IDD, pParent)m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);void CcalDlg:DoDataExchange(CDataExchange* pDX)CDialogEx:DoDataExchange(pDX);BEGIN_MESSAGE_MAP(CcalDlg, CDialogEx)ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDOK, &CcalDlg:OnBnClickedOk)ON_BN_CLICKED(IDC_C, &CcalDlg:OnBnClickedC)ON_BN_CLICKED(IDC_THREE, &CcalDlg:OnBnClickedThree)ON_BN_CLICKED(IDC_ONE, &CcalDlg:OnBnClickedOne)ON_BN_CLICKED(IDC_TWO, &CcalDlg:OnBnClickedTwo)ON_BN_CLICKED(IDC_DELETE, &CcalDlg:OnBnClickedDelete)ON_BN_CLICKED(IDC_CE, &CcalDlg:OnBnClickedCe)ON_BN_CLICKED(IDC_FOUR, &CcalDlg:OnBnClickedFour)ON_BN_CLICKED(IDC_FIVE, &CcalDlg:OnBnClickedFive)ON_BN_CLICKED(IDC_SIX, &CcalDlg:OnBnClickedSix)ON_BN_CLICKED(IDC_SEVEN, &CcalDlg:OnBnClickedSeven)ON_BN_CLICKED(IDC_ENGHT, &CcalDlg:OnBnClickedEnght)ON_BN_CLICKED(IDC_NINE, &CcalDlg:OnBnClickedNine)ON_BN_CLICKED(IDC_NULL, &CcalDlg:OnBnClickedNull)ON_BN_CLICKED(IDC_REMOVE, &CcalDlg:OnBnClickedRemove)ON_BN_CLICKED(IDC_MULTIPLY, &CcalDlg:OnBnClickedMultiply)ON_BN_CLICKED(IDC_MINUS, &CcalDlg:OnBnClickedMinus)ON_BN_CLICKED(IDC_ADD, &CcalDlg:OnBnClickedAdd)ON_BN_CLICKED(IDC_DOT, &CcalDlg:OnBnClickedDot)/ON_WM_SIZE()/ON_WM_SIZE()/ON_WM_SIZE()END_MESSAGE_MAP()/ CcalDlg 消息处理程序BOOL CcalDlg:OnInitDialog()CDialogEx:OnInitDialog();m_bDot = 1;/把值初始化为1,作用为防止一个数据输入多个小数点m_nCount = 0;/用来判断运算符号,1为加,2为减,3为乘,4为除/ 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动/ 执行此操作SetIcon(m_hIcon, TRUE);/ 设置大图标SetIcon(m_hIcon, FALSE);/ 设置小图标/ TODO: 在此添加额外的初始化代码return TRUE; / 除非将焦点设置到控件,否则返回 TRUE/ 如果向对话框添加最小化按钮,则需要下面的代码/ 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序,/ 这将由框架自动完成。void CcalDlg:OnPaint()if (IsIconic()CPaintDC dc(this); / 用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast(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);elseCDialogEx:OnPaint();/当用户拖动最小化窗口时系统调用此函数取得光标/显示。HCURSOR CcalDlg:OnQueryDragIcon()return static_cast(m_hIcon);void CcalDlg:OnBnClickedOk()/=按钮double dz;switch (m_nCount)/判断运算符case 1:/加法计算m_dRight = _tcstod(m_szDown, NULL);/字符串转doubledz = m_dLeft + m_dRight;/计算值m_szDown.Format(_T(%lf), dz);/double 转字符串sztod(m_szDown);/调用函数去0m_dLeft = dz;/把计算的总值付给左值,以便连续运算m_dRight = 0;/右值清空break;case 2:m_dRight = _tcstod(m_szDown, NULL);dz = m_dLeft - m_dRight;m_szDown.Format(_T(%lf), dz);sztod(m_szDown);m_dLeft = dz;m_dRight = 0;break;case 3:m_dRight = _tcstod(m_szDown, NULL);dz = m_dLeft * m_dRight;m_szDown.Format(_T(%lf), dz);sztod(m_szDown);m_dLeft = dz;m_dRight = 0;break;case 4:m_dRight = _tcstod(m_szDown, NULL);dz = m_dLeft / m_dRight;m_szDown.Format(_T(%lf), dz);sztod(m_szDown);m_dLeft = dz;m_dRight = 0;break;void CcalDlg:OnBnClickedC()/C按钮把输入全部清空,并把记录的输入字符串也清空,就是仿window计算器的m_szUp=m_szUp.Mid(0, m_szUp.GetLength() - m_szDown.GetLength();m_szDown.Empty();SetDlgItemText(IDC_UP, m_szUp);SetDlgItemText(IDC_DOWN, m_szDown);CEdit* pedit = (CEdit*)GetDlgItem(IDC_UP);pedit-LineScroll(pedit-GetLineCount();void CcalDlg:OnBnClickedDelete()/按钮删除一位数,只能一位一位的删除输入字符串if (m_szDown.GetLength() != 0)m_szDown = m_szDown.Mid(0, m_szDown.GetLength() - 1);m_szUp = m_szUp.Mid(0, m_szUp.GetLength() - 1);SetDlgItemText(IDC_UP, m_szUp);SetDlgItemText(IDC_DOWN, m_szDown);CEdit* pedit = (CEdit*)GetDlgItem(IDC_UP);pedit-LineScroll(pedit-GetLineCount();void CcalDlg:OnBnClickedCe()/CE按钮把全部都清空m_dLeft = m_dRight = 0;m_szDown.Empty();m_szUp.Empty();SetDlgItemText(IDC_UP, m_szUp);SetDlgItemText(IDC_DOWN, m_szDown);void CcalDlg:OnBnClickedOne()/按钮1,每次点击按钮把按钮代表的值添加到m_szDown,m_szUp字符串中m_szDown += 1;m_szUp += 1;SetDlgItemText(IDC_UP, m_szUp);SetDlgItemText(IDC_DOWN, m_szDown);/把字符串设置到编辑框中CEdit* pedit = (CEdit*)GetDlgItem(IDC_UP);/这两句非常重要,作用是每次把字符串输入到编辑框,就把编辑框滚动条下拉到底部pedit-LineScroll(pedit-GetLineCount();/网上也没找到比较好的答案,只能每次添加文本的时候,带上这两句/ TODO: 在此添加控件通知处理程序代码void CcalDlg:OnBnClickedTwo()/按钮2,注释同上m_szDown += 2;m_szUp += 2;SetDlgItemText(IDC_UP, m_szUp);SetDlgItemText(IDC_DOWN, m_szDown);CEdit* pedit = (CEdit*)GetDlgItem(IDC_UP);pedit-LineScroll(pedit-GetLineCount();/ TODO: 在此添加控件通知处理程序代码void CcalDlg:OnBnClickedThree()/按钮3,注释同上m_szDown += 3;m_szUp += 3;SetDlgItemText(IDC_UP, m_szUp);SetDlgItemText(IDC_DOWN, m_szDown);CEdit* pedit = (CEdit*)GetDlgItem(IDC_UP);pedit-LineScroll(pedit-GetLineCount();/ TODO: 在此添加控件通知处理程序代码void CcalDlg:OnBnClickedFour()/按钮4,注释同上m_szDown += 4;m_szUp += 4;SetDlgItemText(IDC_UP, m_szUp);SetDlgItemText(IDC_DOWN, m_szDown);CEdit* pedit = (CEdit*)GetDlgItem(IDC_UP);pedit-LineScroll(pedit-GetLineCount();/ TODO: 在此添加控件通知处理程序代码void CcalDlg:OnBnClickedFive()/按钮5,注释同上m_szDown += 5;m_szUp += 5;SetDlgItemText(IDC_UP, m_szUp);SetDlgItemText(IDC_DOWN, m_szDown);CEdit* pedit = (CEdit*)GetDlgItem(IDC_UP);pedit-LineScroll(pedit-GetLineCount();/ TODO: 在此添加控件通知处理程序代码void CcalDlg:OnBnClickedSix()/按钮6,注释同上m_szDown += 6;m_szUp += 6;SetDlgItemText(IDC_UP, m_szUp);SetDlgItemText(IDC_DOWN, m_szDown);CEdit* pedit = (CEdit*)GetDlgItem(IDC_UP);pedit-LineScroll(pedit-GetLineCount();/ TODO: 在此添加控件通知处理程序代码void CcalDlg:OnBnClickedSeven()/按钮7,注释同上m_szDown += 7;m_szUp += 7;SetDlgItemText(IDC_UP, m_szUp);SetDlgItemText(IDC_DOWN, m_szDown);CEdit* pedit = (CEdit*)GetDlgItem(IDC_UP);pedit-LineScroll(pedit-GetLineCount();/ TODO: 在此添加控件通知处理程序代码void CcalDlg:OnBnClickedEnght()/按钮8,注释同上m_szDown += 8;m_szUp += 8;SetDlgItemText(IDC_UP, m_szUp);CEdit* pedit = (CEdit*)GetDlgItem(IDC_UP);pedit-LineScroll(pedit-GetLineCount();SetDlgItemText(IDC_DOWN, m_szDown);/ TODO: 在此添加控件通知处理程序代码void CcalDlg:OnBnClickedNine()/按钮9,注释同上m_szDown += 9;m_szUp += 9;SetDlgItemText(IDC_UP, m_szUp);SetDlgItemText(IDC_DOWN, m_szDown);CEdit* pedit = (CEdit*)GetDlgItem(IDC_UP);pedit-LineScroll(pedit-GetLineCount();/ TODO: 在此添加控件通知处理程序代码void CcalDlg:OnBnClickedNull()/按钮0,注释同上m_szDown += 0;m_szUp += 0;SetDlgItemText(IDC_UP, m_szUp);SetDlgItemText(IDC_DOWN,m_szDown);CEdit* pedit = (CEdit*)GetDlgItem(IDC_UP);pedit-LineScroll(pedit-GetLineCount();/ TODO: 在此添加控件通知处理程序代码void CcalDlg:OnBnClickedDot()/小数点按钮,和数字按钮差不多,差别就是判断,数据是否存在小数点if (m_bDot)/判断在一个数里是否已经存在小数点,1为没存在,0为存在m_szDown += .;m_szUp += .;SetDlgItemText(IDC_UP, m_szUp);SetDlgItemText(IDC_DOWN, m_szDown);CEdit* pedit = (CEdit*)GetDlgItem(IDC_UP);pedit-LineScroll(pedit-GetLineCount();m_bDot = 0;/设置为0 ,小数点已经存在elseAfxMessageBox(_T(小数点只能有一位!);void CcalDlg:OnBnClickedRemove()/除法按钮if (m_nCount != 0)/判断之前是否已经有运算符OnBnClickedOk();/存在就调用OnBnClickedOk()就是值m_dRight = _tcstod(m_szDown, NULL);/把输入字符串转到右值中就可以进行连续运算elsem_dLeft = _tcstod(m_szDown, NULL);/否则就是转换到左值m_szDown = /;m_szUp += /;/把运算符添加到字符串中SetDlgItemText(IDC_UP, m_szUp);SetDlgItemText(IDC_DOWN, m_szDown);CEdit* pedit = (CEdit*)GetDlgItem(IDC_UP);pedit-LineScroll(pedit-GetLineCount();m_nCount = 4;/上面说过除为4,赋值为4,以用于下次计算m_bDot = 1;/现在在计算就是一个数据已经输入完,把判断小数点值赋值1,让下次输入可以输入小数点m_szDown.Empty();void CcalDlg:OnBnClickedMultiply()/乘法按钮,可参考上面的,只是变了运算符if (m_nCount != 0)OnBnClickedOk();m_dRight = _tcstod(m_szDown, NULL);elsem_dLeft = _tcstod(m_szDown, NULL);m_szDown = *;m_szUp += *;SetDlgItemText(IDC_UP, m_szUp);SetDlgItemText(IDC_DOWN, m_szDown);CEdit* pedit = (CEdit*)GetDlgItem(IDC_UP);pedit-LineScroll(pedit-GetLineCount();m_nCount = 3;m_bDot = 1;m_szDown.Empty();void CcalDlg:OnBnClickedMinus()/减法按钮可以参考上面的if (m_nCount != 0)OnBnClickedOk();m_dRight = _tcstod(m_szDown, NULL);elsem_dLeft = _tcstod(m_szDown, NULL);m_szDown = -;m_szUp += -;SetDlgItemText(IDC_UP, m_szUp);SetDlgItemText(IDC_DOWN, m_szDown);CEdit* pedit = (CEdit*)GetDlgItem(IDC_UP);pedit-LineScroll(pedit-GetLineCount();m_nCount = 2;m_bDot = 1;m_szDown.Empty();void CcalDlg:OnBnClickedAdd()/加发按钮同上if (m_nCount != 0)OnBnClickedOk();m_dRight = _tcstod(m_szDown, NULL);elsem_dLeft = _tcstod(m_szDown, NULL);m_szDown =+;m_szUp += +;SetDlgItemText(IDC_UP, m_szUp);SetDlgItemText(IDC_DOWN, m_szDown);CEdit* pedit = (CEdit*)GetDlgItem(IDC_UP);pedit-LineScroll(pedit-GetLineCount();m_nCount = 1;m_bDot = 1;m_szDown.Empty();double CcalDlg:sztod(CString str)/定义的一个函数用于去掉小数位的0,和整数的后面的小数点/函数不清楚的参考MSDNwhile (str.Mid(str.GetLength() - 1).Compare(_T(0) = 0)/去掉小数点后末尾的0str= str.Mid(0, str.GetLength() - 1);if (str.Mid(str.GetLength() - 1).Compare(_T(.) = 0)/如果最后一位为小数点去除小数点str = str.Mid(0, str.GetLength() - 1);m_szDown.Empty();m_szUp.Format(_T(%s=%s), m_szUp, str);/把去除好的数值当做字符串进行数值SetDlgItemText(IDC_UP, m_szUp);SetDlgItemText(IDC_DOWN, m_szDown);m_szUp += rn;/换行m_szDown.Empty();/清空m_nCount = 0;/运算符号清空CEdit* pedit = (CEdit*)GetDlgItem(IDC_UP);pedit-LineScroll(pedit-GetLineCount(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论