程式給設計 MFC寫簡單的計算器
自己寫這個也花了不少時間,當時做的時候在網上找了一些,不過很是不滿意。給大家分享一些我做的,有一些bug,大家可以自己試著改一下。比如我用的cstring做的,按下等於後再按數字鍵它不會清零。1+1=2,再按1變成21.
環境vs2013。
改圖示什麼的網上應該有,我就不放了。
然後底下就是直接放程式碼:
`//標頭檔案程式碼
// MyCalculateDlg.h : 標頭檔案
//
#pragma once
#include “afxwin.h”
// CMyCalculateDlg 對話方塊
class CMyCalculateDlg : public CDialogEx
{
// 構造
public:
CMyCalculateDlg(CWnd* pParent = NULL); // 標準建構函式
// 對話方塊資料
enum { IDD = IDD_MYCALCULATE_DIALOG };
//0 代表+ 1代表- 2代表* 3代表÷
int flag_num = -1;
void SaveFirstValue();
void Calculator();
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:
afx_msg void OnBnClickedButton4();
afx_msg void OnBnClickedButton3();
private:
CString m_value;
//m_value是建立框框時,右鍵新增變數,然後類別control改成value
//起名m_value
double num1 = 0;
double num2 = 0;
這兩個全域性變數,儲存資料的。
//CALCULATOR_FLAG mFlag;
public:
afx_msg void OnBnClickedButton15();
afx_msg void OnBnClickedButton14();
afx_msg void OnBnClickedButton16();
afx_msg void OnBnClickedButton11();
afx_msg void OnBnClickedButton10();
afx_msg void OnBnClickedButton12();
afx_msg void OnBnClickedButton7();
afx_msg void OnBnClickedButton6();
afx_msg void OnBnClickedButton8();
afx_msg void OnBnClickedButton5();
afx_msg void OnBnClickedButton19();
afx_msg void OnBnClickedButton18();
afx_msg void OnBnClickedButton9();
afx_msg void OnBnClickedButton13();
afx_msg void OnBnClickedButton17();
afx_msg void OnBnClickedButton21();
afx_msg void OnBnClickedButton2();
afx_msg void OnBnClickedButton20();
afx_msg void OnBnClickedButton22();
afx_msg void OnBnClickedButton1();
afx_msg void OnBnClickedButton23();
afx_msg void OnBnClickedButton24();
};
底下就是cpp的程式碼:
// MyCalculateDlg.cpp : 實現檔案
//
#include “stdafx.h”
#include “MyCalculate.h”
#include “MyCalculateDlg.h”
#include “afxdialogex.h”
#include
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
int buttom = -1;
//因為連著按兩次等於會出現bug,所以做一個開關
//判斷是否按過某按鈕
//bool flag = false;
//判斷第一次按過某按鈕
bool first_flag = false;
// 用於應用程式“關於”選單項的 CAboutDlg 對話方塊
class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();
// 對話方塊資料
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支援
// 實現
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()
// CMyCalculateDlg 對話方塊
- CMyCalculateDlg::CMyCalculateDlg(CWnd* pParent / =NULL/)
-
CDialogEx(CMyCalculateDlg::IDD, pParent)
, m_value(_T(""))
{
m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
/這裡就是我說的改圖示的程式碼部分/
}
void CMyCalculateDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT1, m_value);
}
BEGIN_MESSAGE_MAP(CMyCalculateDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON4, &CMyCalculateDlg::OnBnClickedButton4)
ON_BN_CLICKED(IDC_BUTTON3, &CMyCalculateDlg::OnBnClickedButton3)
ON_BN_CLICKED(IDC_BUTTON15, &CMyCalculateDlg::OnBnClickedButton15)
ON_BN_CLICKED(IDC_BUTTON14, &CMyCalculateDlg::OnBnClickedButton14)
ON_BN_CLICKED(IDC_BUTTON16, &CMyCalculateDlg::OnBnClickedButton16)
ON_BN_CLICKED(IDC_BUTTON11, &CMyCalculateDlg::OnBnClickedButton11)
ON_BN_CLICKED(IDC_BUTTON10, &CMyCalculateDlg::OnBnClickedButton10)
ON_BN_CLICKED(IDC_BUTTON12, &CMyCalculateDlg::OnBnClickedButton12)
ON_BN_CLICKED(IDC_BUTTON7, &CMyCalculateDlg::OnBnClickedButton7)
ON_BN_CLICKED(IDC_BUTTON6, &CMyCalculateDlg::OnBnClickedButton6)
ON_BN_CLICKED(IDC_BUTTON8, &CMyCalculateDlg::OnBnClickedButton8)
ON_BN_CLICKED(IDC_BUTTON5, &CMyCalculateDlg::OnBnClickedButton5)
ON_BN_CLICKED(IDC_BUTTON19, &CMyCalculateDlg::OnBnClickedButton19)
ON_BN_CLICKED(IDC_BUTTON18, &CMyCalculateDlg::OnBnClickedButton18)
ON_BN_CLICKED(IDC_BUTTON9, &CMyCalculateDlg::OnBnClickedButton9)
ON_BN_CLICKED(IDC_BUTTON13, &CMyCalculateDlg::OnBnClickedButton13)
ON_BN_CLICKED(IDC_BUTTON17, &CMyCalculateDlg::OnBnClickedButton17)
ON_BN_CLICKED(IDC_BUTTON21, &CMyCalculateDlg::OnBnClickedButton21)
ON_BN_CLICKED(IDC_BUTTON2, &CMyCalculateDlg::OnBnClickedButton2)
ON_BN_CLICKED(IDC_BUTTON20, &CMyCalculateDlg::OnBnClickedButton20)
ON_BN_CLICKED(IDC_BUTTON22, &CMyCalculateDlg::OnBnClickedButton22)
ON_BN_CLICKED(IDC_BUTTON1, &CMyCalculateDlg::OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON23, &CMyCalculateDlg::OnBnClickedButton23)
ON_BN_CLICKED(IDC_BUTTON24, &CMyCalculateDlg::OnBnClickedButton24)
END_MESSAGE_MAP()
// CMyCalculateDlg 訊息處理程式
BOOL CMyCalculateDlg::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); // 設定小圖示
// TODO: 在此新增額外的初始化程式碼
return TRUE; // 除非將焦點設定到控制元件,否則返回 TRUE
}
void CMyCalculateDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
// 如果向對話方塊新增最小化按鈕,則需要下面的程式碼
// 來繪製該圖示。 對於使用文件/檢視模型的 MFC 應用程式,
// 這將由框架自動完成。
void CMyCalculateDlg::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 CMyCalculateDlg::OnQueryDragIcon()
{
return static_cast(m_hIcon);
}
//退格
void CMyCalculateDlg::OnBnClickedButton4()
{
// TODO: 在此新增控制元件通知處理程式程式碼
UpdateData(true);
if (!m_value.IsEmpty())
{
m_value = m_value.Left(m_value.GetLength() - 1);
}
UpdateData(false);
}
//開方
void CMyCalculateDlg::OnBnClickedButton3()
{
// TODO: 在此新增控制元件通知處理程式程式碼
UpdateData(true);
num1 = _wtof(m_value);
double f = sqrt(num1);
if (f - (int)f <= 1e-5)
{
m_value.Format(L"%d", (int)f);
}
else
{
m_value.Format(L"%f", f);
}
UpdateData(false);
}
//數字1
void CMyCalculateDlg::OnBnClickedButton15()
{
// TODO: 在此新增控制元件通知處理程式程式碼
UpdateData(true);
m_value += L"1";
UpdateData(false);
buttom = 0;
}
//2
void CMyCalculateDlg::OnBnClickedButton14()
{
// TODO: 在此新增控制元件通知處理程式程式碼
UpdateData(true);
m_value += L"2";
UpdateData(false);
buttom = 0;
}
//3
void CMyCalculateDlg::OnBnClickedButton16()
{
// TODO: 在此新增控制元件通知處理程式程式碼
UpdateData(true);
m_value += L"3";
UpdateData(false);
buttom = 0;
}
//4
void CMyCalculateDlg::OnBnClickedButton11()
{
// TODO: 在此新增控制元件通知處理程式程式碼
UpdateData(true);
m_value += L"4";
UpdateData(false);
buttom = 0;
}
//5
void CMyCalculateDlg::OnBnClickedButton10()
{
// TODO: 在此新增控制元件通知處理程式程式碼
UpdateData(true);
m_value += L"5";
UpdateData(false);
buttom = 0;
}
//6
void CMyCalculateDlg::OnBnClickedButton12()
{
// TODO: 在此新增控制元件通知處理程式程式碼
UpdateData(true);
m_value += L"6";
UpdateData(false);
buttom = 0;
}
//7
void CMyCalculateDlg::OnBnClickedButton7()
{
// TODO: 在此新增控制元件通知處理程式程式碼
UpdateData(true);
m_value += L"7";
UpdateData(false);
buttom = 0;
}
//8
void CMyCalculateDlg::OnBnClickedButton6()
{
// TODO: 在此新增控制元件通知處理程式程式碼
UpdateData(true);
m_value += L"8";
UpdateData(false);
buttom = 0;
}
//9
void CMyCalculateDlg::OnBnClickedButton8()
{
// TODO: 在此新增控制元件通知處理程式程式碼
UpdateData(true);
m_value += L"9";
UpdateData(false);
buttom = 0;
}
//歸零
void CMyCalculateDlg::OnBnClickedButton5()
{
// TODO: 在此新增控制元件通知處理程式程式碼
UpdateData(true);
m_value = L"";
flag_num = -1;
num1 = 0;
num2 = 0;
first_flag = false;
UpdateData(false);
buttom = 0;
}
//0
void CMyCalculateDlg::OnBnClickedButton19()
{
// TODO: 在此新增控制元件通知處理程式程式碼
UpdateData(true);
m_value += L"0";
UpdateData(false);
buttom = 0;
}
//小數點
void CMyCalculateDlg::OnBnClickedButton18()
{
// TODO: 在此新增控制元件通知處理程式程式碼
UpdateData(true);
//如果沒有小數點就加上小數點,如果有就忽略
if (-1 == m_value.Find(L’.’))
{
m_value += L".";
}
UpdateData(false);
}
void CMyCalculateDlg::SaveFirstValue()
{
UpdateData(true);
num1 = _wtof(m_value);
m_value = L"";
UpdateData(false);
}
// ++++++
void CMyCalculateDlg::OnBnClickedButton9()
{
// TODO: 在此新增控制元件通知處理程式程式碼
if (first_flag != false)
{
OnBnClickedButton20();
}
UpdateData(true);
SaveFirstValue();
flag_num = 0;
first_flag = true;
}
// ------
void CMyCalculateDlg::OnBnClickedButton13()
{
// TODO: 在此新增控制元件通知處理程式程式碼
if (first_flag != false)
{
OnBnClickedButton20();
}
UpdateData(true);
SaveFirstValue();
flag_num = 1;
first_flag = true;
}
// ******
void CMyCalculateDlg::OnBnClickedButton17()
{
// TODO: 在此新增控制元件通知處理程式程式碼
//flag = false;
if (first_flag != false)
{
OnBnClickedButton20();
}
UpdateData(true);
SaveFirstValue();
flag_num = 2;
first_flag = true;
}
// 除法
void CMyCalculateDlg::OnBnClickedButton21()
{
// TODO: 在此新增控制元件通知處理程式程式碼
if (first_flag != false)
{
OnBnClickedButton20();
}
UpdateData(true);
SaveFirstValue();
flag_num = 3;
first_flag = true;
}
//平方
void CMyCalculateDlg::OnBnClickedButton2()
{
// TODO: 在此新增控制元件通知處理程式程式碼
UpdateData(true);
num1 = _wtof(m_value);
double f = num1 * num1;
if (f - (int)f <= 1e-5)
{
m_value.Format(L"%d",(int)f);
}
else
{
m_value.Format(L"%f",f);
}
UpdateData(false);
}
// =======
void CMyCalculateDlg::OnBnClickedButton20()
{
// TODO: 在此新增控制元件通知處理程式程式碼
if (flag_num != 0 && flag_num != 1 && flag_num != 2 && flag_num != 3)
{
flag_num = _wtof(m_value);
}
else
Calculator();
UpdateData(false);
}
void CMyCalculateDlg::Calculator()
{
UpdateData(true);
num2 = _wtof(m_value);
if (buttom == 0)
{
double result = 0.0f;
switch (flag_num)
{
case 0:
result = num1 + num2;
break;
case 1:
result = num1 - num2;
break;
case 2:
result = num1 * num2;
break;
case 3:
if (num2 == 0.0f)
{
MessageBox(_T("錯誤"));
result = num1;
}
else
{
result = num1 / num2;
}
break;
default:
break;
}
//如果浮點數是整數
if (result - int(result) <= 1e-5)
{
m_value.Format(L"%d", (int)result);
}
else
{
m_value.Format(L"%f", result);
}
}
UpdateData(false);
buttom = 1;
}
void CMyCalculateDlg::OnBnClickedButton22()
{
// TODO: 在此新增控制元件通知處理程式程式碼
UpdateData(true);
num1 = _wtof(m_value);
double f = sin(num1);
if (f - (int)f <= 1e-5)
{
m_value.Format(L"%d", (int)f);
}
else
{
m_value.Format(L"%f", f);
}
UpdateData(false);
}
//cos
void CMyCalculateDlg::OnBnClickedButton1()
{
// TODO: 在此新增控制元件通知處理程式程式碼
UpdateData(true);
num1 = _wtof(m_value);
double f = cos(num1);
if (f - (int)f <= 1e-5)
{
m_value.Format(L"%d", (int)f);
}
else
{
m_value.Format(L"%f", f);
}
UpdateData(false);
}
// tan
void CMyCalculateDlg::OnBnClickedButton23()
{
// TODO: 在此新增控制元件通知處理程式程式碼
UpdateData(true);
num1 = _wtof(m_value);
double f = tan(num1);
if (f - (int)f <= 1e-5)
{
m_value.Format(L"%d", (int)f);
}
else
{
m_value.Format(L"%f", f);
}
UpdateData(false);
}
//倒數
void CMyCalculateDlg::OnBnClickedButton24()
{
// TODO: 在此新增控制元件通知處理程式程式碼
UpdateData(true);
num1 = _wtof(m_value);
double f = 1/num1;
if (f - (int)f <= 1e-5)
{
m_value.Format(L"%d", (int)f);
}
else
{
m_value.Format(L"%f", f);
}
UpdateData(false);
}
`