文档视界 最新最全的文档下载
当前位置:文档视界 › MFC做的一个简单的计算器

MFC做的一个简单的计算器

MFC做的一个简单的计算器
MFC做的一个简单的计算器

目录

一.设计题目。 (1)

二.设计目的和内容。 (1)

三.基本功能描述。 (2)

四.设计思路。 (2)

五.软件设计:设计步骤、界面设计、关键功能的实现。 (3)

a)设计步骤。 (3)

b)界面设计。 (4)

c)关键功能的实现。 (5)

六.附录。 (8)

一.设计题目。

小型计算器程序的编写.

二.设计目的和内容。

【设计目的】

1学习Visual C++的MFC开发程序的步骤。

2综合运用所学的类、继承和多态的知识。

3进一步掌握程序的调试方法。

【设计内容】

1利用MFC的向导,创建基于对话框的应用程序,添加按钮、编辑框等控件;

第1页

2实现算术加、减、乘、除等运算;

3选做:三角函数的运算、对数运算、指数运算、进制转换等。

三.基本功能描述。

具备整型数据、浮点型数据的算术(加、减、乘、除)运算功能。依次输入第一个运算数、运算符(+,-,*,/)、第二个运算数,然后输出结果,按‘C E’键清屏。

四.设计思路。

a)首先考虑对所有按键分为两类,数字类和符号类。0,1,2,3,4,5,6,7,8,9为

数字类,+,-,*,/为符号类。数字在计算过程中最多需要保存两个,所以定义了两个double型变量num1和num2来进行存储,符号需要一个char型变量cal来存储。

b)为显示数字的编辑框设立一个double型的关联变量m_Num,为显示符号的编

辑框设立一个CString型的关联变量m_result,设立一个int型的小数点标志dotflag,设立一个int型的键入数字标志numflag,设立一个long型的小数部分权值quan,最后为了防止用户输入错误,设立一个判断输入是否为数字的int型标志mark。

c)然后考虑到在计算过程中num1和num2的储存状态有三种,num1==0和

num2==0,也就是程序开始运行还没有开始录入数字的状态;num1!=0和num2==0,也就是第一个数字已经录入,第二个数字还没有录入的状态这时候把m_Num的值赋给num1,m_Num归零;num1!=0和num2!=0,把m_Num的值赋给num2,m_Num归零,令m_Num等于num1和num2合并后的值。

五.软件设计:设计步骤、界面设计、关键功能的实现。

a)设计步骤。

1.添加头文件。

将test.cpp改为test.h将其添加到计算器Dlg.cpp : implementation file中,如下:#include "test.h"。

2.成员函数及其释义。

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

END_MESSAGE_MAP()

CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/)

: CDialog(CTestDlg::IDD, pParent)

{

m_Num =0.0;

m_result = _T("");

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

void CTestDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

DDX_Text(pDX, IDC_EDIT_DISPLAY, m_Num);

DDX_Text(pDX, IDC_EDIT2_SIGNS, m_result);}

BEGIN_MESSAGE_MAP(CTestDlg, CDialog)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_BN_CLICKED(IDC_BUTTON_NUM1, OnButtonNum1)

ON_BN_CLICKED(IDC_BUTTON_NUM2, OnButtonNum2)

ON_BN_CLICKED(IDC_BUTTON_NUM3, OnButtonNum3)

ON_BN_CLICKED(IDC_BUTTON_NUM4, OnButtonNum4)

ON_BN_CLICKED(IDC_BUTTON_NUM5, OnButtonNum5)

ON_BN_CLICKED(IDC_BUTTON_NUM6, OnButtonNum6)

ON_BN_CLICKED(IDC_BUTTON_NUM7, OnButtonNum7)

ON_BN_CLICKED(IDC_BUTTON_NUM8, OnButtonNum8)

ON_BN_CLICKED(IDC_BUTTON_NUM9, OnButtonNum9)

ON_BN_CLICKED(IDC_BUTTON_ZHENGFU, OnButtonZhengfu)

ON_BN_CLICKED(IDC_BUTTON_DENGYU, OnButtonDengyu)

ON_BN_CLICKED(IDC_BUTTON_NUM0, OnButtonNum0)

ON_BN_CLICKED(IDC_BUTTON_CLEAR, OnButtonClear)

ON_BN_CLICKED(IDC_BUTTON_MULTIPLY, OnButtonMultiply)

ON_BN_CLICKED(IDC_BUTTON_DIVIDE, OnButtonDivide)

ON_BN_CLICKED(IDC_BUTTON_PLUS, OnButtonPlus)

ON_BN_CLICKED(IDC_BUTTON_MINUS, OnButtonMinus)

ON_BN_CLICKED(IDC_BUTTON_DOT, OnButtonDot)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

b)界面设计。

1.仿照Windows附件里面的计算器,在资源视图中画好界面,如图1:

图1

2.修改每个button的属性,如图2:

图2

3.修改每个button的处理机制,如图:

在类向导Classwizard窗口中进行,如下图3:

图3其他button按钮的修改类似。

4.修改每个edit的类型和名称,如图4:

在类向导Classwizard窗口中进行:

图4单击Add Variable按钮,在如下窗口中进行修改,如图5:

图5

另一个edit的修改类似。

c)关键功能的实现。

1.OnButtonNum8()按钮的处理函数。

void CTestDlg::OnButtonNum8()

{

if(dotflag==1)

{

quan= quan*10;

m_Num += 8 / (double)quan;

}

else

{

if(numflag==1)

{

m_Num = m_Num * 10 + 8;

}

else m_Num = 8;

}

numflag = 1;

mark=1;

UpdateData(FALSE);

}

其他数字按钮的处理函数均与其类似。2.OnButtonMultiply()按钮的处理函数。

void CTestDlg::OnButtonMultiply()

{

UpdateData();

num1 = m_Num;

cal = '*';

numflag = 0;

dotflag = 0;

quan = 1;

m_result='*';

mark=0;

UpdateData(FALSE);

}

其他符号按钮的处理函数均与其类似。3.OnButtonDot()按钮的处理函数。

void CTestDlg::OnButtonDot()

{

UpdateData();

dotflag = 1;

m_Num += 0.0;

m_result='.';

}

4.OnButtonClear()按钮的处理函数。

void CTestDlg::OnButtonClear()

{

UpdateData();

m_Num =0;

m_result=' ';

num1 = 0;

num2 = 0;

numflag=0;

dotflag=0;

quan=1;

mark=0;

UpdateData(FALSE);

}

5.OnButtonDengyu()按钮的处理函数。

void CTestDlg::OnButtonDengyu()

{

if(mark==1){

num2 = m_Num;

switch(cal)

{

case '+': m_Num = num1 + num2;cal=0;break;

case '-': m_Num = num1 - num2;cal=0; break;

case '*': m_Num = num1 * num2;cal=0;break;

case '/': m_Num = num1 / num2;cal=0; break;

}

numflag = 0;

dotflag = 0;

quan = 1;

UpdateData(FALSE);

}

else

MessageBox("error");

}

6.OnButtonZhengfu()按钮的处理函数。

void CTestDlg::OnButtonZhengfu()

{

UpdateData();

m_Num = 0-m_Num;

}

六.附录。

1.调试。

图6

图7

24/6

2.测试结果。

图8结果=4.

3.关键源代码。

void CTestDlg::OnButtonNum1()

{

if(dotflag==1)

{

quan=10*quan;

m_Num += 1 / (double)quan;

}

else

{

if(numflag==1)

{

m_Num = 10*m_Num+ 1;

}

else m_Num =1;

}

numflag = 1;

mark=1;

UpdateData(FALSE);

}

void CTestDlg::OnButtonNum2()

{

if(dotflag==1)

{

quan = quan*10;

m_Num += 2 / (double)quan;

}

else

{

if(numflag==1)

{

m_Num = m_Num * 10 + 2;

}

else m_Num = 2;

}

numflag = 1;

mark=1;

UpdateData(FALSE);

}

void CTestDlg::OnButtonNum3()

{

if(dotflag==1)

{

quan= quan*10;

m_Num += 3 / (double)quan;

}

else

{

if(numflag==1)

{

m_Num = m_Num * 10 + 3;

}

else m_Num = 3;

}

numflag = 1;

mark=1;

UpdateData(FALSE);

}

void CTestDlg::OnButtonNum4()

{

if(dotflag==1)

{

quan= quan*10;

m_Num += 4 / (double)quan;

}

else

{

if(numflag==1)

{

m_Num = m_Num * 10 + 4;

}

else m_Num = 4;

}

numflag = 1;

mark=1;

UpdateData(FALSE);

}

void CTestDlg::OnButtonNum5()

{

if(dotflag==1)

{

quan= quan*10;

m_Num += 5 / (double)quan;

}

else

{

if(numflag==1)

{

m_Num = m_Num * 10 + 5;

}

else m_Num = 5;

}

numflag = 1;

mark=1;

UpdateData(FALSE);

}

void CTestDlg::OnButtonNum6()

{

if(dotflag==1)

{

quan= quan*10;

m_Num += 6 / (double)quan;

}

else

{

if(numflag==1)

{

m_Num = m_Num * 10 + 6;

}

else m_Num = 6;

}

numflag = 1;

mark=1;

UpdateData(FALSE);

}

void CTestDlg::OnButtonNum7()

{

if(dotflag==1)

{

quan= quan*10;

m_Num += 7 / (double)quan;

}

else

{

if(numflag==1)

{

m_Num = m_Num * 10 + 7;

}

else m_Num = 7;

}

numflag = 1;

mark=1;

UpdateData(FALSE);

}

void CTestDlg::OnButtonNum8()

{

if(dotflag==1)

{

quan= quan*10;

m_Num += 8 / (double)quan;

}

else

{

if(numflag==1)

{

m_Num = m_Num * 10 + 8;

}

else m_Num = 8;

}

numflag = 1;

mark=1;

UpdateData(FALSE);

}

void CTestDlg::OnButtonNum9()

{

if(dotflag==1)

{

quan= quan*10;

m_Num += 9 / (double)quan;

}

else

{

if(numflag==1)

{

m_Num = m_Num * 10 + 9;

}

else m_Num = 9;

}

numflag = 1;

mark=1;

UpdateData(FALSE);

}

void CTestDlg::OnButtonNum0()

{

if(dotflag==1)

{

quan= quan*10;

m_Num += 0 / (double)quan;

}

else

{

if(numflag==1)

{

m_Num = m_Num * 10 + 0;

}

else m_Num = 0;

}

numflag = 1;

mark=1;

UpdateData(FALSE);

}

void CTestDlg::OnButtonZhengfu()

{

UpdateData();

m_Num = 0-m_Num;

UpdateData(FALSE);

}

void CTestDlg::OnButtonDengyu()

{

if(mark==1){

num2 = m_Num;

switch(cal)

{

case '+': m_Num = num1 + num2;cal=0;break;

case '-': m_Num = num1 - num2;cal=0; break;

case '*': m_Num = num1 * num2;cal=0;break;

case '/': m_Num = num1 / num2;cal=0; break;

}

numflag = 0;

dotflag = 0;

quan = 1;

UpdateData(FALSE);

}

else

MessageBox("error"); }

void CTestDlg::OnButtonClear() {

UpdateData();

m_Num =0;

m_result=' ';

num1 = 0;

num2 = 0;

numflag=0;

dotflag=0;

quan=1;

mark=0;

UpdateData(FALSE);

}

void CTestDlg::OnButtonMultiply() {

UpdateData();

num1 = m_Num;

cal = '*';

numflag = 0;

dotflag = 0;

quan = 1;

m_result='*';

mark=0;

UpdateData(FALSE);

}

void CTestDlg::OnButtonDivide() {

UpdateData();

num1 = m_Num;

cal = '/';

numflag = 0;

dotflag = 0;

quan = 1;

m_result='/';

mark=0;

UpdateData(FALSE);

}

void CTestDlg::OnButtonPlus() {

UpdateData();

num1 = m_Num;

cal = '+';

numflag = 0;

dotflag = 0;

quan = 1;

m_result='+';

mark=0;

UpdateData(FALSE);

}

void CTestDlg::OnButtonMinus() {

UpdateData();

num1 = m_Num;

cal = '-';

numflag = 0;

dotflag = 0;

quan = 1;

m_result='-';

mark=0;

UpdateData(FALSE);

}

void CTestDlg::OnButtonDot() {

UpdateData();

dotflag = 1;

m_Num += 0.0;

m_result='.';

UpdateData(FALSE);

}

class CTestDlg : public CDialog {

public:

int mark;

long quan;

int numflag;

int dotflag;

char cal;

double num2;

double num1;

CTestDlg(CWnd* pParent = NULL); // standard constructor enum { IDD = IDD_TEST_DIALOG };

double m_Num;

CString m_result;

protected:

virtual void DoDataExchange(CDataExchange* pDX);

// Implementation

protected:

HICON m_hIcon;

virtual BOOL OnInitDialog();

afx_msg void OnSysCommand(UINT nID, LPARAM lParam);

afx_msg void OnPaint();

afx_msg HCURSOR OnQueryDragIcon();

afx_msg void OnButtonNum1();

afx_msg void OnButtonNum2();

afx_msg void OnButtonNum3();

afx_msg void OnButtonNum4();

afx_msg void OnButtonNum5();

afx_msg void OnButtonNum6();

afx_msg void OnButtonNum7();

afx_msg void OnButtonNum8();

afx_msg void OnButtonNum9();

afx_msg void OnButtonZhengfu();

afx_msg void OnButtonDengyu();

afx_msg void OnButtonNum0();

afx_msg void OnButtonClear();

afx_msg void OnButtonMultiply();

afx_msg void OnButtonDivide();

afx_msg void OnButtonPlus();

afx_msg void OnButtonMinus();

afx_msg void OnButtonDot();

DECLARE_MESSAGE_MAP()

};

相关文档