MFC簡易計算器實現
阿新 • • 發佈:2019-02-01
因為接觸MFC沒有多長時間,所以需要寫一些小程式來熟悉基本操作,這次寫的是一個簡易計算器。
外觀:
程式下載連結:
寫作思路:
這裡感謝 逆風微光 博主的博文,基本參照他的思路
由於實現的功能並不多,所以只定義了一個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);
這裡感謝 守望者在這裡 博主的博文。
文章地址:
由於簡易計算器還存在一些bug,所以後期會考慮寫一個功能更加完善的計算器=。=