标签:
原文作者:@Joe Chael
原文地址:http://blog.csdn.net/qingdujun/article/details/46566307
本文写于该系统开发完成后的第二年,那时候博主大二,有一门名为“程序设计方法学”的课程,老师上课很幽默风趣,也经常给我们带来一些时事新闻。当然,课余也会给我们布置一些作业。其中“KFC宅急送”就是该作业中的一次。
隐约记得当时的要求是这样的:仿照KFC网站的页面,设计出的自己的C/S模式的 KFC宅急送 系统,要求用到设计模式的知识。
本系统由@SnailSet 与 我共同完成,其中@SnailSet负责设计模式设计,博主负责MFC界面设计。
(提示:运行效果展示请直接跳到最后面)
以下是当时写的一些文档:
(一)、 设计模式 作者:@SnailSet
本程序共有三种六个类,分别是:
1、CActivity类 及其子类:
(1)、CNormalActivity
(2)、CRebateActivity
(3)、CReturnActivity
2、CStatistics类
3、CGlobal类
类的关系已经在"KFC点餐UML图.png"中表示,下面对这些类进行简要的文字说明:
一、CActivity类是活动类的基类,给出通过活动计算收费接口。据我了解
活动能够改变最后支付结果的有三种,
1 正常收费: 不优惠
2 打折收费: 比如 打九折
3 返利收费: 比如 满100返10
分别用下面三个类描述:
1 CNormalActivity 正常收费
2 CRebateActivity 打折收费,折率可变
3 CReturnActivity 返利收费,返利条件和返利可变
还有什么“买二赠一”等活动不改变最后支付结果,所以程序里不用描述
只要收银员收两份的钱,然后送出一份。
二、CStatistics类负责统计和维护购买信息,包括计算最终收费结果、打
印小票等。对于计算终收费结果,由于不同的活动会有不同的计算方式,所
以CStatistics类必须维护一个CActivity的指针。采用策略模式。
三、CGlobal类负责维护菜单和一些全局变量,类内定义了CStatistics型指
针,还定义了一个CGlobal*型的静态变量,并且构造函数私有化,可以保证实
例唯一。采用单例模式。
(二)、MFC界面设计 作者:@Joe Chael
设计思路:
本程序参照kfc网上订餐官网(http://www.4008823823.com.cn/)设计模式仿照而来。
为了与官网界面统一,软件开发时,设置为2个界面,主界面和发票打印界面。
主界面:实现除了发票打印的所有功能,包括餐品的选择,数目和预支统计等等功能。
一、如何使用主界面:
1、界面的左边是餐品的分类,包括优惠直通车,早餐,午餐,夜宵,新餐上映几个选项,可以点击这几个选项,进行不同的选择。
2、界面的右边是餐品展示场所,这个界面是根据你右边选项的选择而动态加载的。
3、每个餐品的下面都有"-","+"号,用户可以直接点击进行选餐,这样设计给用户使用起来也比较方面,如果同一件物品需要选择多份,直接多点击几次"+"就可以了,同时,如果餐品选择多了则点击"-"。
4、用户在选择餐品的同时,可以注意到界面的底部,已经给计算出来了餐品的实际价格(原价),
5、可能用户选择的餐品有优惠的则还有一个优惠后的价格(现价)。
6、当用户选择好餐品之后,只需要点击主界面右下角的立即结算按钮就可以进行付款了。
二、如何使用发票打印界面:
该界面有两个编辑框是可以输入的,分别是 优惠券 和 实收。
优惠券:支持用户使用优惠券,这时候需要输入优惠券的面值。
实收:实际收取用户的现金,填写实收现金的时候,系统会自动计算出应找零多少。
三、如果你是管理员:
1、也许你注意到了,主界面底部有一个管理员的按钮,这是管理员登陆的。
2、点击"管理员"按钮后,会弹出认证页面(这里我已经给默认了账号密码了)。
3、认证成功后会弹出 两个选项 "修改菜价" 和 "增加菜谱"。
修改菜价:需要输入两个参数
1.菜名 :通过这个找到文件里面的菜资料。(必须存在于文件中,否则提示未找到)
2.价格 :就是你现在要设定的价格。
增加菜谱:也需要输入两个参数
1.菜名 :不能与文件中的菜名重复。(重复,则提示添加不成功)
2.价格 :菜价。
涉及到的知识:
1.树状控件的使用
★实例:KFC右边点餐部分
具体实现:在对话框的OnInitDialog()函数中,构建树列表。
1)首先,通过LoadIcon()函数加载树列表的ico图标。
2)然后,通过SetImageList()函数,为树形控件设置图像序列。
3)最后,开始树桩列表的插入,就是用InsertItem()函数,插入列表时注意句柄的选择
(树根节点不需要句柄,一级树枝,使用根节点句柄,二级树枝,使用一级树枝句柄...)
2.动态按钮,位图的使用
★实例:KFC餐品展示部分,位图和按钮的条件显示与隐藏
具体实现:主要是在MFC对话框绘制函数OnPaint() 里面实现。
1)按钮的禁用与解禁:
禁用:GetDlgItem(IDC_BT3_Z)->EnableWindow(FALSE); //其中IDC_BT3_Z为控件ID
解禁:GetDlgItem(IDC_BT3_Z)->EnableWindow(TRUE);
2)位图的动态显示:
CPaintDC pDC(this);
CBitmap tp,*OldBitMap;
CDC *dc,dcMem;
dc=GetDC();
dcMem.CreateCompatibleDC(&pDC);
tp.LoadBitmap(IDB_BT_WFL);
OldBitMap=dcMem.SelectObject(&tp);
dc->BitBlt(645,280,845,480,&dcMem,0,0,SRCCOPY);
dcMem.SelectObject(OldBitMap);
DeleteObject(&tp);
dcMem.DeleteDC();
3)按钮的隐藏与显示:
隐藏:GetDlgItem(IDC_BT6_Z)->ShowWindow(SW_HIDE); //其中IDC_BT6_Z为控件ID
显示:GetDlgItem(IDC_BT6_Z)->ShowWindow(SW_SHOW);
3.界面大小动态控制
实例:管理员入口,菜谱的修改和增加
1)获取分割控件的位置。(获得窗体大小GetWindowRect())
2)通过此控件的位置,设置窗体大小。(实现窗体的收缩与展开,设置大小函数SetWindowPos())。
(三)、成果展示
1、注意,有菜单(menu.txt),以及账单(tip.txt)在同一目录下面~
2、欢迎界面由一张大图构成
3、左边是一个树形菜单以供选择
4、点击左下角的“管理员”,可以进入系统后台
5、系统后台有一些对菜谱等进行操作的选项
(四)、原文Demo下载:
(1)http://download.csdn.net/detail/u012339743/8823777
(2)链接: http://pan.baidu.com/s/1hqripG4 密码: 4t65
标签:
原文地址:http://blog.csdn.net/qingdujun/article/details/46566307