操作步骤:
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 ):
然后再CalculatorDlg.cpp中具体添加一个ON_COMMAND_RANGE(ID1,ID2,memberFxn)函数,他的功能就是本例中ID为IDC_BUTTON1~IDC_BUTTON10的按钮在受到单击时候调用memberFxn函数。
因此为了完成上述任务1、2,我们需要 在CalculatorDlg.cpp中添加两个函数:
即:
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;
}