因為接觸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,所以后期會考慮寫一個功能更加完善的計算器=。=
新聞熱點
疑難解答