因为接触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,所以后期会考虑写一个功能更加完善的计算器=。=