因为接触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_TIME enum { 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_TIME enum { IDD = IDD_ABOUTBOX };#endif protected: 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,所以后期会考虑写一个功能更加完善的计算器=。=
新闻热点
疑难解答