利用MFC編寫計算器


端午節這兩天沒什么事,就用MFC寫了一個簡單的計算器,界面做的也比較簡單,如下圖1,可以進行簡單的加、減、乘和除功能,小數點顯示這塊做的不是很好,比如輸入1.2,不會一個個的顯示,而是先顯示“1”,后同時顯示“.2”,還有就是遇到0.00時,顯示的也不夠人性化,哎,就這樣吧。。。

                                                                                                              圖1

1、建立工程:New -> Projects,選擇Win32 MFC AppWizard(exe),並輸入工程(counter)名字及設置好路徑,點擊OK,選擇“Dialog based”,基於對話框,直接點finish。

2、將對話框進行簡單的處理,把無關的按鈕刪掉,添加自己的按鈕及Edit Box,如圖2。

                                                                          圖2

3、對按鈕及Edit Box進行屬性設置,比如按鈕1屬性設置為“IDC_BUTTON_1”,2設置為IDC_BUTTON_2,一直類推。Edit Box不僅要設置ID(IDC_DISPLAY),還要設置相關連的成員變量,右鍵,選擇ClasssWizard..,在點擊Add Variable..,這里設置為double m_display。

4、對每個按鈕添加消息處理函數,只需雙擊該按鈕,按照提示點OK,就進入到了該函數入口處。

  1設置void CCounterDlg::OnButton1();

  2設置void CCounterDlg::OnButton2();

  ....

  其他類推。

      加 void CCounterDlg::OnButtonAdd();

  減void CCounterDlg::OnButtonSub();

      乘void CCounterDlg::OnButtonMult();

      除void CCounterDlg::OnButtonDiv();

      = void CCounterDlg::OnButtonEqual();

5、定義成員變量

 int count;  //計數
 BOOL dot_flg; //小數點標志
 BOOL continue_flg;//沒按運算符,是否一直連續按數字按鈕標志
 BOOL str_flag;//有沒按運算符標志
 CString str;//記錄當前按的運算符
 double result; //num1和num2運算的結果
 double num1; //按運算符之前的第一個數

 double num2; //按運算符之后的第二個數

6、定義成員函數,該函數主要是對按下的數字進行疊加,跟蹤num1和num2:

double CCounterDlg::buttonDownNum(int numSize);

7、當按下之后數字要及時顯示出來,需要用到:

UpdateData(FALSE);  //該函數是對Edit Box的內容進行更新,FALSE是有內部數成員的數據值更新到界面上,TRUE是從界面上更新到內部的數據成員上。

GetDlgItem(IDC_DISPLAY)->SetWindowText("小數點");//可以利用這個語句直接在Edit Box上顯示內容“小數點”。只是提示自己也可以用這個來顯示,程序中注釋掉了。

8、代碼實現:

//貼出自己添加的代碼,其他代碼默認有的
#include "math.h"

// CCounterDlg dialog
CCounterDlg::CCounterDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CCounterDlg::IDD, pParent)
{
    //{{AFX_DATA_INIT(CCounterDlg)
    //初始化
    m_display = 0.0;
    num1 = 0;
    num2 = 0;
    result = 0.0;
    str = "";
    str_flag = FALSE;
    continue_flg = FALSE;
    downDot = FALSE;
    count = 1;

    //}}AFX_DATA_INIT
    // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

double CCounterDlg::buttonDownNum(int numSize)
{
    if (!str_flag) //運算符沒有被按下,那就是num1
    {
        if (!continue_flg) //按下一次
        {
            num1 = numSize;
            continue_flg =TRUE;
        }
        else
        {
            num1 = num1*pow(10,count) + numSize;
            if (downDot)
            {
                num1 = num1/(pow(10,count));
                count++;
            }
        }
        
        return num1;
    }
    else  //有運算符被按下
    {
        if (!continue_flg) //是否連續按下
        {
            num2 = numSize;
            continue_flg =TRUE;
        }
        else
        {
            num2 = num2*pow(10,count) + numSize;
            if (downDot)
            {
                num2 = num2/(pow(10,count));
                count++;
            }
        }
        
        return num2;
    }
}


void CCounterDlg::OnButton0() 
{
    // TODO: Add your control notification handler code here
    
    m_display = buttonDownNum(0);    
    UpdateData(FALSE);    
}

void CCounterDlg::OnButton1() 
{
    // TODO: Add your control notification handler code here
    m_display = buttonDownNum(1);
    UpdateData(FALSE);
}

void CCounterDlg::OnButton2() 
{
    // TODO: Add your control notification handler code here
    
    m_display = buttonDownNum(2);
    
    UpdateData(FALSE);
}

void CCounterDlg::OnButton3() 
{
    // TODO: Add your control notification handler code here
    m_display = buttonDownNum(3);
    UpdateData(FALSE);
}

void CCounterDlg::OnButton4() 
{
    // TODO: Add your control notification handler code here
    m_display = buttonDownNum(4);
    UpdateData(FALSE);
}

void CCounterDlg::OnButton5() 
{
    // TODO: Add your control notification handler code here
    m_display = buttonDownNum(5);
    UpdateData(FALSE);
}

void CCounterDlg::OnButton6() 
{
    // TODO: Add your control notification handler code here
    m_display = buttonDownNum(6);
    UpdateData(FALSE);
}

void CCounterDlg::OnButton7() 
{
    // TODO: Add your control notification handler code here
    m_display = buttonDownNum(7);
    UpdateData(FALSE);
}

void CCounterDlg::OnButton8() 
{
    // TODO: Add your control notification handler code here
    m_display = buttonDownNum(8);
    UpdateData(FALSE);
}

void CCounterDlg::OnButton9() 
{
    // TODO: Add your control notification handler code here
    m_display = buttonDownNum(9);
    UpdateData(FALSE);
}

void CCounterDlg::OnButtonDot() //小數點
{
    // TODO: Add your control notification handler code here
    downDot = TRUE; 
//    GetDlgItem(IDC_DISPLAY)->SetWindowText("小數點"); //可以利用該函數在編輯框中顯示信息
}

void CCounterDlg::OnButtonAdd() //
{
    // TODO: Add your control notification handler code here
    str = "+";    
    str_flag = TRUE;
    continue_flg = FALSE;
    downDot = FALSE;
    count = 1;
    UpdateData(FALSE);
}

void CCounterDlg::OnButtonSub()  //
{
    // TODO: Add your control notification handler code here
    str = "-";    
    str_flag = TRUE;
    continue_flg = FALSE;
    downDot = FALSE;
    count = 1;
    UpdateData(FALSE);
}

void CCounterDlg::OnButtonMult()  //
{
    // TODO: Add your control notification handler code here
    str = "*";    
    str_flag = TRUE;
    continue_flg = FALSE;
    downDot = FALSE;
    count = 1;
    UpdateData(FALSE);
}

void CCounterDlg::OnButtonDiv()  //
{
    // TODO: Add your control notification handler code here
    str = "/";    
    str_flag = TRUE;
    continue_flg = FALSE;
    downDot = FALSE;
    count = 1;
    UpdateData(FALSE);
}

void CCounterDlg::OnButtonEqual() 
{
    // TODO: Add your control notification handler code here
    if(str == "+")
        result = num1 + num2;
    else if(str == "-")
        result = num1 - num2;
    else if(str == "*")
        result = num1 * num2;
    else if(str == "/")
    {
        result = double(num1) / double(num2);
    }

    num1 = result;
    m_display = result;
    str_flag = FALSE;
    continue_flg = FALSE;
    downDot = FALSE;
    count = 1;
    UpdateData(FALSE);
}

void CCounterDlg::OnButtonClear() 
{
    // TODO: Add your control notification handler code here

    num1 = 0;
    num2 = 0;
    m_display = 0;
    continue_flg = FALSE;
    str_flag = FALSE;
    downDot = FALSE;
    count = 1;
    UpdateData(FALSE);
}
View Code

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM