实验8 MFC基本应用程序的建立
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验内容
(1)在一个默认的单文档应用程序Ex_SDI中通过映射计时器消息实现这样的功能:无论在Ex_SDI 应用循序窗口的客户区中单击左键或右键,都会弹出“消息”对话框,显示鼠标左键或右键的单击次数。
Ex_SDI运行结果如图T8.1所示。
(2)使用调试器对上述程序的流程和鼠标单击数进行调试。
实验准备和说明
(1)在学习完第3章内容之后进行本次实验。
(2)构思本次上机所需要的程序。
(3)调试为本书新增的内容,要学会掌握其调试过程。
实验步骤
1.创建工作文件夹
打开计算机,在“D:\Visual C++程序\LiMing”文件夹中创建一个新的子文件夹“实验8”。
2.创建单文档应用程序Ex_SDI
创建单文档应用程序Ex_SDI的具体步骤如下:
(1)启动Visual C++ 6.0。
(2)选择“文件”→“新建”菜单命令,显示出“新建”对话框。
从列表框中选中MFCAppWizard(exe)的项目类型项
(3)在“工程”编辑框中输入应用程序项目名称Ex_SDI.,并将项目文件夹定位到“D:\Visual C++程序\LiMing\实验8”。
(4)单击“确定”按钮,显示“应用程序向导”对话框。
选中单个文档(Single Document,简称SDI)应用程序类型。
单击“完成”按钮,系统将显示向导创建的信息,单击“确定”按钮将自动创建次应用程序。
(5)编译运行。
3.添加数据成员
添加数据成员的具体步骤如下
(1)展开项目工作区窗口Class View中的所有类结点;
(2)用鼠标右键单击CEx_SDIView类结点,从弹出的快捷菜单中选择“Add Member Variable (添加成员变量)”,弹出如图T8.2所示的“Add Member Variable”对话框。
(3)在Variable Type框中输入成员变量类型int,在variable Name框中输入成员变量名m_nLButton。
保留默认的访问方式(Access)为Public。
单击“OK”按钮,这样,就会在CEx_SDIView 中添加一个公有型成员变量m_nLButton,变量类型为int。
(4)按相同的方法,在CEx_SDIView中添加一个公有型成员变量m_nRButton,变量类型为int;
(5)在项目工作区窗口ClassView中,展开CEX_SDIView类结点的所有成员结点,双击构造函数CEx_SDEView()结点,在CEx_SDEIView类的构造函数中添加下列成员变量初始化代码:CEx_SDEView::CEx_SDEView()
{
m_nLButton=m_nRVutton;
}
4、添加信息映射
添加消息映射的具体步骤如下。
(1)按Ctrl+W快捷键打开“MFC ClassWizard”对话框。
(2)在Class name组合框中,将类名选定为CEx_SDIView.此时,Object Ids和Messages列表内容会相应地改变。
在Object Ids列表框中选定CEx_SDIView,而在Messages列表中选定WM_LBUTTOMDOWN信息。
(3)双击Messages列表中的WM_LBUTTOMDOWN消息或单击“Add Function”按钮,都会在CEx_SDIView.类中添加该消息的映射函数OnLButtonDown , 同时在Memberfunctions列表中显示这一消息映射函数和被映射的消息。
映射WM_LBUTTOMDOWN消息的结果如图T8.3所示。
(4)单击“Edit Code”按钮后,ClassWizard 对话框退出,并转向文档窗口,定位到OnLButtonDown函数源代码处,添加下列代码:
void Cex_SDView:: OnLButtonDown(UINTnFlags,Cpoint point)
{
//计数变量m_nLButton加1,然后启动计时器
m_nLButton++;
SetTimer(1,50,NULL);
CView:: OnLButtonDown(nFlags,Cpoint point);
}
(5)按相同的方法为CEx_SDIView.类添加WM_LBUTTOMDOWN消息映射,并在映射函数中添加下列代码:
void Cex_SDView:: OnLButtonDown(UINTnFlags,Cpoint point)
{
//计数变量m_nLButton加1,然后启动计时器
m_nLButton++;
SetTimer(2,50,NULL);
CView:: OnLButtonDown(nFlags,Cpoint point);
}
(6)按类似的方法为CEx_SDIView.类添加WM_TIMER消息映射,并在映射函数中添加下列代码
void Cex_SDView:: OnTimer(UINT nIDEvent)
{
Cstring str; //创建一个字符串类对象
//通过判断nIDEvent的值来确定是单击鼠标左键还是右键if(nIDEvent= =1)
Str.Format(“你已单击鼠标左键%d 次!”,m_Nlbutton);
if(nIDEvent= =2)
Str.Format(“你已单击鼠标左键%d 次!”,m_Nlbutton);
if((nIDEvent= =1)||(nIDEvent= =2))
{
KillTimer(nIDEvent); //先要关闭计时器
MessageBox(str,“报告”);
}
CView:: OnTimer(nIDEvent);
}
(7)编译运行并测试,结果如图T8.31所示。
5、设置断点
在设置断点之前,首先要保证程序中没有语法错误。
所谓断点,实际上是告诉调试器在何处暂时中断程序的运行,以便查看程序的状态以及浏览和修改变量的值等。
(1)在项目工作区的ClassVIEW页面中,展开Cex_SDIView下的所有结点。
(2)双击OnLButtonDown结点,会在文档窗口中打开并定位到该消息映射代码处,在代码行“m_nLButton++;”中单击鼠标.
(3)用以下3种方式之一设置断点,会在代码行“m_nLButton++;”的最前面的窗口页边距上有一个深红色的实心圆快,如图T8.3所示
① 按快捷键F9。
②在Build工具栏上单击按钮。
③在需要设置(或清除)断点的位置上单击鼠标右键,在弹出的快捷菜单中选择“Insert/Remove Breakpoint”命令。
需要说明的是,若在断点所在的代码行中再使用上述的快捷方式进行操作,则相应地设置断点被清除。
若此时使用快捷菜单方式进行操作时,菜单项中还包含“DisableBreakpoint”命令,选择此命令后,该断点被禁用,相应地断点标志由原来的红色的实心圆变成空心圆。
6.控制程序运行
控制程序运行的具体步骤如下:
(1)选择”编译”(Build)菜单“开始调试”子菜单的“去(Go)”命令,或单击“编译微型条”中的**按扭,启动调试器。
(2)程序运行后,在客户区单击鼠标左键,由于程序中该消息的映射函数中设置了断点处停顿下来。
(3)这是可以看到有一个黄色的小箭头,它指向即将执行的代码。
而且,原来的“编译”菜单会变成“Debug”(调试)菜单,如图T8.5所示。
其中有4条命令Step Into、StepOver、Step Out 和Run to Cursor是用于控制程序运行的,其含义是:
1) Step Over 的功能是运行当前箭头指向的代码(只运行一条代码)
2) Step Into 的功能是如果当前箭头所指向的代码是一个函数的调用,则用Step Into进入该函数进行单步执行。
3) Step Out的功能是如果当前箭头所指向的代码是在某一函数内,用它使用程序运行至函数返回处。
4) Run to Cursor 的功能是使程序运行至光标所指的代码.
执行Step Into、StepOver、Step Out 和Run to Cursor命令,看看程序运行结果和流程是怎样的?
(4)选择“Debug”(调试)菜单中的”Stop Debugging”命令或直接按快捷键Shift+F5或单击“编译微型条”中的**按扭,启动调试器。
(5)
7.查看和修改变量的值
为了更好地进行程序调试,调试,调试器还提供一系列的窗口,用于显示各种不同的调试信息。
可借助“查看”菜单下的“调试窗口”子菜单访问它们。
事实上,当启动调试器后,Visual++6.0的开发一环境会自动显示出Watch 和Variables两个调试窗口,如图T8.6所示。
除了上述窗口外,调式器还提供Quick Watch Memory Registers Call Stack以及 Disassembly 等窗口。
但对于变量的查看和修改来说,通常可以使用Quick Watch Watch和Variables 这3 个窗口。
以下步骤使用这3 个窗口来查看、修改m_nLBntton或m_nRButton值
(1)启动调试器,程序运行后,单击鼠标左键,程序停顿下来。
(2)如图T8.6所示,可以看到Variables 窗口有3个页面:Auto Licals 和This。
Auto 页面用于显示出当前语句和上一条语句使用的变量,它还显示使用Step Over和 Step Out命令后函
数的返回值。
Locals 页面用于显示出当前函数使用的局部变量。
This页面用于显示出由This所指向的对象信息。
Locals 页面用于内均有“名称(Name)”和“值(value)”两个域,调试器自动填充它们。
除了这些页面外,Variables窗口还有一个“上下文(Context)”框,从该框的下拉列表中可以选定当前Call Stack 的指令,以确定在页面中显示变量的范围。
(3)在“调试(Debug)”工具栏上,单击*按扭或按快捷键F10,箭头指向了下一句代码”SeTiner(1,50,NULL);”。
同时,Variablels 窗口中的m_nButton 值变成了1.实际上,若仅需要快速查看变量或表达式的值,则只需要将鼠标指针直接放在代码中该变量或表达式上,片刻后,系统会自动弹出一个窗口显示出该变量或表达式的值。
(4)在Watch 窗口中,单击左边“名称(Name)”域下的空框,输入m_nRButton,按Enter 键,相应的值也会自动出现在“值(Value)”域中。
同时,又在末尾处出现新的窗框。
添加新的变量或表达式如图T8.7所示需要说明的是,Watch窗口中有4个页面:Watch1 Watch2 Watch3 和Watch4 ,在每一个页面中有一系列的用户要查看的变量或表达式,用户可以将一组变量或表达式的值显示在同一个页面中。
(5)选择“调试(Debug)”菜单……“QuickWatch”命令或快捷键Shift+F9或在“调试
(Debug)”工具栏上单击按钮,将弹出如图T8.8所示的“Quick Watch ”窗口。
其中,“表达式”框可以让用户输入变量名或表达式,然后按Enter健或单击“重置”按钮,就可以在“当前值”列表中显示出相应的值。
若要修改其值的大小,则可按Tab 健或在列表项的“Value”域中双击该值,再输入新值按Enter键就可以了。
单击“添加监视”按钮可将刚才输入的变量名或表达式及其值显示在“Watch”窗口中。
从上述过程可以看出,调试一般按这样的步骤进行:修正语法错误—> 设置断点—>启用调试器—>控制程序进行—>查看和修改变量的值。
8.退出Visual C++6.0
9.写出实验报告
结合实验内容、思考与练习,写出实验报告。
思考与练习
(1)若向一个类添加成员函数,则应如何进行?
(2)在Ex_SDI 中,若再在CMainFrame类添加WM_LBUTTOMDOWN消息映射,并在映射函数添加弹出“消息”对话框的代码,这样,就在CMainFrame类和CEx_SDIView中都有该消息的映射函数,测试一下,看看在CMainFrame类的这个消息映射函数会不会执行?为什么?用调试器调试其结果。