
2.9 点菜模块设计

视频讲解
2.9.1 点菜模块概述
点菜模块和开台模块密不可分,在为顾客开台后会自动弹出“点菜”对话框为顾客点菜。点菜模块运行效果如图2.35所示。
2.9.2 点菜模块技术分析

图2.35 点菜模块运行效果
在点菜模块中主要应用了两个列表控件之间的数据传递技术,即从菜单中选择顾客所需要的菜式并将其添加到顾客的账单列表中。在传递的过程中,菜单列表是不能被修改的,账单列表要在每加进一样菜式时就必须增加一行数据,而在逆向传递时,账单列表的数据要相应减少,但菜单列表中数据不变。菜单列表应该采取直接从数据库中读取的方式,以防遭人恶意修改,在单击“确定”按钮前,所有的数据应该都只在列表控件中进行传递而不写入数据库,从而保证数据库的安全性。在获取列表控件当前鼠标指针所在位置时可以用2.8节提到的GetSelectionMark方法得到。向列表中插入数据可以使用SetItemText方法,该方法用于设置视图项的文本,语法如下:
BOOL SetItemText(int nItem, int nSubItem, LPTSTR lpszText);
nItem:标识行索引。
nSubItem:标识列索引。
lpszText:标识设置的视图项文本。
2.9.3 点菜模块实现过程
本模块使用的数据表:TableUSE、caishiinfo、paybill
1.顾客点菜
(1)在Resources选项卡中插入一个对话框资源,为对话框新建一个类CDiancaidlg,在类中定义一个_RecordsetPtr类型变量m_pRs并导入全局变量theApp。在对话框中添加两个列表控件、一个静态文本控件、一个编辑框控件和4个按钮控件。控件的属性及变量如表2.5所示。
表2.5 控件属性及变量设置

(2)为CDiancaidlg类添加一个WM_INITDIALOG消息,用于设置列表控件的样式及内容,代码如下:

代码贴士
❶ InsertColumn:该方法主要有LVCFMT_LEFT(向左靠齐)、LVCFMT_RIGHT(向右靠齐)和LVCFMT_CENTER(居中靠齐)3种。
❷ SetItemText:该方法用于向列表中指定行、指定列并插入数据。
在“点菜”对话框中,编辑框控件的值来自开台模块的“就要这桌”按钮,当开台确认后系统会自动将台号的值赋给编辑框控件,方便在数据表中进行数据存储。

图2.36 “点菜数量”对话框
(3)添加一个用于输入点菜数量的对话框,新建一个CSLdlg类,在对话框中添加一个静态控件、一个编辑框控件和两个按钮控件,如图2.36所示。
(4)为“点菜数量”对话框的编辑框控件添加一个CString型变量m_ShuLiang。先给对话框添加一个对话框图标,要想实现这一功能,先要在Resources选项卡中插入一个图标资源,再为CSLdlg类添加一个WM_INITDIALOG消息,向其添加如下代码:
SetIcon(LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON_sl)),TRUE);
(5)为“点菜数量”对话框中的“确定”按钮添加代码,当用户单击“确定”按钮时系统将判断用户是否输入数据,数量至少要为1,代码如下:

(6)为“点菜数量”对话框中的“返回”按钮添加代码,当用户单击“返回”按钮时系统将进入点菜窗体,代码如下:
CDialog::OnCancel();
(7)“点菜”对话框中的“>>”按钮用于将菜单中的菜式名称添加进顾客的点菜列表中,代码如下:

(8)“点菜”对话框中的“<<”按钮用于取消顾客已点的菜式,代码如下:

(9)用户单击“确定”按钮时,系统将自动生成的账单添加进数据表中,代码如下:

代码贴士
❶ GetItemCount:获得列表控件中的节点数。
❷ GetItemText:获得列表控件指定行、指定列的数据。
❸ atof:将字符型数据转换为浮点型数据。
(10)单击“取消”按钮将关闭“点菜”对话框,代码如下:
CDialog::OnCancel();
2.加菜减菜

图2.37 “加减菜”对话框
顾客有时会要求餐厅加菜或减菜,本系统针对此类问题设置了加菜减菜模块,方便餐饮管理者更好地满足顾客的需求,如图2.37所示。
(1)在Resources选项卡中插入一个对话框资源,新建一个CJiacaidlg类,在类中定义一个_RecordsetPtr类型变量m_pRs并导入全局变量theApp。对其添加一个静态文本控件、一个下拉列表框控件、两个列表控件和4个按钮控件。控件的属性及变量如表2.6所示。
表2.6 控件属性及变量设置

(2)先要对对话框的初始化进行设计,对列表控件的样式和内容进行初始化设置,对类添加消息函数WM_INITDIALOG,代码如下:

(3)当下拉列表框控件的选项变化时,所选餐台号的菜单信息也应该相应改变,在消息对话框中下拉列表框控件的SELCHANGE事件代码如下:

(4)单击“>>”按钮将菜单中的菜式名称添加进用户当前账单中,代码如下:

(5)单击“<<”按钮将从账单中取消用户刚刚所点的菜式名称,代码如下:

(6)单击“确定”按钮,系统将把已经变动的账单信息重新添加进数据表中,并将原始的账单信息删除,代码如下:

(7)单击“取消”按钮关闭当前对话框,代码如下:
CDialog::OnCancel();
2.9.4 单元测试
在加菜减菜模块中,由于在加菜过程中会先调用当前餐台号所拥有的菜式账单,用户对其添加数据确认后会重复向数据表中写入原有的菜式信息,使顾客的账单出错。
为避免上述情况的发生,在系统将新生成的菜式信息保存进数据表时,必须将数据表中的原有菜式信息全部删除,将经过加菜、减菜后的数据表作为当前餐台号的最新账单。为实现这一目的,笔者在“确定”按钮的单击事件下添加如下代码:
