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

本程序共有三种六个类,分别是:

  1. CActivity类 及其子类:
    • CNormalActivity
    • CRebateActivity
    • CReturnActivity
  2. CStatistics类
  3. CGlobal类

类的关系如下图,这里对这些类进行简要的文字说明,

这里写图片描述

CActivity基类

CActivity类是活动类的基类,给出通过活动计算收费接口。据我了解活动能够改变最后支付结果的有三种,

  1. 正常收费: 不优惠;
  2. 打折收费: 比如 打九折;
  3. 返利收费: 比如 满100返10。

分别用下面三个类描述:

  1. CNormalActivity 正常收费;
  2. CRebateActivity 打折收费,折率可变;
  3. CReturnActivity 返利收费,返利条件和返利可变

还有什么“买二赠一”等活动不改变最后支付结果,所以程序里不用描述只要收银员收两份的钱,然后送出一份。

CStatistics类

CStatistics类负责统计和维护购买信息,包括计算最终收费结果、打印小票等。对于计算终收费结果,由于不同的活动会有不同的计算方式,所以CStatistics类必须维护一个CActivity的指针。采用策略模式

CGlobal类

CGlobal类负责维护菜单和一些全局变量,类内定义了CStatistics型指针,还定义了一个CGlobal*型的静态变量,并且构造函数私有化,可以保证实例唯一。采用单例模式

MFC界面设计 作者:@qingdujun

设计思路

本程序参照kfc网上订餐官网(http://www.4008823823.com.cn/)设计模式仿照而来。为了与官网界面统一,软件开发时,设置为2个界面,主界面和发票打印界面。

主界面:实现除了发票打印的所有功能,包括餐品的选择,数目和预支统计等等功能。

如何使用主界面?

界面的左边是餐品的分类,包括优惠直通车、早餐、午餐、夜宵、新餐上映几个选项,可以点击这几个选项,进行不同的选择。

界面的右边是餐品展示场所,这个界面是根据你右边选项的选择而动态加载的。

每个餐品的下面都有”-“,”+”号,用户可以直接点击进行选餐,这样设计给用户使用起来也比较方面,如果同一件物品需要选择多份,直接多点击几次”+”就可以了,同时,如果餐品选择多了则点击”-“。

用户在选择餐品的同时,可以注意到界面的底部,已经给计算出来了餐品的实际价格(原价),可能用户选择的餐品有优惠的则还有一个优惠后的价格(现价)。

当用户选择好餐品之后,只需要点击主界面右下角的立即结算按钮就可以进行付款了。

如何使用发票打印界面?

该界面有两个编辑框是可以输入的,分别是 优惠券 和 实收。

  • 优惠券:支持用户使用优惠券,这时候需要输入优惠券的面值。
  • 实收:实际收取用户的现金,填写实收现金的时候,系统会自动计算出应找零多少。

如果你是管理员?

也许你注意到了,主界面底部有一个管理员的按钮,这是管理员登陆的;点击”管理员”按钮后,会弹出认证页面(这里我已经给默认了账号密码了);认证成功后会弹出 两个选项 “修改菜价” 和 “增加菜谱”。

  1. 修改菜价:需要输入两个参数,
    • 菜名 :通过这个找到文件里面的菜资料。(必须存在于文件中,否则提示未找到);
    • 价格 :就是你现在要设定的价格。
  2. 增加菜谱:也需要输入两个参数,
    • 菜名 :不能与文件中的菜名重复。(重复,则提示添加不成功);
    • 价格 :菜价。

涉及到的知识

树状控件的使用

★实例:KFC右边点餐部分
具体实现:在对话框的OnInitDialog()函数中,构建树列表。

  1. 首先,通过LoadIcon()函数加载树列表的ico图标。
  2. 然后,通过SetImageList()函数,为树形控件设置图像序列。
  3. 最后,开始树桩列表的插入,就是用InsertItem()函数,插入列表时注意句柄的选择(树根节点不需要句柄,一级树枝,使用根节点句柄,二级树枝,使用一级树枝句柄…)。

动态按钮,位图的使用

★实例: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);

界面大小动态控制

★实例:管理员入口,菜谱的修改和增加

  1. 获取分割控件的位置。(获得窗体大小GetWindowRect())
  2. 通过此控件的位置,设置窗体大小。(实现窗体的收缩与展开,设置大小函数SetWindowPos())。

成果展示

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

Demo下载:

链接: http://pan.baidu.com/s/1hqripG4 密码: 4t65