写在前边
第一次在简书上写文章,因为总觉得学习过程必须要有所记录。不管是所见还是所想,留下记录才能说明自己没有白学。
项目介绍
这篇文章是关于我自己选的C++这门课程中一个项目进行的思考与分析。项目介绍如下:
项目名称
基于MFC的C++桌面应用开发
项目内容
一位小学教师Ken希望完成这样的任务:针对于小学生正在学习四边形(quadrangle)的特性,编写一个小软件,能够随机在屏幕上显示矩形(rectangle)、正方形(square)、平行四边形(parallelogram)、梯形(trapezoid)和菱形(diamond)五种形体之一,同时显示该形体的特性和关键数据(随机产生),学生复习形体的特性,然后根据给出的关键数据计算形体的面积,软件判断其结果的正确性。在学习过程中,软件记录产生的每一个形体,在学生选择不再继续后,将其学习的过程重放一遍,用以重温,加深印象。
具体的项目要求就不再描述,可以知道的是开发桌面应用、形体对象、随机数据,记录形体这几个关键词,那么接下来对项目进行简单的分析。
开发基础
实验已经提供了一个程序的框架,里边主要包含了Canvas、experiment、experimentDlg三个文件的声明与实现的文件(.h文件与.cpp文件,一个声明,一个实现),其中experiment文件定义和实现了类的行为,我理解为各个控件(按钮、编辑框等)的可执行操作;experimentDlg文件定义和实现了类各个行为的触发事件,比如点击关闭按钮程序会关闭,点击开始学习按钮会开始显示形体等;Canvas文件实现的是形体图形输出的操作。其他文件比如stdafx是一些常用的库文件,其他的常用的并且不常更改的声明等,resource.h是控件的符号定义。
接下来是讲如何进行MFC开发。
首先我们重新建一个MFC项目,可以看到里边包含的文件如下:
可以看到和之前的分析一样,只是少了一个Canvas文件。
我们点击资源视图(Ctrl+Shift+E),并打开DIALOG:
可以看到如下界面:
设计界面这就是界面设计的界面,我们可以在旁边的工具栏添加新的控件,也可以在这里编辑控件的属性,并且对控件的更改和操作系统都会体现在代码里而不必由自己去修改。
工具箱:可以添加控件开发MFC的过程就是先建立工程文件->编辑主界面->设置控件属性->设置触发事件->DEBUG->发布
那么现在来看看怎样设置控件属性,以按钮为例,先单击按钮,右键选择属性,右边会出现如下栏:
从图中可以看到很多关于按钮的属性,这个可以自己去看,其中的Caption属性是按钮的描述字符串,和按钮显示的文字是一样的,因此这个可以修改为自己想要的。
其他控件类似,可以自己根据需要去设置控件属性,不作具体介绍。
接下来看设置触发事件,以按钮为例,双击开始按钮,跳到如下位置:
可以看到这个函数的名称OnClickedButtonStop(),即当点击STOP按钮时;那代表着当点击了这个按钮就会执行函数里的代码。我们看一下完整的函数代码:
首先是点击了按钮,切换当前的模式,如果是学习模式则切换为非学习模式,如果是非学习模式则切换为学习模式,接下来根据模式来执行不一样的代码,enable变量为使能变量,先不解释。然后我们看到这行代码:
GetDlgItem可以根据元素的符号获得其句柄,通过句柄可以在代码中控制控件的属性。这里获取的是IDC_BUTTON_STOP这个符号的控件,看看上边那个按钮的属性图,左上角属性下一行控件的符号就是IDC_BUTTON_STOP,因此这里是获取这个按钮的句柄。然后定义了一个字符串类s,从这个按钮中读取了它的描述字符串到s中,就是之前的“开始”字符串。
然后是接下来的代码:
当s等于“开始”时,点击完应该变为“复习”,因此用SetWindowText宏来设置描述字符串,然后开始学习以后应该生成形体,这个交给OnclickedButtonNext函数,应为点击开始后的事件和每答完一道题点击下一题后的事件是一样的,因此后续事件交给这个函数去执行。
下一段代码:
当s不等于“开始”时,即等于“复习”的时候,点击按钮表示进入复习状态,这个时候按钮应该又变回到“开始”描述字符串,所以再次用SetWindowText宏设置按钮属性,然后是关于lastDone变量的判断,这个变量表示的是当前显示的题目是否已经提交了正确答案,如下图所示:
在提交了答案时,这个形体应该加入链表中,但是如果没有提交正确答案,则不应该加入链表,因此当lastDone为False时,应该把最后一个形体给删除掉。
复习的时候,输出界面应该要显示所有的已经学习过的形体,因此需要定义输出界面的大小SetScrollSizes函数定义了宽度为500,长度为形体数量乘以120,。显示效果如下:
接下来的代码就是当链表为空时表示还没有学习过,必须先学习后才能复习,当学习过以后,用traverse函数遍历生成所有的形体。
然后重新更新Canvas对象。当点击开始或者点击下一题时,我们还没有输入答案提交,应该保证下一题按钮是不可点击的,提交答案按钮为可点击的,因此在接下来的代码中设置了这一个属性,同样是先获取按钮的句柄,然后通过句柄进行设置。
所有的按钮都会有触发事件,首先需要定义好系统的流程图,根据结构图定义各个触发事件,定义好以后编译通过就可以了。
这个项目主要的任务有:
1.编写五个形体类,并合理定义好其继承关系以及定义好接口。
2.编写List类,用于存放形体对象
3.编译调试通过
注意事项:
1.实验不要求自己去画形体图像,所有的形体图像都是定义好的,即所有的梯形都是一个样子的,不会随着特征值而变化,接口在Canvas中定义和实现,只需要完成的是形体图像下边的那一行描述文字。
2.必须要保证形体的接口和其他已有代码的接口一致才能编译。
3.一定要先画系统的结构图!!!
网友评论