实验计算器程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5 程序说明及进一步的功能实现
1) ON_COMMAND_RANGE 程 序 中 一 个 消 息 响 应 函 数 可 以 对 应 一 个 ID 范 围 的 命 令 映 射 , 比 如 本 例 中 的 OnNumberKey 函数对应 IDC_NUMBER1 到 IDC_NUMBER10 的命令映射。这个功能主要是 通过 ON_COMMAND_RANGE 宏实现的。ON_COMMAND_RANGE 宏格式如下: ON_COMMAND_RANGE( id1, id2, memberFxn ) 参数说明:id1:一个连续范围的命令 ID 的起始值
(1)启动 AppWizard,建立一个基于对话框的 MFC 应用程序 Calculator。 ( 2 ) 修 改 对 话 框 资 源 , 按 照 图 8.1 方 式 , 添 加 控 件 对 象 。 Edit 的 ID 是 IDC_EDIT_PUTOUT,风格属性是 Number 和 Read-Only,在“Extended Styles”属性中 选择“Right Aligned Text”。表 8.1 是按钮控件的 ID 标识和标题。
+/退格 /
OnOperationKey OnOperationKey OnOperationKey
IDC_NUMBER_Multiply
*
OnOperationKey
IDC_NUMBER_Add
+
OnOperationKey
IDC_NUMBER_Subtract
-
OnOperationKey
IDC_NUMBER_Clear
m_number=m_number*10+n; number1=m_number; UpdateData(FALSE); } else { m_number=m_number*10+n; number2=m_number; UpdateData(FALSE); } //处理除数为零的情况的代码添加在这里,如果选择除,则零按钮不显示,否则显示
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; } (11)编译连接运行。
图 8.1 编辑对话框资源界面
注意:控件的添加要按表 8.1 的顺序添加。 (3)在对话框类的头文件(CalculatorDlg.h)中添加用于数学计算的头文件:
#include "math.h" (4)添加按钮消息映射,在对话框类的定义中添加如下函数声明:
afx_msg void OnNumberKey(UINT nID); //处理数字键单击事件的消息响应函数 afx_msg void OnOperationKey(UINT nID);
break;
}
} (7)在对话框类中定义如下变量:
double number1,number2;
//number1 和 number1 用于存储将要进行运算的数字 int NumberState,OperationState;
//NumberState 用于标示是将数值赋给 number1 或是 number2
id2:一个连续范围的命令 ID 的结束值
memberFxn:该命令被映射到的消息处理函数的名字 使用这个宏把一个连续范围的命令 ID 映射到单个命令处理函数,ID 的范围从 id1 开始, 到 id2 结束。 注意:使用该宏时,要求 id1 到 id2 的命令 ID 必须是连续的,id1 最小,id2 最大,否 则可能有些命令 ID 不能映射,ID 值的定义见 resource.h 文件。 2)计算器为什么能够将数据或运算结果显示出来? 仔细观察我们在程序创建过程中添加的代码,可以发现,凡是能够即时显示输入数据或 计算结果的消息处理函数,其中必有一行这样的语句:UpdateData(FALSE)。这行语句的作 用就是即时刷新数据并在编辑框中显示。UpdateData 定义如下: CWnd::UpdateData
//OperationState 用于表示计算器所要执行的操作 (8)利用 ClassWizard 为 IDC_EDIT_PUTOUT 添加映射变量 m_number。 (9)在对话框类的构造函数中初始化变量
m_number = 0.0; NumberState=1; (10)为对话框类添加计算函数 void cal(),用于计算,函数实现代码如下: void CCalculatorDlg::cal() { switch(OperationState) { case 1:
number1=m_number=sqrt(number1);
UpdateData(FALSE);
break;
case IDC_NUMBER_Derivative:
number1=m_number=(double)1/number1;
UpdateData(FALSE);
break;
case IDC_NUMBER_Equal: cal(); //计算 derivative
C
OnOperationKey
IDC_NUMBER_Sqrt
Sqrt
OnOperationKey
IDC_NUMBER_Derivative
1/X
OnOperationKey
IDC_NUMBER_Equal
=
OnOperationKey
(6)在对话框的实现文件中添加 OnNumberKey(UINT nID)和 OnOperationKey(UINT
} void CCalculatorDlg::OnOperationKey(UINT nID) //响应操作键按下 {
switch(nID) { case IDC_NUMBER_PlusMinus: m_number=-m_number;
if(NumberState==1) number1=m_number;
break;
case IDC_NUMBER_Divide:
cal(); //如果连续计算
OperationState=1;
m_number=0;
NumberState=2;
break;
case IDC_NUMBER_Multiply: cal(); //如果连续计算
OperationState=2;
//处理操作键单击事件的消息响应函数 (5)在对话框的实现文件消息映射中添加如下代码:
//省略前面代码
BEGIN_MESSAGE_MAP(CCalculatorDlg, CDialog)
//{{AFX_MSG_MAP(CCalculatorDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
m_number=0;
NumberState=2;
case IDC_NUMBER_Add:
break; cal(); //如果连续计算
OperationState=3;
m_number=0;
NumberState=2;
break;
case IDC_NUMBER_Subtract: cal(); //如果连续计算
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP //添加代码
ON_COMMAND_RANGE(IDC_NUMBER1,IDC_NUMBER0,
OnNumberKey)
ON_COMMAND_RANGE(IDC_NUMBER_PlusMinus,
IDC_NUMBER_Equal,OnOperationKey)
5
OnNumberKey
IDC_NUMBER6
6
OnNumberKey
IDC_NUMBER7
7
OnNumberKey
IDC_NUMBER8
8
OnNumberKey
IDC_NUMBER9
9
OnNumberKey
IDC_NUMBER0
0
OnNumberKey
IDC_NUMBER_PlusMinus IDC_NUMBER_BackSpace IDC_NUMBER_Divide
else number2=m_number;
UpdateData(FALSE); break; case IDC_NUMBER_BackSpace: m_number=(int)m_number/10; if(NumberState==1)
number1=m_number; else
number2=m_number; UpdateData(FALSE);
BOOL UpdateData( BOOL bSaveAndValidate = TRUE ); 参数说明:bSaveAndValidate:指明是要初始化对话框(FALSE)还是获取数据(TRUE) 的标志,即参数值为真时,将控件信息转换为变量数据;反之,将变量数据转化为控件信息。 输入数据或计算结果能够及时显示的另外一个重要原因是对话框的 DDX 和 DDV 机制。 DDX 和 DDV 机制是为了帮助对话框管理数据的实现函数。DDV(Dialog Data Validation) 机制用于数据验证有效性。DDX(Dialog Data Exchange)机制用于变量与对话框中的控件 双向交换数据。把 DDV 和 DDX 机制增加到对话框中的最简单最有效的方法是使用类向导 (ClassWizard)来添加控件的成员变量,控件与对话框控件关联的成员变量自动地使用了 MFC 提供的 DDV 和 DDX 机制。其工作方式是这样的:当你用 ClassWizard 把某变量和控 件连接起来时(通过 Member Variables 选项卡),它在数据映射中创建一个入口。实际上也 就是在对话框的 DoDataExchange 函数中添加一个入口函数(DoDataExchange 函数是 Class Wizard 产 生 和 维 护 的 函 数 )。 当 你 调 用 UpdateData ( FALSE ) 时 , MFC 调 用 DoDataExchange 函数,ClassWizard 放于 DoDataExchange 中的实现代码将把来自变量的数 据拷贝到对应的控件。如果调用 UpdateData(TRUE),MFC 反过来把数据拷贝回变量(并且 可能同时进行数据验证)。 3) 如何改变计算器的背景颜色? 在 对 话 框 的 OnPaint 函 数 中 直 接 填 充 背 景 色 。 打 开 对 话 框 的 实 现 文 件 “CalculatorDlg.cpp”,找到 void CCalculatorDlg::OnPaint()函数,添加如下粗体字所示的代 码: void CCalculatorDlg::OnPaint()
nID)的实现代码。
void CCalculatorDlg::OnNumberKey(UINT nID) //响应数字键按下
{
int n=0;
switch(nID)
{ case IDC_NUMBER1:n=1;break; case IDC_NUMBER2:n=2;break; case IDC_NUMBER3:n=3;break; case IDC_NUMBER4:n=4;break; case IDC_NUMBER5:n=5;break; case IDC_NUMBER6:n=6;break; case IDC_NUMBER7:n=7;break; case IDC_NUMBER8:n=8;break; case IDC_NUMBER9:n=9;break; case IDC_NUMBER0:n=0;break; } if(NumberState==1) {
END_MESSAGE_MAP() //省略后面代码
ID 标识
表 8.1 按钮控件的 ID 标识和标题
标题
处理函数
IDC_NUMBER1
1
OnNumberKey
IDC_NUMBER2
2
OnNumberKey
IDC_NUMBER3
3
OnNumberKey
IDC_NUMBER4
4
OnNumberKey
IDC_NUMBER5
OperationState=4;
m_百度文库umber=0;
NumberState=2;
break; case IDC_NUMBER_Clear:
number1=number2=m_number=0;
UpdateData(FALSE);
NumberState=1;
break;
case IDC_NUMBER_Sqrt:
实验计算器程序
1 实验目的
对话框是一种用户界面,它的主要功能是输出信息和接收用户的输入。 ◆ 掌握 MFC 的 CDialog 类和其运行机制,掌握各种控件的使用。 ◆ 学习使用对话框实现人机交互功能。
2 实验类型
综合型实验
3 实验内容及步骤
本实验的任务是实现一个简易计算器,该计算器具有简单的加减乘除功能。该计算器具 体实现步骤如下:
相关文档
最新文档