QT/MFC课程设计参考选题[2023-09-04]

发布时间 2023-09-04 18:40:25作者: bigbeet

QT/MFC课程设计参考选题[2023-09-04]

课程设计参考选题

课程设计作为课程所学内容的实践,要求采用面向对象系统分析与设计方法,首先对问题进行需求分析,识别类与对象,设计合理的类结构与程序结构实现程序功能(恰当应用教材所介绍的各种数据结构和算法),用C++语言编写程序;然后设计各种可能的数据(测试对象)对程序进行测试,观察运行结果是否正确,确保在已考虑到的范围内的测试对象都能得到正确结果。
尽管研究型学习提倡学生自选题目,但给出一些参考选题对多数小组是有帮助的。下面的课程设计题目分管理系统(题目一~题目十)和计算、图形与多媒体系统(其余)两大类,要求用MFC应用程序实现。使用文档/视图结构,用文档类存储数据,用序列化方法保存文档;使用统一的Windows图形用户界面,对话框中用合适的控件,如按钮、编辑框、组合框、列表框、单选钮、复选钮等。最后要对软件进行注册。
每个小组可以在管理系统题和其余类型中各选作一题。

题目1: 银行定期储蓄管理系统

[要求] 该系统存储以下信息:1.每笔存款的储户信息和办理该笔存款的营业员信息,这些信息存放于存款文件中。其中,储户信息包括:帐号,姓名,密码,地址,储种(定期1年、3年、5年),本金,收储日期,是否已挂失和挂失日期,营业员信息包括:接待该储户的营业员的姓名与工号。2.每笔取款的储户信息和办理该笔取款的营业员信息,这些信息存放于取款文件中。
系统功能要求如下;
(1) 创建存款文件(第一次输入储户信息时);
(2) 创建取款文件(第一次办理取款时); (3) 接收储蓄。接收储户与营业员信息并将以上信息添加到存款文件中;
(4) 处理挂失。根据储户提供的帐号、姓名、密码、地址、储种,核查有无此项存款,有则对此帐号加入挂失标记,若无此项存款,则需判断是否领走还是未发生过这笔存款。
(5) 办理取款:

  1. 根据储户提供的存款单(上面有帐号、姓名、储种、本金、日期)判断是否到期,检查有否挂失,根据储户提供的密码判断是否正确。若以上判断通过,执行后面3步。
  2. 在取款文件中添加这笔取款的储户和营业员的所有信息和取款日期,以便复查。
  3. 打印利息单,其内容包括:帐号、姓名、储种、起息日期,支取日期、本金、利息和支取金额。利息计算方法如下:1年到期利率1.98%,2年到期利率2.25%,3年到期利率2.52%,5年到期利率2.79%,每逾期一天,每天利率0.02‰,若未到期提前支取,按每天利率0.02‰计,每月按30天计算,利息税按20%扣除。
  4. 在存款文件中删除这笔存款。
    (6) 统计今后3天每天到期的储金数,以便备款。
    [提示]
    创建存款信息类,包含储户信息和营业员信息,派生自CObject类,并实现序列化操作;创建取款信息类,包含必要信息,也应是可序列化的类;在文档类中添加存储存款信息类和取款信息类的链表或数组(可用MFC的群类),在文档类Serialize函数中实现序列化;存款取款都通过菜单或工具栏按钮打开对话框,在对话框中输入信息;每发生一次存款,向存款链表中添加一个对象,每发生一次取款,从存款链表中删除一个对象,向取款链表中添加一个对象。

题目2: 汽车客运公司售票系统

[要求] 设某客运公司每日向10个城市发一个直达班车(中途不停)。每天都发售当天及其后两天的车票。该系统在磁盘上存储了以下信息:1. 三天每个班次的基本信息,包括:每个班次的班次号、发车时间、终点城市,座位数量;2.三天每个班次的旅客登记表,表项有:姓名、身份证号、座号。
系统功能要求如下:
(1) 创建存储一天(开始时创建今、明、后三天的,以后每天创建后天的)每个班次的基本信息的存储系统;
(2) 创建每个班次的旅客登记表(每次售该班次的客票时创建);
(3) 办理售票,即在旅客登记表中添加旅客信息(座位号不能重);
(4) 办理退票,即在旅客登记表中删除旅客信息;
(5) 可查询当前指定班次的余票数和座位号;
(6) 输出指定班次的旅客登记表(发车前交驾驶员用)。
[提示]
创建一个班次信息类,包含每个班次的班次号、发车时间、终点城市,座位数量、已售数量,应派生自CObject类,并实现序列化操作;在文档类中添加存储班次类的链表或数组(可用MFC的群类或直接定义班次数组),在文档类Serialize函数中实现序列化;通过菜单打开对话框,在对话框中创建班次信息、售票、退票,并更新文档数据;每当班次信息发生变化(有新班次增加或售票或退票),输出一次当前班次信息(用多个对话框);实现班次查询功能,用视图类显示查询结果;班次信息保存到文件并可读出。

题目3:西文图书室管理系统

该系统存储以下信息:1、对于同一作者同一书名的书,存储书名、书目编号、作者名、库存册数(不包括已借出的)、已借出册数。2、对于每一本书还要存储一个登录号(这是区别每一本书的唯一标志)、当前借阅该书的读者姓名与借书证号、借阅日期。
系统功能要求如下:
(1) 创建存储系统;
(2) 增加新书;
(3) 删去无使用价值的旧书;
(4) 处理借书。要求读者提供书目号与登录号.一位读者限借2册。(应检查库中有无读者要求借阅的图书,检查该读者已借阅图书数量);
(5) 处理还书;
(6) 查询某登录号的书是谁借了。
[提示]
创建书信息类,包括书名、书目编号、作者名、登录号(这是区别每一本书的唯一标志)、当前借阅该书的读者姓名与借书证号、借阅日期,还定义两个静态数据成员库存册数(不包括已借出的)、已借出册数,用于记录同一作者同一书名的书的借阅情况,应派生自CObject类,并实现序列化操作;在文档类中添加表示库存书和已借出书的链表或数组(可用MFC的群类),在文档类Serialize函数中实现序列化;通过菜单打开对话框,在对话框中实现增加新书、借书、还书和查询功能并及时更新文档(用多个对话框);视图类显示查询结果;库存书和已借出书的信息保存到文件并可读出。

题目4:职工信息管理系统

该系统在磁盘上存储某单位所有职工的基本信息,对于每一个职工存储:职工编号、姓名、性别、出生年月、职称、最后学历,工资和婚否。
系统功能要求如下:

(1) 创建存储该单位职工信息的存储系统。(第一次输入职工基本信息时);
(2) 增加职工信息,增加新职工时输入新职工的基本信息;
(3) 删除某职工的基本信息。(如,死亡或离职);
(4) 修改某职工(指定职工编号)的某些信息(如,加工资、获得新学位、晋升职称、结婚或离婚)。
(5) 可以输出符合某种特征的职工信息列表,包括:
1) 全体职工信息列表;
2) 某职称的职工信息列表;
3) 某年月以后出生的职工信息列表;
4) 某年月以前出生的职工信息列表;
5)未婚职工信息列表。
[提示]
创建职工信息类,包括职工编号、姓名、性别、出生年月、职称、最后学历、工资和婚否,应派生自CObject类,并实现序列化操作;在文档类中添加存储在职职工的链表或数组(可用MFC的群类),在文档类Serialize函数中实现序列化;通过菜单打开对话框,在对话框中实现增加新职工、删除某个职工、修改信息和查询功能并及时更新文档(用多个对话框);视图类显示查询结果;职工信息保存到文件并可读出。

题目5:教学事务管理系统

 该系统要求存储如下信息:1.注册信息。每个学期的注册信息应包括每个已注册学生的班级代号,学号、姓名、注册的学期。2. 选课信息。包括已注册的每个学生每个学期所选课程,本程序仅限一年级两个学期。3.成绩。每个学生所选的课程的考核成绩,包括补考成绩。
系统功能要求如下:

(1) 能输入注册信息、选课信息和成绩;
(2) 能输出以下表格:
1) 分班的某门课程不及格的名单(含学号、姓名、成绩);
2) 某门课程全年级前5名的学号、姓名、成绩;
3) 某门课程的选修者名单(含学号);
4) 某个学生本学期的成绩单;
5) 某门课程每个班的总平均分(从高到低排列);
6) 某门课程某班的成绩单(按学号排列)。
[提示]
创建学生信息类,包括注册信息、选课信息和成绩,派生自CObject类,并实现序列化操作;在文档类中添加存储注册学生的链表或数组(可用MFC的群类),在文档类Serialize函数中实现序列化;通过菜单打开对话框,在对话框中输入注册、选课、输入成绩、查询要求(用多个对话框);视图类显示查询结果;学生信息保存到文件并可读出。

题目6: 工资管理系统

该系统在磁盘上存储了某单位上月全体职工的工资信息。对于每一位职工存储以下信息:月份,职工编号,基本工资,津贴,岗贴,补贴,房贴,交通费,应发数,房租,储蓄,会费,个人所得税,应扣数,实发数。个人所得税计算方法设为:工资少于800元的部分为0;800~2000元的部分为5%;2000~5000元的部分为10%;5000元以上的部分为20%。
系统功能要求如下:

(1) 创建存储职工工资信息的存储系统;
(2) 添加某职工的工资信息(增加新职工时用);
(3) 删除某职工的工资信息(职工离职或死亡时用);
(4) 修改某职工的部分工资信息(当月开始增加或减少某些项工资或扣款数变化);
(5) 输出指定编号职工的工资信息(借查询用);
(6) 输出当月全体职工的工资信息(发工资用)。
[提示]
创建职工工资信息类,包含姓名,月份,职工编号,基本工资,津贴,岗贴,补贴,房贴,交通补贴,应发数,房租,储蓄,会费,个人所得税,应扣数,实发数等,派生自CObject类,实现序列化操作;在文档类中添加存储职工工资信息的链表或数组(可用MFC的群类),在文档类Serialize函数中实现序列化;通过菜单打开对话框,在对话框中实现创建、添加、修改、删除和查询功能并及时更新文档(用多个对话框);视图类显示查询结果;输入的信息保存到文件并可读出。

题目7:教师住房管理系统

该系统在磁盘中存储全校住学校宿舍的教师住房信息。对每一住户存储如下信息:户主:姓名,性别,职称(教授、副教授、讲师、助教),出生年月,参加工作年月,最后学历(博士、硕士、本科、其它);家庭成员:对每一个成员,存储姓名、性别、出生年月:现住房等级:分居在集体宿舍、一室、一室一厅、二室、二室一厅、三室、三室一厅。现住房面积:(单位;平方米)。当学校有房源后,各住户可提出分房申请(含姓名、申请住房的等级)。
系统功能要求如下:

(1) 创建存储教师住房信息的存储系统;
(2) 分房时,系统应为申请者输入申请信息(存盘)。对于所有分房者按申请等级不同(共6级)分别按分数高低列表(一种等级一张表)输出(同时存盘)。计分包括4方面。职称分:教授,20分;副教授,16分;讲师,12分;助教,8分。工龄分:每年0.5分;每月0.0416分。年龄分:每岁0.1分;每月0.0083分。学龄分:博士,4.5分;硕士,3.25分,本科,2分;其它,0分。每张表应含申请等级、姓名、职称、参加工作年月、最后学历、原住房等级、职称分、工龄分、年龄分、学龄分及总分。每张表先按申请等级分类,再按总分从高到低排列。
(3) 可输出婚后仍分居集体宿舍者的户主姓名及出生年月,这类教师的总数。
(4) 可输出未住上三室一厅或三室的副教授,教授姓名及现住房标准,这类教师的总数。
(5) 可输出未住上一室一厅及以上等级的具有博士学位的教师姓名及住房标准。
(6) 可输出全校教师人均(包括家庭人口)住房面积。
[提示]
创建教师住房信息类,包书户主信息,家庭成员信息,住房情况等(其中可以定义结构体或类或枚举类型表示某部分信息,如住房等级可用枚举类型表示),应派生自CObject类,并实现序列化操作;在文档类中添加存储教师住房信息的链表或数组(可用MFC的群类),在文档类Serialize函数中实现序列化;通过菜单打开对话框,在对话框中输入有关信息和查询信息(用多个对话框);视图类显示查询结果;教师住房的信息保存到文件并可读出。

题目8: 国际马拉松赛信息管理系统

该马拉松赛比赛项目有两个:男子全程和女子半程。两个项目同时同场地进行。奖项有:男子前五名,女子前五名,男子团体(一国一个队)前三名,女子团体(一国一个队)前三名。团体成绩评定方法(以男队为例):某国男队的前三名运动员用时之和为该国总成绩,并以此排定名次。
该系统在磁盘上存储以下信息:
(1) 运动员报名单。对于每一位报名的运动员包括:姓名、性别、年龄和国名;
(2) 运动员号码单.对于每一位报名的运动员包括:姓名、性别、号码和国名;
(3) 世界男子全程马拉松最好成绩,世界女子半程马拉松最好成绩;
(4) 到达终点的每个运动员的号码和用时。
系统功能要求如下:
(l) 比赛前输入运动员报名单并生成运动员号码单;
(2) 比赛后输入到达终点的每个运动员的号码和用时;
(3) 可输出男、女团体前三名的名次和国名。(供颁奖用);
(4) 可输出男、女个人前五名的名次和国名。(供颁奖用)若有超过世界最好成绩者,应输出有关信息;
(5) 可输出男子个人成绩表,按成绩从优到劣排列。表中对每个人应包括:名次、姓名、国名、成绩,是否超过世界最好成绩;
(6) 可输出女子个人成绩表,表的项目和排列方式同5;
(7) 可输出男子50岁以上选手的成绩表,排列方式同5,表项增加年龄;
(8) 可输出女子50岁以上选手的成绩表,排列方式与表项同7。
[提示]
创建运动员信息类,包括姓名、性别、年龄、国名、报名号码和运动成绩,应派生自CObject类,并实现序列化操作;在文档类中添加表示男运动员和女运动员的链表或数组(可用MFC的群类),在文档类Serialize函数中实现序列化;通过菜单打开对话框,在对话框中实现报名、输出号码单、及题目要求的其它查询功能并及时更新文档(用多个对话框);在视图类中输出查询结果;比赛结果的信息保存到文件并可读出。

题目9: 篮球联赛个人技术数据处理系统

设某篮球联赛要统计20名著名球员个人技术数据。要求实现篮球联赛个人技术数据处理系统。该系统在磁盘上存储如下信息:1.每场球赛的个人技术数据,一场球一个人的技术数据包括:姓名、所属队名、三分球个数、篮板球个数、扣篮成功次数、抢断次数、得分,比赛日期。2.个人技术数据汇总表。表中反映了每个人的技术数据的累计结果。表项为:姓名、三分球总数、篮板球总数、扣篮成功总次数、抢断总次数、得分总数、比赛场数。
系统功能要求如下:

(1) 创建存储每场球赛个人技术数据的存储系统(第一次输入个人技术数据时),然后自动创建存储个人技术数据汇总表的存储系统;
(2) 每场比赛后,添加个人技术数据,然后自动修改个人技术数据汇总表;
(3) 能输出当前的个人技术数据汇总表;
(4) 能输出指定技术项目平均每场数据较高的前三名运动员的姓名、所在队名和平均每场的单项数据;
(5) 能输出某个队中所有优秀运动员的个人成绩。
[提示]
创建运动员信息类,姓名、所属队名、三分球个数、篮板球个数、扣篮成功次数、抢断次数、得分,比赛日期,应派生自CObject类,并实现序列化操作;在文档类中添加存储运动员信息的链表或数组(可用MFC的群类),在文档类Serialize函数中实现序列化;通过菜单打开对话框,在对话框中实现输入数据和题目所要求的查询功能并及时更新文档(用多个对话框);在视图类中输出查询结果;运动员信息保存到文件并可读出。

题目10: 男子五项全能比赛信息管理系统

比赛项目为:100米、110米栏、1500米、跳高和铅球。运动员的总成绩是,每项运动成绩折合成分数再由五个分数相加形成;运动成绩与分数的对应关系如下:

(1) 100米
14”	13”	12”	11”	10”	9.5”
300	400	600	900	1300	1600
2. 110米栏
17”	16”	15”	14”	13”	12”
300	400	600	900	1300	1700
(3) 1500米
6’00	5’30	5’00	4’30	4’00	3’30
200	300	500	800	1200	1700
(4) 跳高
1.70M	1.90 M	2.10 M	2.25 M	2.35 M	2.45 M
200	300	500	800	1200	1700

(5) 铅球
14 M	16 M	18 M	20 M	22 M	24 M
100	200	400	700	1100	1600

凡遇成绩与表格数据不符,按线性插值取值。
该系统存储如下信息:
(1) 报名表。包含每位运动员的号码、姓名、出身年月、身高、体重。人数不超过50人;
(2) 比赛后,每人每项的运动成绩。
该系统功能如下:
(1) 输入报名表和比赛后的每人每项的运动成绩;
(2) 可输出成绩表,表项有:姓名、5个项目成绩和得分、总分和名次;
(3) 可输出前6 名的领奖名单,表项有:姓名、总分和名次;
(4) 可输出产生某体重特征(>或<指定体重)的运动员成绩表(供研究用)。
[提示]
创建运动员信息类,包含号码、姓名、出身年月、身高、体重、5个项目成绩、得分、总分和名次等信息,根据需要定义函数成员,完成程序功能,应派生自CObject类,并实现序列化操作;在文档类中添加表示运动员信息的链表或数组(可用MFC的群类),在文档类Serialize函数中实现序列化;通过菜单打开对话框,在对话框中实现报名、成绩输入和题目要求的查询功能并及时更新文档(用多个对话框);在视图类中输出查询结果;运动员信息可保存到文件并可读出。

题目11:动画播放器程序

[要求] 可以通过动画控件播放动画,用文件公用对话框打开AVI文件并播放,也可以通过鼠标左右键控制;播放时若用鼠标左键单击画面,可以暂停播放,若用右键单击画面,可以直接对画面进行播放、暂停、停止等控制,可以设置全屏效果。
[提示] 使用动画控件ActiveMovie,该控件内嵌了Microsoft MPEG音频解码器和Microsoft MPEG视频解码器,能够支持音频文件和视频文件。ActiveMovie控件的两个函数GetVolume()和SetVolume(),可以实现音量控制。
[设计方案提示]
(1) 建立一个基于对话框的工程,并为这个对话框定义下面8个按钮:

OPEN				打开AVI文件
PLAY				开始播放文件
PAUSE				暂停播放
STOP				停止播放
FULLSCREEN			为设置全屏按钮
EXIT					退出
ADD					为增加音量按钮
REDUCE				为减少音量按钮

另外加入GROUP BOX控件,将ADD和REDUCE按钮设为一组。
(2) 使用动画播放控件ActiveMovie进行动画播放。方法是在Visual C++集成开发环境中,依次选择“Project | Add To Project | Components And Controls”菜单项,在出现的“Components And Controls Gallery”对话框中选择“Registered Active Controls”文件夹,再选择“ActiveMovie Control Object”项,单击“Insert”按钮后关闭该对话框,ActiveMovie便出现在控件面板中。将控件添加到对话框模板,并为其添加对应的变量。ActiveMovie的成员函数介绍如下:
ActiveMovie::Run(); //播放文件
ActiveMovie::Pause(); //暂停播放
ActiveMovie::Stop(); //停止播放
音量调整方法如下面代码所示:

long m_volume=ActiveMovie::GetVolume();			//获取当前音量
ActiveMovie::Pause();//暂停播放
ActiveMovie::SetVolume ( m_volume +100);			//用于增加当前音量
ActiveMovie::SetVolume ( m_volume -100);			//用于减小当前音量

实现满屏播放方法如下:

ActiveMovie::Pause();							//暂停播放
ActiveMovie::SetFullScreenMode(true);				//设置全屏模式
ActiveMovie::SetMovieWindowSize(SW_SHOWMAXIMIZED)	
ActiveMovie::Run();							//继续播放文件

(3) 为各控件添加按键消息响应函数,实现各项功能。

题目12:吹泡泡程序,基于对话框的应用

[要求] 用鼠标左键点击对话框上的某个区域即可产生一个大小随机确定的圆形泡泡,通过通用的颜色对话框选择颜色,绘出所选颜色的泡泡。
[提示] 采用基于对话框的应用程序框架,实现吹彩色泡泡程序。对话框上建立一个矩形区域作为吹泡泡的客户区,并通过一个“颜色设置”按钮来设置泡泡颜色。
[设计方案提示]
(1) 创建基于对话框的应用程序框架,使用对话框模板编辑器编辑作为主界面窗口的对话框模板,并将对话框大小调整到合适大小。添加“颜色设置”按钮。
(2) 为对话框模板添加一个Picture控件,调整其合适的位置和大小作为吹泡泡客户区,在该区域内按鼠标左键,显示一个泡泡。将其Type设置为Frame,Color设置为black,并且设置Sunken属性(在Styles 选项卡中)。
(3) 使用ClassWizard为对话框类添加一个鼠标左键消息响应函数OnLButtonDown()(此函数用于产生泡泡)和按钮命令消息响应函数OnColor(),用颜色对话框选择颜色。
(4) 定义CRect数组,作为泡泡(圆)的外围矩形,用于保存泡泡;定义COLORREF数组用于保存泡泡颜色,一个泡泡对应一个颜色。

题目13:模拟简单计算器程序

[要求] 该计算器使用数字按钮控件输入数据,并有“加”、“减”、“乘”、“除”、“平方根”和“倒数”计算功能,要进行混合运算。参考主教材7.3.2节。
[提示] 在本程序中,用按钮控件输入数字和操作命令,EDIT控件输出结果和显示输入值。在头文件中,包含了许多有关数学运算函数,利用这些函数完成计算功能。
[设计方案提示]
(1) 创建一个基于对话框的应用程序框架。
(2) 修改对话框模板,添加各种控件。其中,用于显示结果的EDIT控件设置属性Number和Read-Only;添加20个按钮控件,其中10个是数字输入键,另外十个是操作输入键。
(3) 添加相应的代码。
可以同一个函数响应数字按键消息,用另一个函数处理所有的运算操作,需要用到消息范围映射宏,将多个命令消息或多个控件消息映射到同一个响应函数。有三组宏用于映射指定范围的消息。

ON_COMMAND_RANGE  				//响应指定范围内的命令消息
ON_UPDATE_COMMAND_UI_RANGE	  	//响应指定范围内的命令更新消息
ON_CONTROL _RANGE				   	//响应指定范围内的控件消息
对于本例,可以使用ON_ CONTROL _RANGE,因为ClassWizard不处理区域,需在对话框的消息映射表中手工添加如下的消息映射宏:
ON_ CONTROL _RANGE(BN_CLICKED, IDC_NUM1,IDC_NUM10,OnNumKey)
ON_ CONTROL _RANGE(BN_CLICKED, IDC_OPERAT1,IDC_ OPERAT10,OnOperatKey)

其中第一参数表示单击,第二、三个参数必须是控件ID,其ID值应该是连续的(对COMMAND无第一参数)。
在对话框的头文件添加如下代码:

afx_msg void OnNumberKey(UINT nID);	 	//此函数用于处理数字键单击事件
afx_msg void OnOperationKey(UINT nID);	//此函数用于处理操作键单击事件

其中nID为控件ID,表示按下的控件ID值。
(4) 定义double类型的数据成员,用于存储将要进行运算的数字;再根据需要定义其它数据成员用于记录运算状态。

题目14:二维平面图形设计

[要求]
(1) 可以通过菜单或者工具栏按钮,选择绘画工具,画不同的平面图形(直线、圆弧、矩形、圆角矩形、圆、椭圆)。
(2) 可通过颜色对话框选择不同的颜色,使所画图形具有不同颜色。
(3) 可保存文档所画图形,并能打开该图形。
[设计方案提示]
(1) 使用MFC AppWizard来建立SDI应用程序基本框架。
(2) 为视图类重定义OnLButtonDown()、OnLButtonUp()、OnMouseMove()等函数。在OnLButtonDown()函数中用SetCapture()捕获鼠标,使随后的鼠标消息都被送往视图窗口;调用CWnd的成员函数GetClientRect()获取窗口客户区的坐标,调用CWnd的成员函数ClientToScreen()将窗口客户区坐标转换为屏幕坐标。最后,调用Windows API函数ClipCursor()将光标限定在窗口客户区内;接着创建与视图窗口有关的设备文本对象;在OnLButtonUp()函数中,调用ReleaseCapture()函数释放鼠标的使用。
(3) 定义图形类的体系,可以定义一个图形元素基类,派生自CObject,再派生其它具体的图形元素类,为各类定义序列化函数。
(4) 使用图形绘制函数,可参见本实践教材3.6节。
(5) 在文档类中定义存储图形元素对象的数组或链表,定义文档类的序列化函数,实现文档数据的读写。

题目15: 拼图游戏设计

[要求] 将一张图片切分成若干小片,打乱顺序任意显示。用户可用鼠标拖动各小片到正确位置以恢复原来的图像。要求有不同的难度等级,切分成不同的片数。完成拼图后,提交,程序应该判断是否拼成一幅完整图形。还应有图片还原的功能。
[设计方案提示]
(1) 选一幅漂亮的图片,装入项目资源,该图片作为拼图的底图。
(2) 为框架窗口类定义成员变量及功能如下表所示:

表4.9 框架窗口类的成员变量
变量类型 变量名 用途

CBitmap	m_bmp	保存位图
Int	m_nWidth	保存位图宽
Int	m_nHeight	保存位图高
Int	m_nColCount	保存每行切分的拼图块数
Int	m_nRowCount	保存每列切分的拼图块数
CRect	m_rectChips[MAX_CHIPS]	保存每个切分块的位置
Int	m_nChipWidth	保存切分块宽
Int		m_nChipHeight	保存切分块高

(3) 每个拼图块的位置相邻,实现自动拼图功能。
(4) 根据用户选择的难度,将图片切分成若干片数,用随机数产生它的位置进行初始化。
定义函数完成拼图块的分割和初始化。
(5) 如何判断用户拼图成功是一个关键问题。方法提示如下:检验每一行拼图块中,其顶点y坐标是否相等(允许有适量误差),并检验在每行拼图块中,某个拼图块的右边坐标是否等于下一拼图块的左边坐标,用类似方法判断同一列上各切分块的位置。

题目16:吹泡泡程序,应用文档/视图结构

[要求]
(1) 用鼠标左键随机在客户区任何地方点击,可产生一个圆形的泡泡(泡泡大小随机产生)。
(2) 可通过颜色对话框选择不同的颜色,绘出不同颜色的泡泡。
(3) 可以保存文档,并能打开。
[设计方案提示]
(1) 使用MFC AppWizard来建立SDI基本框架。
为视图类定义OnLButtonDown()、OnLButtonUp函数。在OnLButtonDown()函数中用SetCapture()捕获鼠标,使随后的鼠标消息都被送往视图窗口;调用CWnd的成员函数GetClientRect()获取窗口客户区的坐标,调用CWnd的成员函数ClientToScreen()将窗口客户区坐标转换为屏幕坐标。最后,调用Windows API函数ClipCursor()将光标限定在窗口客户区内;接着创建与视图窗口有关的设备文本对象;然后调用SetROP2()设置绘图模式为R2_COPYPEN;在OnLButtonUp()函数中,调用ReleaseCapture()函数释放鼠标的使用。
(2) 头文件中定义新类CBubble, 派生自CObject,用于存放泡泡的包含矩形,并为其定义序列化函数,完成序列化所要求的工作。
(3) 如下定义:

class CBubble:public CObject{
protected:
	CRect m_pRect;					//存放椭圆的包含矩形
	COLORREF m_pColor;				//存放椭圆的颜色信息
public:
	CBubble(){}
	DECLARE_SERIAL(CBubble)
	CBubble(CRect rect,COLORREF Color);//构造函数用于初始化泡泡的数据成员
	virtual void Serialize(CArchive &ar);
	void Drawing(CDC *pDC);			//用于画泡泡
};

可根据具体情况增加其它数据成员。
(4) 类中定义函数和数据成员,完成程序功能。