KFC宅急送点餐系统开发 & MFC动态树形控件使用
来源:互联网 发布:网络红人菁菁淘宝店 编辑:程序博客网 时间:2024/06/07 07:02
本文写于该系统开发完成后的第二年,那时候博主大2,有一门名为《程序设计方法学》的课程,老师上课很幽默风趣,也经常给我们带来一些时事新闻。当然,课余也会给我们布置一些作业。其中“KFC宅急送点餐系统开发”就是该作业中的一次。隐约记得当时的要求是这样的:仿照KFC网站的页面,设计出的自己的C/S模式的 KFC宅急送 系统,要求用到设计模式的知识。本系统由@SnailSet Yin与 我共同完成,其中@SnailSet负责设计模式设计,博主负责MFC界面设计。(提示:运行效果展示请直接跳到最后面)。
目录:
- 设计模式 作者SnailSet Yin
- CActivity基类
- CStatistics类
- CGlobal类
- MFC界面设计 作者qingdujun
- 设计思路
- 如何使用主界面
- 如何使用发票打印界面
- 如果你是管理员
- 涉及到的知识
- 树状控件的使用
- 动态按钮位图的使用
- 界面大小动态控制
- 成果展示
- Demo下载
以下是当时写的一些文档,
设计模式 作者:@SnailSet Yin
本程序共有三种六个类,分别是:
- CActivity类 及其子类:
- CNormalActivity
- CRebateActivity
- CReturnActivity
- CStatistics类
- CGlobal类
类的关系如下图,这里对这些类进行简要的文字说明,
CActivity基类
CActivity类是活动类的基类,给出通过活动计算收费接口。据我了解活动能够改变最后支付结果的有三种,
- 正常收费: 不优惠;
- 打折收费: 比如 打九折;
- 返利收费: 比如 满100返10。
分别用下面三个类描述:
- CNormalActivity 正常收费;
- CRebateActivity 打折收费,折率可变;
- CReturnActivity 返利收费,返利条件和返利可变
还有什么“买二赠一”等活动不改变最后支付结果,所以程序里不用描述只要收银员收两份的钱,然后送出一份。
CStatistics类
CStatistics类负责统计和维护购买信息,包括计算最终收费结果、打印小票等。对于计算终收费结果,由于不同的活动会有不同的计算方式,所以CStatistics类必须维护一个CActivity的指针。采用策略模式。
CGlobal类
CGlobal类负责维护菜单和一些全局变量,类内定义了CStatistics型指针,还定义了一个CGlobal*型的静态变量,并且构造函数私有化,可以保证实例唯一。采用单例模式。
MFC界面设计 作者:@qingdujun
设计思路
本程序参照kfc网上订餐官网(http://www.4008823823.com.cn/)设计模式仿照而来。为了与官网界面统一,软件开发时,设置为2个界面,主界面和发票打印界面。
主界面:实现除了发票打印的所有功能,包括餐品的选择,数目和预支统计等等功能。
如何使用主界面?
界面的左边是餐品的分类,包括优惠直通车、早餐、午餐、夜宵、新餐上映几个选项,可以点击这几个选项,进行不同的选择。
界面的右边是餐品展示场所,这个界面是根据你右边选项的选择而动态加载的。
每个餐品的下面都有”-“,”+”号,用户可以直接点击进行选餐,这样设计给用户使用起来也比较方面,如果同一件物品需要选择多份,直接多点击几次”+”就可以了,同时,如果餐品选择多了则点击”-“。
用户在选择餐品的同时,可以注意到界面的底部,已经给计算出来了餐品的实际价格(原价),可能用户选择的餐品有优惠的则还有一个优惠后的价格(现价)。
当用户选择好餐品之后,只需要点击主界面右下角的立即结算按钮就可以进行付款了。
如何使用发票打印界面?
该界面有两个编辑框是可以输入的,分别是 优惠券 和 实收。
- 优惠券:支持用户使用优惠券,这时候需要输入优惠券的面值。
- 实收:实际收取用户的现金,填写实收现金的时候,系统会自动计算出应找零多少。
如果你是管理员?
也许你注意到了,主界面底部有一个管理员的按钮,这是管理员登陆的;点击”管理员”按钮后,会弹出认证页面(这里我已经给默认了账号密码了);认证成功后会弹出 两个选项 “修改菜价” 和 “增加菜谱”。
- 修改菜价:需要输入两个参数,
- 菜名 :通过这个找到文件里面的菜资料。(必须存在于文件中,否则提示未找到);
- 价格 :就是你现在要设定的价格。
- 增加菜谱:也需要输入两个参数,
- 菜名 :不能与文件中的菜名重复。(重复,则提示添加不成功);
- 价格 :菜价。
涉及到的知识
树状控件的使用
★实例:KFC右边点餐部分
具体实现:在对话框的OnInitDialog()函数中,构建树列表。
- 首先,通过LoadIcon()函数加载树列表的ico图标。
- 然后,通过SetImageList()函数,为树形控件设置图像序列。
- 最后,开始树桩列表的插入,就是用InsertItem()函数,插入列表时注意句柄的选择(树根节点不需要句柄,一级树枝,使用根节点句柄,二级树枝,使用一级树枝句柄…)。
动态按钮,位图的使用
★实例:KFC餐品展示部分,位图和按钮的条件显示与隐藏
具体实现:主要是在MFC对话框绘制函数OnPaint() 里面实现。
- 按钮的禁用与解禁
- 禁用:GetDlgItem(IDC_BT3_Z)->EnableWindow(FALSE); //其中IDC_BT3_Z为控件ID
- 解禁:GetDlgItem(IDC_BT3_Z)->EnableWindow(TRUE);
位图的动态显示
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();
按钮的隐藏与显示:
- 隐藏:GetDlgItem(IDC_BT6_Z)->ShowWindow(SW_HIDE); //其中IDC_BT6_Z为控件ID
- 显示:GetDlgItem(IDC_BT6_Z)->ShowWindow(SW_SHOW);
界面大小动态控制
★实例:管理员入口,菜谱的修改和增加
- 获取分割控件的位置。(获得窗体大小GetWindowRect())
- 通过此控件的位置,设置窗体大小。(实现窗体的收缩与展开,设置大小函数SetWindowPos())。
成果展示
Demo下载:
链接: http://pan.baidu.com/s/1hqripG4 密码: 4t65
- KFC宅急送点餐系统开发 & MFC动态树形控件使用
- KFC宅急送点餐系统开发
- MFC 树形控件使用
- MFC 树形控件的使用
- MFC树形控件
- MFC树形控件
- MFC树形控件
- 使用MFC开发ActiveX控件
- 使用MFC开发ActiveX控件
- 使用MFC开发ActiveX控件
- 使用MFC开发ActiveX控件
- 使用MFC开发ActiveX控件
- 使用MFC开发ActiveX控件
- 使用MFC开发ActiveX控件
- 使用MFC开发ActiveX控件
- 使用MFC开发ActiveX控件
- 使用MFC开发ActiveX控件
- 使用MFC开发ActiveX控件
- 设计模式
- Linux类别开篇
- PythonWeb开发Django框架学习(六)Tempalte过滤器
- 棋盘问题
- 【原创】用拓展欧几里得解不定方程 ※POJ-1061-青蛙的约会
- KFC宅急送点餐系统开发 & MFC动态树形控件使用
- 套接字实现Udp服务器
- Struts2系列之HelloAction
- 预估表和索引空间容量的方法
- Python 2.x与Python3.x中inpu的区别
- Linux下VI/VIM提示没有权限保存时候的解决方法
- Calendar 计算某固定日期到当前时间相差的月份
- [未解决][lintcode]带最小值操作的栈
- AndroidStudio工程中"R"文件的位置