mfc计算机程序设计 复杂计算器,MFC编程入门 简单计算器制作 菜鸟的一点心得...

a4c26d1e5885305701be709a3d33442f.png

操作步骤:

1.启动Visual C++,新建一个Visual C++项目,选用MFC应用程序模板,项目名称为Calculator.

2.在应用程序向导的Type选项中选择“Dialog based”,直接单击Finish按钮完成。

3.从ReviewView窗口中打开主对话框资源IDD_CALCULATOR_DIALOG,利用资源编辑其创建图片所示对话框。

4.按照“1” “2”

“3”“4”“5”“6”“7”“8”“9”“0”“/”“*”“+”“-”“c”“sqrt”“1/x”“=”分别建立按钮,将他们的标识符一次改为“IDC_BUTTON1”

“IDC_BUTTON2” “IDC_BUTTON3”......依次改下去。实际上正确的顺序以及自动安排好。

接下来MFC编程的主要思想是:

为了实现我们的简单计算器功能,我们希望MFC帮我们完成两个任务。任务1:当我们点击0-9的数字按钮的时候,我们希望程序能够在我们点击完按钮后他能够记录下我们单击的按钮所代表的数字。任务2:当我们单击加减乘除等运算符号时候,它能够记录,并且在单击“=”后输出结果。

为此,我们需要添加消息函数,有的消息函数可以通过VIEW菜单项中的CLASSWIZARD来添加,比如鼠标单击消息函数,COMMAND命令消息函数,所代表的就是当鼠标单击按钮或者单击菜单给他们下命令时候响应相关的函数。

在这里,我们要直接在CCalculatorDlg类中对应的文件中添加消息函数。

1.在CCalculatorDlg.h中添加宏消息函数,实际上这个头文件是定义了CCalculatorDlg类,所以必须在里面添加这个类的成员函数,即这个类的消息函数。

afx_msg void OnNumberKey(UINT nID);

afx_msg void OnOperationKey(UINT nID);

其中afx_msg表示宏消息

具体添加的位置为如下图(Generated Message Map functions ):

a4c26d1e5885305701be709a3d33442f.png

然后再CalculatorDlg.cpp中具体添加一个ON_COMMAND_RANGE(ID1,ID2,memberFxn)函数,他的功能就是本例中ID为IDC_BUTTON1~IDC_BUTTON10的按钮在受到单击时候调用memberFxn函数。

因此为了完成上述任务1、2,我们需要 在CalculatorDlg.cpp中添加两个函数:

a4c26d1e5885305701be709a3d33442f.png

即:

ON_COMMAND_RANGE(IDC_BUTTON1,IDC_BUTTON10,OnNumberKey)

ON_COMMAND_RANGE(IDC_BUTTON11,IDC_BUTTON20,OnOperationKey);

到此,整个框架已经完成。然后我们从ClassWizard为CCalculatorDlg类的IDC_EDIT控件添加一个变量类型为double,变量名称为m_number的变量,因为这个编辑框显示的内容极为m_number的值,每次用命令UpdateData(FALSE)的时候就能显示更新后的m_number的值。

最后,在CCalculatorDlg类中添加以下变量:

pulic:

double number1,number2'

int NumberState;

int OperationState;

void cal();

附录:

OnNumberKey(), OnOperationKey(), cal()函数如下:

void CCalculatorDlg::OnNumberKey(UINT nID)

{

int n=0;

switch(nID)

{

case

IDC_BUTTON1:n=1;break;

case

IDC_BUTTON2:n=2;break;

case

IDC_BUTTON3:n=3;break;

case

IDC_BUTTON4:n=4;break;

case

IDC_BUTTON5:n=5;break;

case

IDC_BUTTON6:n=6;break;

case

IDC_BUTTON7:n=7;break;

case

IDC_BUTTON8:n=8;break;

case

IDC_BUTTON9:n=9;break;

case

IDC_BUTTON10:n=0;break;

}

if(NumberState==1)

{

m_number=m_number*10+n;

number1=m_number;

UpdateData(FALSE);

}

else

{

m_number=m_number*10+n;

number2=m_number;

UpdateData(FALSE);

}

}

void CCalculatorDlg::OnOperationKey(UINT nID)

{

switch(nID)

{

case IDC_BUTTON11:

//负号

m_number=-m_number;

if(NumberState==1)

{

number1=m_number;

}

else

{

number2=m_number;

}

UpdateData(FALSE);

break;

case IDC_BUTTON12:

//退格

m_number=(int)m_number/10;

if(NumberState==1)

number1=m_number;

else

number2=m_number;

UpdateData(FALSE);

break;

case IDC_BUTTON13:

//除号/

OperationState=1;

m_number=0;

MessageBox("ddd");

UpdateData(FALSE);

NumberState=2;

break;

case IDC_BUTTON14:

OperationState=2;

m_number=0;

UpdateData(FALSE);

NumberState=2;

break;

case IDC_BUTTON15:

//+

OperationState=3;

m_number=0;

UpdateData(FALSE);

NumberState=2;

break;

case IDC_BUTTON16:

//减号

OperationState=4;

MessageBox("ddd");

m_number=0;

UpdateData(FALSE);

NumberState=2;

break;

case IDC_BUTTON17:

//C

number1=m_number=number2=0;

UpdateData(FALSE);

NumberState=1;

break;

case IDC_BUTTON18:

//Sqrt

number1=m_number=sqrt(number1);

UpdateData(FALSE);

break;

case IDC_BUTTON19:

//1/X

number1=m_number=(double)1/number1;

UpdateData(FALSE);

break;

case IDC_BUTTON20:

//等号

cal();

break;

}

}

void CCalculatorDlg::OnOperationKey(UINT nID)

{

switch(nID)

{

case IDC_BUTTON11:

//负号

m_number=-m_number;

if(NumberState==1)

{

number1=m_number;

}

else

{

number2=m_number;

}

UpdateData(FALSE);

break;

case IDC_BUTTON12:

//退格

m_number=(int)m_number/10;

if(NumberState==1)

number1=m_number;

else

number2=m_number;

UpdateData(FALSE);

break;

case IDC_BUTTON13:

//除号/

OperationState=1;

m_number=0;

MessageBox("ddd");

UpdateData(FALSE);

NumberState=2;

break;

case IDC_BUTTON14:

OperationState=2;

m_number=0;

UpdateData(FALSE);

NumberState=2;

break;

case IDC_BUTTON15:

//+

OperationState=3;

m_number=0;

UpdateData(FALSE);

NumberState=2;

break;

case IDC_BUTTON16:

//减号

OperationState=4;

MessageBox("ddd");

m_number=0;

UpdateData(FALSE);

NumberState=2;

break;

case IDC_BUTTON17:

//C

number1=m_number=number2=0;

UpdateData(FALSE);

NumberState=1;

break;

case IDC_BUTTON18:

//Sqrt

number1=m_number=sqrt(number1);

UpdateData(FALSE);

break;

case IDC_BUTTON19:

//1/X

number1=m_number=(double)1/number1;

UpdateData(FALSE);

break;

case IDC_BUTTON20:

//等号

cal();

break;

}

}

void CCalculatorDlg::cal()

{

// TODO: Add your control notification handler

code here

switch(OperationState)

{

//除

case 1:

m_number=(double)number1/number2;

NumberState=1;

UpdateData(FALSE);

break;

//乘

case 2:

m_number=number1*number2;

NumberState=1;

UpdateData(FALSE);

break;

//加

case 3:

m_number=number1+number2;

NumberState=1;

UpdateData(FALSE);

break;

case 4:

m_number=number1-number2;

NumberState=1;

UpdateData(FALSE);

break;

}

number1=m_number;

OperationState=0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值