VC实验报告格式3
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三:MFC基本控件实验
学号:2011329700214 姓名:周咪咪班级:11数媒(2)班
一、实验目的
1.了解MFC基本控件的使用方法。
2.掌握MFC基本控件的消息处理方法。
二、实验内容
1.使用按钮、文本框、图像框、列表框等控件编程。
三、实验步骤及源代码
1.首先打开VC,选择MFC AppWizard[exe],设定好路径和工程名(这里我设置工程名为为“My”)。
这里要注意的是在创建向导步骤1的时候,我们选择“基本对话框”。
2.点击完成便看到以下界面,把当前页面上IDD_SY3_DIALOG中原有的“确定”和“取消”控件按Delete全部清除。
根据实验要求将所有控件放入对话框模板中,然后作出相应调整,最终形成实验结果图示要求的界面。
因为原实验界面较复杂,为了简化界面,将其改为如下界面。
3.上图我们用按钮控件添加一共16个按钮,分别是数字“ 0 ~ 9” 以及“+ - * /”和".="。
编辑框组件共4个,第1.2个是输入数据,第3个显示运算结果。
修改按钮的ID和显示数字,编辑框ID,达到看ID知道目的。
按钮对应的ID表如下:
ID 显示的数ID 显示的数ID 显示的数
IDC_BUTTO N1 1 IDC_BUTTO
N8
8 IDC_point .
IDC_BUTTO N2 2 IDC_BUTTO
N9
9 IDC_dengyu =
IDC_BUTTO N3 3 IDC_BUTTO
N0
IDC_BUTTO
N4
4 IDC_add +
IDC_BUTTO
N5
5 IDC_reduce -
IDC_BUTTO
N6
6 IDC_chen *
IDC_BUTTO
N7
7 IDC_chu /
编辑框对应的ID如下:
功能ID
输入的第1个数IDC_EDIT1
输入的第2个数IDC_EDIT2
输出的结果IDC_EDIT3
4.给控件添加消息响应
为所以组件添加消息响应,基本操作可以是直接双击控件,便会有向导提示。
MFC默认下了的响应信息都为On_开头,这步骤一般不对成员函数名称做任何修改,直接点击OK即可。
之后会跳转到具体的代码实现过程。
5.基本上完成了计算器页面的前半部分预备工作,下来是我们的对控件具体实现代码的添加。
6.添加3个成员变量和一个CEdit类的变量。
具体添加方法,可以是在菜单栏中选择“查看”->“建立类向导”->Member Variable. (1)这里我们把3个编辑框控件内的变量都改变为double型的(因为进行四则运算难免出现小数点),m_num1(第1个输入的数)、m_num2(第2个输入的数)、m_result1(输出的结果)。
(2)之后再在控件IDC_EDIT3中选择"Add Variable",并且数据类型选择Control 类型此时变量自动改为了CEdit类,把编辑框控件3的设置为CEdit类并且设置一个成员对象是m_result。
(3)添加完成后观察到如下:
6.控件消息响应函数具体代码添加部分。
(1)运算部件控制(加减乘除)
1)UpdateData()是MFC的窗口函数,用来刷新数据的,由于我们进行基本运算需要更新数据所以必须添加这个函数。
2)n_result = m_num1 + m_num2;
m_result = n_result;
char sz[20];
sprintf(sz,"%f",m_result);
以上代码是进行加法的基本语句,然后数组保存并格式化打印输出。
进行其他运算只需要修改运算符"+"为对应的运算符即可。
3)m_CResult.SetWindowText(sz);
此句是把结果输出在之前用CEdit类创建的对象m_CResult,m_CResult调用SetWindowText(sz);把结果显示在编辑框中。
4)代码如下:
void CSy3Dlg::Onadd() //加法消息响应函数
{
// TODO: Add your control notification handler code here
UpdateData();
double n_result;
n_result = m_num1 + m_num2;
m_result1 = n_result;
char sz[20];
sprintf(sz,"%f",m_result);
m_result.SetWindowText(sz);
}
void CSy3Dlg::Onreduce() //减法消息响应函数
{
// TODO: Add your control notification handler code here
UpdateData();
double n_result;
n_result = m_num1 - m_num2;
m_result1 = n_result;
char sz[20];
sprintf(sz,"%f",m_result);
m_result.SetWindowText(sz);
}
void CSy3Dlg::Onchen() //乘法消息响应函数
{
// TODO: Add your control notification handler code here
UpdateData();
double n_result;
n_result = m_num1 * m_num2;
m_result1 = n_result;
char sz[20];
sprintf(sz,"%f",m_result);
m_result.SetWindowText(sz);
}
void CSy3Dlg::Onchu() //除法消息响应函数
{
// TODO: Add your control notification handler code here
UpdateData();
double n_result;
n_result = m_num1 / m_num2;
m_result1 = n_result;
char sz[20];
sprintf(sz,"%f",m_result);
m_result.SetWindowText(sz);
}
(2)编辑框功能的实现
1)如何用判断用户是在哪个编辑框上输入了数字,所以我们需要给程序加入一个功能,那便是判断用户是在编辑框1输入,还是编辑框2内输入。
加入一个鼠标左键点击WM_LBUTTONDOWN消息和一个EN_SETFOCUS事件来响应这个鼠标消息。
EN_SETFOCUS为判断焦点事件(通俗点说,那便是判断光标在什么地方)。
用户用鼠标选择并点击编辑框的时候,我们用WM_LBUTTONDOWN消息去响应,然后与此同此,我们把响应的和EN_SETFOCUS联系起来,我们预设一个
全局变量nEditFlag ,作为在EN_SETFOCUS函数里的一个标记,并在鼠标点下的时候用nEditFlag 去表示编辑框目前被选定的状态,nEditFlag ==1 的时候我们就判断用户选择了编辑框1 ,再者当nEditFlag ==2的时候说明编辑框2被选定。
2)EN_SETFOCUS事件的添加
①由于EN_SETFOCUS是一个判断焦点的,所以对象应该是编辑框1和编辑框2里添加,所以我们回到对话框编辑页面。
“右键编辑框1”->点击“事件”-> “选择EN_SETFOCUS”(这里程序默认的响应函数是OnsetfocusEdit1)。
(编辑框2方法如上)
②初始化工作,在程序运行之初,在OnInitDialog()内进行初始化nEditFlag = 0;只需在OnInitDialog()函数中加入一句。
BOOL CSy3Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
nEditFlag = 0;
③为两个事件响应函数进行OnsetfocusEdit1()和OnsetfocusEdit2()添加代码。
void CSy3Dlg::OnSetfocusEdit1()
{
// TODO: Add your control notification handler code here
nEditFlag = 1;//当用户选定编辑框1的时候,nEditFlag = 1;
}
void CSy3Dlg::OnSetfocusEdit2()
{
// TODO: Add your control notification handler code here
nEditFlag = 2;//当用户选定编辑框2的时候,nEditFlag = 2;
}
3)WM_LBUTTONDOWN鼠标消息事件的添加
在Class View中选择CSy3Dlg,右击->选择“Add Windows Message Handler”添加消息句柄。
代码部分:
void CSy3Dlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
this->SetFocus();
nEditFlag=0;
CDialog::OnLButtonDown(nFlags, point);
}
(3)按键0~9的响应部分
void CSy3Dlg::OnButton0() //数字0
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
if(nEditFlag==0)
{
m_num1=m_num1*10+0;
}
else if(nEditFlag==2)
{
m_num2=m_num2*10+0;
}
UpdateData(FALSE);
}
void CSy3Dlg::OnButton1() //数字1
{
// TODO: Add your control notification handler code here UpdateData(TRUE);
if(nEditFlag==1)
{
m_num1=m_num1*10+1;
}
else if(nEditFlag==2)
{
m_num2=m_num2*10+1;
}
UpdateData(FALSE);
}
void CSy3Dlg::OnButton2() //数字2
{
// TODO: Add your control notification handler code here UpdateData(TRUE);
if(nEditFlag==1)
{
m_num1=m_num1*10+2;
}
else if(nEditFlag==2)
{
m_num2=m_num2*10+2;
}
UpdateData(FALSE);
}
void CSy3Dlg::OnButton3() //数字3
{
// TODO: Add your control notification handler code here UpdateData(TRUE);
if(nEditFlag==1)
{
m_num1=m_num1*10+3;
}
else if(nEditFlag==2)
{
m_num2=m_num2*10+3;
}
UpdateData(FALSE);
}
void CSy3Dlg::OnButton4() //数字4
{
// TODO: Add your control notification handler code here UpdateData(TRUE);
if(nEditFlag==1)
{
m_num1=m_num1*10+4;
}
else if(nEditFlag==2)
{
m_num2=m_num2*10+4;
}
UpdateData(FALSE);
}
void CSy3Dlg::OnButton5() //数字5
{
// TODO: Add your control notification handler code here UpdateData(TRUE);
if(nEditFlag==1)
{
m_num1=m_num1*10+5;
}
else if(nEditFlag==2)
{
m_num2=m_num2*10+5;
}
UpdateData(FALSE);
}
void CSy3Dlg::OnButton6() //数字6
{
// TODO: Add your control notification handler code here UpdateData(TRUE);
if(nEditFlag==1)
{
m_num1=m_num1*10+6;
}
else if(nEditFlag==2)
{
m_num2=m_num2*10+6;
}
UpdateData(FALSE);
}
void CSy3Dlg::OnButton7() //数字7
{
// TODO: Add your control notification handler code here UpdateData(TRUE);
if(nEditFlag==1)
{
m_num1=m_num1*10+7;
}
else if(nEditFlag==2)
{
m_num2=m_num2*10+7;
}
UpdateData(FALSE);
}
void CSy3Dlg::OnButton8() //数字8
{
// TODO: Add your control notification handler code here UpdateData(TRUE);
if(nEditFlag==1)
{
m_num1=m_num1*10+8;
}
else if(nEditFlag==2)
{
m_num2=m_num2*10+8;
}
UpdateData(FALSE);
}
void CSy3Dlg::OnButton9() //数字9
{
// TODO: Add your control notification handler code here UpdateData(TRUE);
if(nEditFlag==1)
{
m_num1=m_num1*10+9;
}
else if(nEditFlag==2)
{
m_num2=m_num2*10+9;
}
UpdateData(FALSE);
}
用if语句去判断标记常量nEditFlag 从而给判断是m_num1还是m_num2进行操作
这里
m_num1是编辑框1内的数字
m_num2是编辑框2内的数字
四、运行结果及分析
五、实验心得
此次实验是一次较完整的mfc制作计算器的实验,在mfc中选择基于对话框的程序,设置好界面,然后对按钮添加事件监听,在按下按钮时在编辑框中显示出该内容,并显示出计算结果。
实验过程中遇到了很多问题在老师和同学的帮助下,解决了问题。
通过本次实验,我对mfc有了进一步的了解,对添加消息响应有了进一步的认识。
希望在接下来的学习中再接再厉更加熟练的掌握这些原理。