餐饮管理系统 VC MFC

时间:2022-09-13 16:48:44

  

   课程设计题目:    餐饮管理系统

  

   问题阐述与分析: 

    

     本餐饮管理系统适用于中小型餐馆和酒店使用,省时省力,操作简便,界面友好,可以完成酒店的点菜,结账等基本操作,数据库稳定。 

    本系统用ACCESS数据库对数据进行存储和读取,系统分为八大模块,分别为管理员登录,注册,开台,点菜,加减菜,数量选择,结账,用户权限管理等模块。管理员分为经理和营业员两种,不同权限的人登录之后开放不同的模块,然后客人来之后先进行开台操作,然后自动跳出点菜对话框,客人点菜完成之后,在中途还可以进行加减菜的操作。客人结账时能够显示账单明细,自动计算总金额,自动计算找零金额等。另外设立用户权限管理模块,可以对不同注册用户进行授予不同权限的操作,从而保证系统的安全性。

 

 

   工作量:

系统分析设计,对各功能模块的设计与分析,系统的实现,运行环境,运作流程等。系统的实现部分,主要设计到前台以及后台的代码编写。安全分析与设计。

 

  

工作计划安排:

 

      2012年8月20日---8 月21日上午:

      确定课设题目,确定课设方案,功能模块设计,确定运行环境为Windows XP下VC++6.0 SP6。

2012年8月21下午---8月22日上午 :

       设计对话框并制作,设计类的基本功能,制作ACCESS数据库并学习连接数据库,完成了两个类的代码的编写。

2012年8月22日上午---8月22日晚上:

           完成四个类代码的编写并进行调试。

2012年8月23日上午---8月23日晚上:

          完成对其余两个类的编写,各模块合并运行,设计主界面风格。

2012年8月24日:

           调试代码,美化界面,为程序添加注释。

 

 VC++课程设计报告

 

Ø 软硬件运行环境

开发环境

l AMD Athlon™ⅡNeo Processor K125,2GB内存,250GB硬盘

l Microsoft® Windows™ XP Professional

l Microsoft® Visual C++ 6.0

l Microsoft Office Access 2003

 

运行环境

l Intel® Pentium® 2及以上处理器,32M以上内存,4G以上硬盘

l Microsoft® Windows™ XP操作系统,

Microsoft® Windows 7操作系统

 

Ø 问题及难点所在

    1.数据库操作。

     包括ACCESS数据库中数据表的制作,在程序中利用ADO技术进行数据的查询,检索,增加删除等操作,以及数据库。

   2.模块之间的连接问题。

     模块之间相互联系,进行数据交换,必须兼顾数据安全性和各个类之间的连接性的问题。

   3.系统安全性问题,由于数据库中存在金额等重要数据,必须对每个用户的访问权限加以限制,并可以修改用户权限。      

 

 

Ø 需求分析

    随着现代社会的发展,餐饮行业作为服务业的龙头企业规模不断扩大,一个大型酒店的餐饮服务部门往往服务许多客人,而一个企业的经营管理人员往往分工明确,一个人或几个人无法完成如此繁杂的账目统计和餐饮结账等工作,传统的算账、记账等人工操作系统已经不能再适应现代企业的发展。为了使餐饮系统可以得到高效运转,伴随着计算机的普及,因此需要专业的餐饮管理系统来完成工作。

    我的课程设计就是在此背景下完成的,本套餐饮管理系统有着完整的客人消费流程,餐馆的经理和营业员均可已使用该系统,该系统解决了人工计算餐饮费用的各种不利因素,实现科学的点菜和结账管理,省时省力,适合大多数中小型餐馆使用,市场前景广阔。

 

Ø 概要设计

     首先,要实现餐饮管理的功能,需要设计五个功能模块,分别为开台,点菜,加减菜,结账,数量选择等模块。然后先进行对话框的设计,分别设计IDD_diancaiIDD_jiacaiIDD_jiezhangdlg,IDD_kaitai,IDD_SHULIANG这五个对话框,在对话框上摆放控件,给控件修改ID号码,同时给各个对话框建立一个类,分别为CDiancaidlgCJiacaidlgCJiezhangdlgCKaitaidlg,CSLdlg,并根据需要利用类向导为控件关联成员变量,建立成员函数和消息响应函数。

     其次,要增加系统的安全性能,实现管理员的登录功能,为管理员设置权限,分为经理和营业员两种,分别对不同权限的人开放不同的模块,在登录之前将所有功能都屏蔽。设计登录、注册和账户权限管理对话框,并为每个对话框设置类,给控件添加成员变量,编写代码。

     本系统使用ACCESS数据库对数据进行存储,利用ADO技术访问数据库,实现数据的检索,查询,插入,删除,更改等功能。在数据库中设计了四张数据表,分别为caishiinfo存放菜式信息,Login存放用户名和密码信息,paybill存放账单信息,TableUSE存放桌子使用情况的信息。然后再MFC程序中可以通过ADO语句来访问和操作数据库实现功能。

     对界面进行美化,使用MFC皮肤给应用程序添加自己喜欢的皮肤,给对话框添加FALSH插件进行美化。

 

 

Ø 数据库设计

    1.使用ACCESS2003建立canyin.mdb的数据库,在其中添加四张数据表,分别用来存放菜式信息,用户信息,账单信息,桌号信息。

      

  2.CMyApp类中添加_ConnectionPtr 类型的变量m_pCon用于连接数据库。在窗口初始化函数中添加如下代码,用于连接和访问数据库。

 

::CoInitialize(NULL);      //访问COM

HRESULT hr;       //函数返回值,如果这个函数执行完返回时将有包含实际意义的数字,如果立即返回将包含状态信息

try   /*try关键字用来表示一个代码块,在可能发生的异常。

对于每一个try语句,必须有至少有一个相应的catch子句。如果出现异常,c

atch子句参数进行评估,以确定它是否是能够处理特殊情况。特殊条件下,

如果不能处理任何相应的try语句的catch子句,然后控制权转移的方法调用链和以前的所有异常类型进行评估,

直到找到一个能够处理的条件。*/

{

hr=m_pCon.CreateInstance("ADODB.Connection");   //创建连接。CreateInstance是智能指针本身的函数

if(SUCCEEDED(hr))

{

m_pCon->ConnectionTimeout=3;

hr=m_pCon->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=canyin.mdb","","",adModeUnknown);

     //打开到数据库的连接,同步打开连接

}

}

catch(_com_error e)

{

CString temp;

temp.Format("连接数据库错误信息:%s",e.ErrorMessage());    //格式化输出信息

::MessageBox(NULL,temp,"提示信息",NULL);            //弹出消息提醒框

return false;

}

 

连接数据库后即可在每个类中添加_ConnectionPtr类型的变量操作数据库。

 

Ø 详细设计

       下面对各个类的设计做详细介绍。

l 1、用户登录模块

      

    

     左侧插入了一个Flash插件,右侧添加控件,ID号和相应变量如下:

            

     

     ID号和相应函数为:         

             IDOK          OnOK

             IDCANCEL     OnCancle

(1)用语句extern CMyApp theApp;引入全局变量,然后建立_RecordsetPtr 的变量m_pRs用于操作数据库,设置全局变量i用于计算登录输入的次数,当登录超过三次还未输入正确用户名和密码的话就自动退出程序。

 

2)登录按钮的实现

首先判断编辑框是否出现输入异常的情况,然后检索数据库确定该用户名和密码是否正确,如果连接数据库成功则在login数据表中按照关键字进行用户名和密码的匹配,如果匹配成功,则登录成功,可以进行下一步操作。如果用户名和密码输入有误,则弹出消息框进行提示,然后初始化编辑框,再次接受用户名密码。如果连接数据库没有成功,则弹出消息框进行提示。

在其中全局变量进行计数,如果输入超过三次则推出程序。登录成功之后,将用户名和密码存入到theApp的成员变量中以备在theApp对所登录的用户权限进行管理。

下面为具体实现的代码:

 

void CLogindlg::OnOK()                              //登陆按钮的操作

{

// TODO: Add extra validation here

    UpdateData();                                //调用函数进行数据交换

if(!m_Uname.IsEmpty()||!m_Upasswd.IsEmpty())    //判断用户名和密码编辑框是否为空

{

CString sql="SELECT * FROM Login WHERE Uname='"+m_Uname+"' and Upasswd='"+m_Upasswd+"'";

                            //在数据表中查询是否存在该用户名和密码

try

{

m_pRs.CreateInstance("ADODB.Recordset");

m_pRs->Open((_variant_t)sql,theApp.m_pCon.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);

if(m_pRs->adoEOF)

{

AfxMessageBox("用户名或密码错误!");

m_Uname="";

m_Upasswd="";               //初始化编辑框

i++;                         //用全局变量i控制输入错误次数

UpdateData(false);

if(i==3)           

{

OnCancel();           //如果输入信息超过三次就退出系统

}

 

}

else

{

theApp.name=m_Uname;

theApp.pwd=m_Upasswd;    //登陆成功后将用户名和密码保存

CDialog::OnOK();          

return;

}

}

catch(_com_error e)       //无法连接数据库

{

CString temp;

temp.Format("连接数据库错误信息:%s",e.ErrorMessage());

AfxMessageBox(temp);           

return;

}

}

else

{

AfxMessageBox("用户名密码不能为空");      //编辑框为空

}

}

 

(3)退出模块直接调用  CDialog::OnCancel()  函数退出即可。

 

 

 

l 2.开台模块实现

1)用语句extern CMyApp theApp;引入全局变量,然后建立_RecordsetPtr 的变量m_pRs用于操作数据库。开台模块中在上方显示一个列表框,列表框内显示所有桌子的信息,第一栏是桌号,第二栏是“有人”或者“没人”的显示。选择有人的桌子会自动报错,选中一个没有人的桌子,双击则会在下方的编辑框中显示选中的桌号,选择确定键则完成选择。选择完成之后数据库中对桌号信息进行更改,按取消按钮取消操作

具体的ID号和对应的函数和变量如下:                               

为确定键设置了OnButtonOk函数,为列表框相应双击消息设置OnDblclkList1函数,实现双击桌号能将信息存入编辑框中。 

 

             

2)列表框控件初始化。

     在相应该类的OnInitDialog函数中,先为列表框设置风格,然后添加两列并命名,在桌号的tableuseid数据表中查询桌子的使用情况,将桌号和使用情况分别存入两个变量中,根据信息的不同将信息分别显示到列表框的两列中,查询该数据表中的所有数据得到列表框,以供用户进行桌子的选择。

 

核心代码如下:

m_Zhuolist.SetExtendedStyle(LVS_EX_FLATSB|LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP|LVS_EX_ONECLICKACTIVATE|LVS_EX_GRIDLINES);

                     //为列表控件设置风格

m_Zhuolist.InsertColumn(0,"桌号",LVCFMT_LEFT,140,0);   //为列表控件添加第一列并命名

m_Zhuolist.InsertColumn(1,"状态",LVCFMT_LEFT,140,1);   //为列表控件添加第二列并命名

 

CString sql="select * from tableuse";    

m_pRs=theApp.m_pCon->Execute((_bstr_t)sql,NULL,adCmdText);

                                //数据库操作,查询餐台号信息

 

int i=0;                     //定义变量控制列表控件中的显示顺序

while(m_pRs->adoEOF==0)      //如果数据不为空则查询数据表并将结果添加到列表控件中

{

CString str=(char*)(_bstr_t)m_pRs->GetCollect("桌号");   //将餐台号信息存入str变量中

 

int tableuseid=atoi((char*)(_bstr_t)m_pRs->GetCollect("tableuseid"));  

                                //将使用信息转换为整型变量后存入tableuseid

m_Zhuolist.InsertItem(i,"");    //在控件列表中插入一行

 

m_Zhuolist.SetItemText(i,0,str);  //将餐台号信息添加至第一列

 

//tableuseid变量的值进行判断

if(tableuseid==0)                        

m_Zhuolist.SetItemText(i,1,"空闲");    //如果为真表示空闲,在第二列将信息填入

if(tableuseid==1)

m_Zhuolist.SetItemText(i,1,"有人");    //如果为假表示有人,在第二列将信息填入

i++;                                  //控制行的变量自增

m_pRs->MoveNext();                    //数据库操作:移向下一行记录

}

 

3)编辑框控件显示选择的桌号

      相应鼠标双击的消息响应函数,当营业员鼠标双击选择桌号后,用编辑框关联的成员变量的GetItemText函数获得单击列表位置所在行的第一列,然后存入变量中进行显示。

具体代码如下:

 

void CKaitaidlg::OnDblclkList1(NMHDR* pNMHDR, LRESULT* pResult) 

{

CString str;

str=m_Zhuolist.GetItemText(m_Zhuolist.GetSelectionMark(),0);

                             //获取当前列表控件中鼠标单击位置所在行的第一列文本

m_ZhuoHao=str;             //将文本添加到编辑框中

UpdateData(false);         

*pResult = 0;

}

 

 

4)开台成功的“确定”按钮的操作

   首先判断编辑框不为空,然后查询该餐台号是否正在被使用,如果正在被使用的话就提示有人了,并初始化编辑框。如果不被使用的话,则在数据库中检索这张桌子,找到后将使用情况进行更改,然后调用点菜模块,弹出点菜对话框进行点菜。

  

void CKaitaidlg::OnButtonOk() 

{

UpdateData();     //数据交换

 

if(m_ZhuoHao.IsEmpty())         //如果填入编辑框中的数据为空

AfxMessageBox("桌号不能为空");

 

else             //对编辑框中的数据进行处理

{

CString Str="select * from TableUSE where TableUSEID=1";  //如果不为空则查询哪些餐台正在使用

m_pRs=theApp.m_pCon->Execute((_bstr_t)Str,NULL,adCmdText);

 

while(!m_pRs->adoEOF)        //当记录不为空的时候

{

Value=(char*)(_bstr_t)m_pRs->GetCollect("桌号"); //用全局变量保存正在使用的餐台号

if(m_ZhuoHao==Value)        //如果编辑框中的值与该变量相等

{

AfxMessageBox("有人了");      //提示有人了

m_ZhuoHao="";

UpdateData(false);

return;

}

m_pRs->MoveNext();           //继续下一条记录

}

 

m_pRs=NULL;                     //初始化指针

CString Str1="select * from TableUSE where 桌号="+m_ZhuoHao+"";  

m_pRs=theApp.m_pCon->Execute((_bstr_t)Str1,NULL,adCmdText);

if(m_pRs->adoEOF)              //当记录为空时

{

 

AfxMessageBox("没有这种桌子");  //输出信息

m_ZhuoHao="";                   //编辑框初始化显示

UpdateData(false);     

return;

 

}

m_pRs=NULL;                     //初始化指针

 

CDiancaidlg dlg;               //定义一个点菜窗体实例

dlg.m_ZhuoHao = m_ZhuoHao;      

dlg.DoModal();                //弹出点菜窗体

CDialog::OnOK();           

}

}

 

 

l 3.点菜模块实现

(1)用语句extern CMyApp theApp;引入全局变量,然后建立_RecordsetPtr 的变量m_pRs用于操作数据库。上面的桌号自动进行填充,下面列表的左侧是所有菜式的信息列表,包括菜名的菜价。用户鼠标单击选择的菜品,中间有两个按钮,“>>”用于实现将用户选中的菜式放入到右侧的列表框中。“<<”按钮实现当用户在右侧列表框中选中一个菜后,单击该按钮可以将该菜式从本桌已点的菜式中去掉。单击确定按钮完成点菜的操作,同时将右侧列表框的菜式信息存入caishiinfo数据表中。

 

本对话框的控件关联的变量如下:

 

 

对话框具体设计如下:

          

 

2)窗口初始化函数

   首先在caishiinfo数据表中检索数据,然后用SetExtendedStyle函数为列表框添加样式,然后插入两列,在数据库中找到所有的菜式信息,提取信息并把信息放入到左侧的列表框中,完成IDC_LIST2列表框的初始化。然后在左侧列表框中添加两列信息,完成对IDC_LIST3函数的初始化。

 

具体实现代码如下:

   BOOL CDiancaidlg::OnInitDialog()

{

CDialog::OnInitDialog();

 

CString Sql="select * from caishiinfo";                    //caishiinfo数据表中提取数据

m_CaidanList.SetExtendedStyle(LVS_EX_FLATSB|LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP|LVS_EX_ONECLICKACTIVATE|LVS_EX_GRIDLINES);

                                                    //为菜单列表进行样式设置

m_CaidanList.InsertColumn(0,"菜名",LVCFMT_LEFT,100,0);

           

m_CaidanList.InsertColumn(1,"菜价()",LVCFMT_LEFT,100,1);

                                                      //为菜单列表添加两列并命名

m_pRs=theApp.m_pCon->Execute((_bstr_t)Sql,NULL,adCmdText);

 

while(!m_pRs->adoEOF)                                  //当指针记录不为空

{

CString TheValue,TheValue1;

TheValue=(char*)(_bstr_t)m_pRs->GetCollect("菜名");        //将“菜名”信息存入TheValue

TheValue1=(char*)(_bstr_t)m_pRs->GetCollect("菜价");       //将“菜价”信息存入TheValue1

m_CaidanList.InsertItem(0,"");                             //为列表框插入一行

m_CaidanList.SetItemText(0,0,TheValue);                    //设置该行的第一列

m_CaidanList.SetItemText(0,1,TheValue1);                   //设置该行第二列

m_pRs->MoveNext();                                         //继续下一条记录

}

m_CaidanCheck.InsertColumn(0,"菜名",LVCFMT_LEFT,100,0);

m_CaidanCheck.InsertColumn(1,"数量()",LVCFMT_LEFT,100,1); //为菜单列表添加两列并命名

return TRUE;

}

 

(3)“>>”按钮的实现

      该按钮负责将用户选中的菜式添加到右侧列表框中。首先实例化一个数量选择的对象,该对话框建立之后,后的菜单中所选项的序号,然后后的选择想的文本,然后将菜式名称和数量写入右侧点菜列表框中。

实现代码如下:

void CDiancaidlg::OnButtonadd()  

{

CSLdlg Sldlg;    //数量类实例化一个对象

if(Sldlg.DoModal()==IDOK)       //创建“点菜数量”窗口的模态对话框

{

int i = m_CaidanList.GetSelectionMark();            //获取菜单中所选择的项的序号

CString str = m_CaidanList.GetItemText(i,0);        //获取选择项的文本

m_CaidanCheck.InsertItem(0,"");

m_CaidanCheck.SetItemText(0,0,str);                 //将文本写入点菜栏

m_CaidanCheck.SetItemText(0,1,Sldlg.m_ShuLiang); //将数量写入点菜栏

      

}

}

(4)“>>”按钮的实现

     代码为:  m_CaidanCheck.DeleteItem(m_CaidanCheck.GetSelectionMark());

   即将选中的菜式从右侧列表框中删除掉  

(5)“确定”按钮的操作

      首次按确定按钮修改TableUSE 中的信息,如果点菜不为空的话就将该桌定义为有人,然后通过菜名的检索在数据表中查询菜价信息,然后将总价算出存入全局变量中,并存入数据表中,完成点菜操作。

 

实现代码如下:

void CDiancaidlg::OnButtonOk() 

{

UpdateData();

 

CString Sql;

int i = m_CaidanCheck.GetItemCount();   //获取点菜列表项的总数

if(i==0)    //如果点菜个数为零

{

AfxMessageBox("请点菜");    //弹出对话框

return;

}

 

Sql="update TableUSE set TableUSEID=1 where 桌号="+m_ZhuoHao+" ";

 

theApp.m_pCon->Execute((_bstr_t)Sql,NULL,adCmdText);             //点菜成功就将该餐厅号的使用状态改变

 

CString Sql1,Str,Str1,Value,TotleValue;

double Totle=0;

for(int n=0;n<i;n++)     //遍历点菜列表将数据存入数据表

{

Str=m_CaidanCheck.GetItemText(n,0);   //获取第N行第一列的数据信息

Str1=m_CaidanCheck.GetItemText(n,1);  //获取第N行第二列的数据信息

Sql1="select * from caishiinfo where 菜名='"+Str+"'";    //获取菜价信息

m_pRs=theApp.m_pCon->Execute((_bstr_t)Sql1,NULL,adCmdText);

Value=(char*)(_bstr_t)m_pRs->GetCollect("菜价");   //将菜价信息存入变量

Totle=atof(Value)*atof(Str1);  //获得消费总额存入变量

TotleValue=(char*)(_bstr_t)Totle; //格式转换

Sql1="insert into paybill(桌号,菜名,数量,消费) values("+m_ZhuoHao+",'"+Str+"',"+Str1+","+TotleValue+")";

theApp.m_pCon->Execute((_bstr_t)Sql1,NULL,adCmdText);  //将此桌的点菜信息和消费明细写入数据表

}

AfxMessageBox("点菜成功");   //弹出对话框

CDialog::OnOK();

}

 

 

 

l 4.数量选择模块的实现

   当单击“>>”按钮时会自动弹出选菜的对话框,用户在选菜对话框中输入要选择的份数,将该份数保存后存入变量中,然后可供点菜对话框使用。

 

控件的ID号及变量名如下:

 

 

对话框设计如下:

 

                

 

确定键的代码如下:

 

void CSLdlg::OnButtonok()       //响应点菜数量对话框的确定按钮

{

UpdateData();

if(m_ShuLiang.IsEmpty()||m_ShuLiang=="0")      //判断数量

{

AfxMessageBox("数量至少为1");

return;

}

CDialog::OnOK();

}

 

 

l 5.加减菜模块实现

     (1)加减菜模块完成功能为在进餐中要对所点的菜式进行修改,有加菜和减菜操作。用语句extern CMyApp theApp;引入全局变量,然后建立_RecordsetPtr 的变量m_pRs用于操作数据库。在上方的下拉列表框中选择桌号,选择之后右侧列表框中显示该桌的菜式信息,左侧列表框显示所有的菜式信息。然后可以通过“>>”“<<”按钮对菜式进行修改,同时在后台完成总金额的修改,单击确定修改成功。

 

  控件及变量如下:

 

 

 

 

 

 

 

对话框如下:

            

(2)窗口初始化

     首先在菜式信息表中查询菜式信息,变成列表样式填入到左侧的列表框中,然后paybill数据表中查询账单信息,为下拉列表控件添加正在使用的餐台号信息。

 

以下为具体代码:

BOOL CJiacaidlg::OnInitDialog() 

{

CDialog::OnInitDialog();

 

CString Sql="select * from caishiinfo"; //查询数据

m_CaidanList.SetExtendedStyle(LVS_EX_FLATSB|LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP|LVS_EX_ONECLICKACTIVATE|LVS_EX_GRIDLINES);

                                   //对菜单样式进行设置

m_CaidanList.InsertColumn(0,"菜名",LVCFMT_LEFT,100,0);     //为菜单列表添加两列并命名

m_CaidanList.InsertColumn(1,"菜价()",LVCFMT_LEFT,100,1);

m_pRs=theApp.m_pCon->Execute((_bstr_t)Sql,NULL,adCmdText);  //将数据表中的菜单信息读入菜单列表中

 

 

while(!m_pRs->adoEOF)      //如果不为空

{

CString TheValue,TheValue1;

TheValue=(char*)(_bstr_t)m_pRs->GetCollect("菜名");

TheValue1=(char*)(_bstr_t)m_pRs->GetCollect("菜价"); //分别将菜名和菜价信息存入变量

 

m_CaidanList.InsertItem(0,"");            //插入一行

m_CaidanList.SetItemText(0,0,TheValue);    //将菜名添加到第一行

m_CaidanList.SetItemText(0,1,TheValue1);   //将菜价添加到第二行

m_pRs->MoveNext();  //继续下一条记录

}

 

//为点菜列表进行样式设置

m_CaidanCheck.SetExtendedStyle(LVS_EX_FLATSB|LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP|LVS_EX_ONECLICKACTIVATE|LVS_EX_GRIDLINES);

 

m_CaidanCheck.InsertColumn(0,"菜名",LVCFMT_LEFT,100,0);

m_CaidanCheck.InsertColumn(1,"数量()",LVCFMT_LEFT,100,1);           //为点菜列表添加两列并分别命名

 

Sql="select distinct 桌号 from paybill";                          //去除重复的餐台号信息

m_pRs=theApp.m_pCon->Execute((_bstr_t)Sql,NULL,adCmdText);        //向下拉控件中添加数据

 

while(m_pRs->adoEOF==0)                                     //如果为空

{

CString zhuohao=(char*)(_bstr_t)m_pRs->GetCollect("桌号");  //将餐台号信息存入变量

m_ZhuohaoCombo.AddString(zhuohao);                       //为下拉列表添加餐台号信息

m_pRs->MoveNext();                                       //继续下一条记录

}

 

 

return TRUE; 

}

 

(3)对IDC_LIST3 进行初始化操作

相应下拉列表控件IDC_COMBO1控件的Selchange消息,获取桌号信息,根据桌号在账单列表中将菜式和数量信息提取出来并存入IDC_LIST3 列表框中。

具体代码如下:

void CJiacaidlg::OnSelchangeCombo1() 

{

// TODO: Add your control notification handler code here

CString str;

m_ZhuohaoCombo.GetLBText(m_ZhuohaoCombo.GetCurSel(),str);   //获取所选选项的信息

CString sql="select * from paybill where 桌号="+str+"";     

    //到数据表中查询相关餐台号的信息

m_pRs=theApp.m_pCon->Execute((_bstr_t)sql,NULL,adCmdText);

m_CaidanCheck.DeleteAllItems();      //菜单选择列表框初始化清空

 

//将查到的信息写入点菜列表中

while(!m_pRs->adoEOF)  //如果不为空

{

CString valuename=(char*)(_bstr_t)m_pRs->GetCollect("菜名");

CString valuenum=(char*)(_bstr_t)m_pRs->GetCollect("数量");   //将菜名和数量信息分别存入变量

 

m_CaidanCheck.InsertItem(0,"");               //为菜单列表添加一行

m_CaidanCheck.SetItemText(0,0,valuename);     //将菜名添加到该行第一列

m_CaidanCheck.SetItemText(0,1,valuenum);      //将数量添加到该行第二列

m_pRs->MoveNext();                            //下一条记录

}

}

 

(4)">>"按钮的操作

    选中一项,点击按钮之后,弹出添加数量信息的对话框,获得当前选中项的序号,在右侧列表框中将该菜式的菜名和数量信息写入。

 

   void CJiacaidlg::OnButtonadd() 

{

// TODO: Add your control notification handler code here

CSLdlg Sldlg;          

if(Sldlg.DoModal()==IDOK)        //添加数量信息

{

int i = m_CaidanList.GetSelectionMark();    //获取当前选中项的序号

CString str = m_CaidanList.GetItemText(i,0);

 

m_CaidanCheck.InsertItem(0,"");   //插入一行

 

m_CaidanCheck.SetItemText(0,0,str);//将选中项信息添加到点菜列表中

m_CaidanCheck.SetItemText(0,1,Sldlg.m_ShuLiang);  //将数量信息添加到点菜列表

}

}

 

(5)"<<"按钮的操作

   代码为: 

        m_CaidanCheck.DeleteItem(m_CaidanCheck.GetSelectionMark());

   作用为删除选中项。

(6)“确定”按钮的操作

     首先确认所选择的桌号,然后获取点菜列表框内的菜式总数,确认不为空时执行操作。删去该桌的原有账单信息,再将现在的账单按项目存入paybill 数据表中,并计算总价。

具体代码如下:

void CJiacaidlg::OnButtonOK() 

{

// TODO: Add your control notification handler code here

UpdateData();

CString Sql;

CString zhuohao;

if(m_ZhuohaoCombo.GetCurSel()==-1)            //如果没有选择数据则要求选择

{

AfxMessageBox("请选择要加菜的桌号");

return;

}

m_ZhuohaoCombo.GetLBText(m_ZhuohaoCombo.GetCurSel(),zhuohao);   //获取所选择的信息

int i = m_CaidanCheck.GetItemCount();      //获取点菜列表的项目总数

if(i==0)      //如果为0则提示请点菜

{

AfxMessageBox("请点菜");

return;

}

CString Sql1,Str,Str1,Value,TotleValue;

Sql1="delete from paybill where 桌号="+zhuohao+"";        //删去此帐台号原有的账单信息

theApp.m_pCon->Execute((_bstr_t)Sql1,NULL,adCmdText);      

double Totle=0;            //记录总消费

for(int n=0;n<i;n++)

{

     Str=m_CaidanCheck.GetItemText(n,0);    //获取第N行第一列的文本

        Str1=m_CaidanCheck.GetItemText(n,1);   //获取第N行第二列的文本

     Sql1="select * from caishiinfo where 菜名='"+Str+"'";    

     m_pRs=theApp.m_pCon->Execute((_bstr_t)Sql1,NULL,adCmdText);  //在菜单表中获取菜名一致的信息

     Value=(char*)(_bstr_t)m_pRs->GetCollect("菜价");           //获取该菜名的菜价信息

     Totle=atof(Value)*atof(Str1);           //将数量与菜价转换为整形数相乘得到总消费额

     TotleValue=(char*)(_bstr_t)Totle;       //将总消费转换为CString类型

     Sql1="insert into paybill(桌号,菜名,数量,消费) values("+zhuohao+",'"+Str+"',"+Str1+","+TotleValue+")";

                    //将菜单信息插入到数据表中

     theApp.m_pCon->Execute((_bstr_t)Sql1,NULL,adCmdText); 

}

AfxMessageBox("操作成功");

CDialog::OnOK();

 

 

 

 

 

l 6.结账模块实现

1)首先用语句extern CMyApp theApp;引入全局变量,然后建立_RecordsetPtr 的变量m_pRs用于操作数据库。用户先在下拉列表框中选择桌号,然后消费明细会自动显示在列表框中,应收编辑框被填充,输入实收编辑框中的内容,找零编辑框会自动填充,当实收金额合适时,完成操作,并且对该桌号的信息进行初始化,使其变为不在使用,并且在账单中清空该桌号的账单信息。

控件及变量名如下所示:

 

对话框设计如下:

                

 

 

(2)窗口初始化函数

   下拉列表框IDC_COMBO1的初始化,在TableUSE 数据表中查询正在使用的餐台号,将其存入变量中,然后添加到下拉列表框中以供选择。然后初始化IDC_mimgxi列表框,为其添加菜名,数量,消费信息。

实现代码如下:

BOOL CJiezhangdlg::OnInitDialog() 

{

CDialog::OnInitDialog();

CString TheValue;

m_pRs=theApp.m_pCon->Execute((_bstr_t)("select * from TableUSE where TableUSEID=1"),NULL,adCmdText);//获取正在消费的餐台号

if(m_pRs->GetRecordCount()==0)    //如果记录为0则返回

return true;

if(m_pRs->GetRecordCount()==1)    //如果记录为1则将数据添加到下拉列表中

{

TheValue=(char*)(_bstr_t)m_pRs->GetCollect("桌号");

m_Combo.AddString(TheValue);

return true;

}

 

while(!m_pRs->adoEOF)  //当记录不为空时

{

TheValue=(char*)(_bstr_t)m_pRs->GetCollect("桌号");       //获取记录中的餐台号信息

m_Combo.AddString(TheValue);     //将餐台号信息添加到下拉控件列表中

m_pRs->MoveNext();               //继续下一条记录

}

m_pRs=NULL;        //初始化指针

//设置消费明细列表样式

m_MingXi.SetExtendedStyle(LVS_EX_FLATSB|LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP|LVS_EX_ONECLICKACTIVATE|LVS_EX_GRIDLINES);

//给消费明细列表添加三列并分别命名

m_MingXi.InsertColumn(0,"菜名",LVCFMT_LEFT,100,0);

m_MingXi.InsertColumn(1,"数量",LVCFMT_LEFT,100,1);

m_MingXi.InsertColumn(2,"消费()",LVCFMT_LEFT,120,1);

return true;

}

 

(3)IDC_mingxi列表框内容显示

    相应下拉列表框的selchange消息,当下拉列表框的内容变化之后,获取列表框的信息并存入变量,通过桌号检索获取账单信息,在列表框中按照菜名,数量,消费的格式将详细账单信息显示出来。将消费总额放在应收控件中显示。

    void CJiezhangdlg::OnSelchangeCombo1() 

{

UpdateData();

CString str,sql,caiming,shuliang,xiaofei,xiaofeitotle,TheValue;

 

double totle=0;       //存放总金额数值

 

 

m_Combo.GetLBText(m_Combo.GetCurSel(),str);      //获取当前选择项的文本信息并存入变量

sql="select * from paybill where 桌号="+str+"";   //查询当前餐台号的账单信息

m_pRs=theApp.m_pCon->Execute((_bstr_t)sql,NULL,adCmdText);

m_MingXi.DeleteAllItems(); //清空列表控件

 

while(m_pRs->adoEOF==0)  //如果记录不为空

{

TheValue=(char*)(_bstr_t)m_pRs->GetCollect("消费");   //获得消费信息并存入变量

totle+=atof(TheValue);           //转换类型并相加

caiming=(char*)(_bstr_t)m_pRs->GetCollect("菜名");

shuliang=(char*)(_bstr_t)m_pRs->GetCollect("数量");

xiaofei=(char*)(_bstr_t)m_pRs->GetCollect("消费");    //获得信息并存入变量

m_MingXi.InsertItem(0,"");      //插入一行

m_MingXi.SetItemText(0,0,caiming);

m_MingXi.SetItemText(0,1,shuliang);

m_MingXi.SetItemText(0,2,xiaofei);   //分别在一二三行添加信息

m_pRs->MoveNext();  //继续下一条记录

}

xiaofeitotle=(char*)(_bstr_t)totle;   //转换格式

m_YingShou.SetWindowText(xiaofeitotle);   //将消费总额放在应收控件中显示

UpdateData(false);

}

 

 

(4)确定按钮的操作

     首先进行相应餐台号的异常判断,该客人需要付款时先获得相应餐台号的消费信息,获得总金额,实收金额和应收金额,将找零金额计算出,写入找零编辑框中。

   void CJiezhangdlg::OnButtonOk2() 

{

// TODO: Add your control notification handler code here

UpdateData();

CString str,str1,str2,str3;

CString TheValue;

CString ShiShou,YingShou;

m_Combo.GetWindowText(str1);         //获取餐台号

if(str1.GetLength()<4||str1.GetLength()>4)  //如果不是四位数

{

AfxMessageBox("输入错误");

return;

}

CString bjsql="select * from TableUSE where 桌号="+str1+"";  //获取数据表中对应的餐台号信息

m_pRs=theApp.m_pCon->Execute((_bstr_t)bjsql,NULL,adCmdText); 

if(m_pRs->adoEOF)  //为空

{

AfxMessageBox("没有这张桌子");

return;

}

//获取对应餐桌号的使用情况

CString bjstr=(char*)(_bstr_t)m_pRs->GetCollect("TableUSEID");

if(bjstr=="0")

{

AfxMessageBox("该桌不需要付款");

return;

}

m_ShiShou.GetWindowText(str3);  //获取客人付款的金额

if(str3.IsEmpty())  //如果为空则提示

{

AfxMessageBox("请输入顾客付款");

return;

}

else    

m_Combo.GetLBText(m_Combo.GetCurSel(),str);

 

m_ZhaoLing.SetWindowText("");  //初始化

double zhaoling;

m_ShiShou.GetWindowText(ShiShou);    //获取实收金额

m_YingShou.GetWindowText(YingShou);   //获取应收金额

 

if(atof(ShiShou)<atof(YingShou))  //判断实收金额和应收金额的大小

{

AfxMessageBox("金额不足");

return;

}

else

{

 

zhaoling=atof(ShiShou)-atof(YingShou);  //找零

TheValue=(char*)(_bstr_t)zhaoling;  //转化为CSTRING类型

m_ZhaoLing.SetWindowText(TheValue);     //在找零编辑框中显示找零金额

UpdateData(false);

CString sql;

str2="update TableUSE set TableUSEID=0 where 桌号="+str+" ";  //修改付款后该桌的使用状态

theApp.m_pCon->Execute((_bstr_t)str2,NULL,adCmdText);    

  

 

m_YingShou.SetWindowText("");   

m_ShiShou.SetWindowText("");

m_ZhaoLing.SetWindowText("");

m_Combo.SetWindowText(""); 

                                 //将各编辑框初始化显示

m_Combo.DeleteString(m_Combo.GetCurSel());  //删除下拉列表框中所选中的选项

m_MingXi.DeleteAllItems();    //清空列表框控件

sql="delete from paybill where 桌号="+str+"";   //将账单删去

theApp.m_pCon->Execute((_bstr_t)sql,NULL,adCmdText);

AfxMessageBox("欢迎再来");  //欢迎再来

}

}

 

 

 

l 7.注册模块实现

   (1)注册模块主要用于将注册用户的用户名和密码存入到数据库,首先用语句extern CMyApp theApp;引入全局变量,然后建立_RecordsetPtr 的变量m_pRs用于操作数据库。用户在编辑框中输入用户名和密码,输入无误后将用户名和密码存入变量中。

 

控件的ID号和关联变量如下:

               

 

对话框如下:   

                    

(2)确定按钮的操作

    当编辑框不为空,两次输入密码相等,且该用户之前没有被注册过时,将注册用户的用户名,密码写入到Login数据表中。

具体代码如下:

void CZhucedlg::OnButtonOk() 

{

UpdateData();  //对话框数据交换是由DoDataExchange完成的

               //程序不直接调用这个函数,而是通过调用UpdateData()完成,有一个参数缺省值为TRUE

if(m_Name.IsEmpty()||m_Pwd.IsEmpty()||m_Pwd1.IsEmpty())   //判断编辑框内是否为空

{

AfxMessageBox("用户名密码不能为空");

return;

}

if(m_Pwd!=m_Pwd1)        //如果两个编辑框内密码不一致

{

AfxMessageBox("密码不一致");  //弹出一个MessageBox对话框

return;

}

//SQL语句:用全局变量theAppm_pConExecute方法访问数据库,查找该用户名是否已经被注册,adCmdTex表明类型是文本

m_pRs=theApp.m_pCon->Execute((_bstr_t)("select * from Login where Uname='"+m_Name+"'"),NULL,adCmdText);

if(m_pRs->adoEOF)     //判断数据库中的记录是否为空

{

theApp.m_pCon->Execute((_bstr_t)("insert into Login(Uname,Upasswd,power)values('"+m_Name+"',\

'"+m_Pwd+"',2)"),NULL,adCmdText);

AfxMessageBox("注册成功");      //注册成功,弹出消息框

CDialog::OnOK();     //当用户点击“确定”按钮调用。重写这个成员函数执行OK按钮动作。

}

else

{

AfxMessageBox("用户名已存在");

return;

}

 

}

 

(3)重置按钮操作

  作用是将各编辑框初始化,代码如下:

void CZhucedlg::OnBUTTONreset() 

{

m_Name="";

m_Pwd="";

m_Pwd1="";      //将编辑框控件的三个控件的状态设置为初始状态

UpdateData(false);

 

}

 

 

 

l 8.用户权限管理模块

1)用户权限管理主要实现对用户权限进行修改的功能,可以对已经注册的所有用户进行不同的权限授予,有经理和营业员两种。对用户权限进行修改能给有效的提高系统的安全性,也更加符合实际情况。

变量的ID号和关联的变量如下:

 

对话框设计如下:

                 

2)对下拉列表框进行初始化

      在OnInitDialog函数中,首先从数据库中检索用户名,将用户名添加到下拉列表框中。

   实现代码如下:

BOOL CQuanxiandlg::OnInitDialog()

{

CDialog::OnInitDialog();

CString sql="select * from login where Uname<>'"+theApp.name+"'";

m_pRs=theApp.m_pCon->Execute((_bstr_t)sql,NULL,adCmdText);

while(m_pRs->adoEOF==0)

{

CString str=(char*)(_bstr_t)m_pRs->GetCollect("Uname");

m_IDcombo.AddString(str);

m_pRs->MoveNext();

}

 

return true;

 

}

(3)根据选中的用户名选中相应的选项

   下拉列表框的选择项发生变化时,在数据表中查询该用户对应的权限,存放到变量中,然后根据不同的权限将不同的权限信息选中。

具体代码如下:

void CQuanxiandlg::OnSelchangeCombo1()       //将下拉列表框中的选择项通过数据库检索他的权限从而选中相应的单选框

{

UpdateData();

CString str;

    CButton* boss = (CButton*)GetDlgItem(IDC_RADIO_BOSS);

CButton* yingyeyuan = (CButton*)GetDlgItem(IDC_RADIO_yingyeyuan);

 

m_IDcombo.GetLBText(m_IDcombo.GetCurSel(),str);//把索引号为nIndex的数据放到rString变量中,GetCurSel用来获得下拉列表框中数据的索引值

CString sql="select * from login where Uname='"+str+"'";

m_pRs=theApp.m_pCon->Execute((_bstr_t)sql,NULL,adCmdText);

 

CString pow;

pow=(char*)(_bstr_t)m_pRs->GetCollect("power");   //根据选项选中各个选项

radio=atoi(pow);

 

 

if(radio==0)

{

boss->SetCheck(1);    //表示选中

yingyeyuan->SetCheck(0);     //表示未选中

}

if(radio==2)

{

boss->SetCheck(0);

yingyeyuan->SetCheck(1);

}

UpdateData(false);

 

}

 

(4)确定按钮的操作

    当选中用户后,得到选中的权限,用现在的权限信息替代之前的权限信息,完成对权限的修改。  

void CQuanxiandlg::OnButtonOk()  //完成对权限的修改

{

UpdateData();

CString str,str1;

if(m_IDcombo.GetCurSel()==-1)   //如果列表框中为空就弹出对话框

{

AfxMessageBox("请选择一个用户");

return;

}

m_IDcombo.GetLBText(m_IDcombo.GetCurSel(),str);    //把索引号为nIndex的数据放到rString变量中,GetCurSel用来获得下拉列表框中数据的索引值

str1.Format("%d",radio);

CString sql="update login set power="+str1+" where Uname='"+str+"'";

theApp.m_pCon->Execute((_bstr_t)sql,NULL,adCmdText);

AfxMessageBox("修改权限成功");

}

 

 

l 9.主窗体设计

 

   主窗体上摆放按钮控件,用于实现各个模块的功能。如下图所示:

 

控件的ID号及变量名如下图所示:

 

 

 

(1)窗口初始化函数中用下列语句将各个按钮的功能进行屏蔽,待登录之后再开放。

     

     m_jiezhang.EnableWindow(false);

      m_addcai.EnableWindow(false);

      m_kaitai.EnableWindow(false);

  m_quanxian.EnableWindow(false);

  m_zhuce.EnableWindow(false);

 

(2)调用登录模块

    在主函数中首先建立模态对话框,然后根据从登录模块中传来的用户名和密码参数从数据表中查找该用户的权限值,找到之后根据权限值的不同开放不同的模块给用户使用。从而有效的保障了系统的安全。

 void CMyDlg::OnButtonLogin() 

{

// TODO: Add your control notification handler code here

CLogindlg Logindlg;

if(Logindlg.DoModal()==IDOK)

{

CString Sql="select * from login where Uname='"+theApp.name+"'";

m_pRs=theApp.m_pCon->Execute((_bstr_t)Sql,NULL,adCmdText);

CString Str=(char*)(_bstr_t)m_pRs->GetCollect("power");

int radio=atoi(Str);        //通过查找找到表示权限radio的值

if(radio==0)

{

               m_jiezhang.EnableWindow(true);

   m_addcai.EnableWindow(true);

               m_kaitai.EnableWindow(true);

   m_quanxian.EnableWindow(true);

   m_zhuce.EnableWindow(true);

 

}

if(radio==2)

{

               m_jiezhang.EnableWindow(true);

   m_addcai.EnableWindow(true);

               m_kaitai.EnableWindow(true);

   m_quanxian.EnableWindow(false);

   m_zhuce.EnableWindow(false);

}

// m_Statusbar.SetPaneText(1,"当前用户:"+theApp.name);

// SetWindowText("餐饮管理系统      当前登录用户:"+theApp.name);

 

}

if(Logindlg.i==3)

CDialog::OnCancel();

}

 

(3)其余按钮依次调用自己对应的模块弹出不同的对话框。

 

 

 

Ø 用户使用说明

1.用户登录

    用户登录之前不能使用系统功能,首先必须登录。

 

 

用户登录后对话框消失,出现主界面如下,这时根据不同的用户权限开放不同的模块。

   

 

2.开台

    选择空闲的1004桌,双击后,在下方的编辑框中弹出对话框,然后单击确定。

         

3.点菜

   开台成功后跳出点菜对话框,选择一个菜,单击“>>”按钮弹出对话框,在其中选择数量。

 

        

选择完成后所选菜式写在右侧的列表框中,单击确定键完成点菜。

        

 

 

 

 

4.加减菜

   从下拉列表框中选择一个桌号。

        

 

选中之后右侧列表框中显示出已点的菜式,可以对其进行增删。修改完成后单击完成操作。

          

5.结账

   结账时现在上方的下拉列表中选择桌号,列表框中会自动出现该桌的消费情况,“应收”编辑框会自动填充,在“实收”编辑框中输入金额,会在找零编辑框中出现应该找零的金额。点击结账结账完成。

             

 

 

6.用户注册

    填入相关信息后点击提交即完成注册

                        

 

 

 

7.用户权限管理

      选择一个用户,然后可以对其权限进行查看和更改。

                    

 

 

 

Ø 调试分析

   1.数据库的连接总是出错,需要反复调试测试程序出错的原因。解决办法是请教同学,上网查资料解决。

2.设计不合理问题,许多设计没有考虑到实际情况,因此在后续设计中出现了模块之间连接不畅,需要修改之前工作的问题。

 

   

Ø 总结与体会

     首先,这是第一次完全意义上的课程设计,用MFC实现,本次课程设计让我基本懂得了MFC内部的运行原理,能给独立的制作一个较为简单的系统,算是MFC的入门。同时然我学会了ACCESS数据库在VC中的使用,能够使用数据库大大提高程序运行的效率,其操作的复杂程度也远远低于文件操作。能够实现预先设计好的程序的功能,非常有自豪感。

     其次我体会到了任何一门新的东西并非想象中的那么困难,学习一门技术首先要搞清楚其最底层,最基本,最原始的东西,了解了原理之后再学习它的应用就十分轻松。但是如果一开始就急于去运用,没有把原理性的东西搞清楚,则很难做出好的程序。

     同时,我还认识到实践的重要性,代码是写出来的。看别人的程序只能在非常有限的程度上提高自己的编程水平,但是如果能够自己动手去写代码则不同,要按照自己的思路去写,遇到什么问题再解决什么问题,这样就可以基本把一个程序设计中所有设计的难点和重点都学懂,比起照葫芦画瓢这样的程序编写方法事半功倍。

 

Ø 关键源程序

1.CMyApp类

   // My.cpp : Defines the class behaviors for the application.

//

 

#include "stdafx.h"

#include "My.h"

#include "MyDlg.h"

#include "SkinPPWTL.h"

 

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

 

 

/////////////////////////////////////////////////////////////////////////////

// CMyApp

 

BEGIN_MESSAGE_MAP(CMyApp, CWinApp)

//{{AFX_MSG_MAP(CMyApp)

// NOTE - the ClassWizard will add and remove mapping macros here.

//    DO NOT EDIT what you see in these blocks of generated code!

//}}AFX_MSG

ON_COMMAND(ID_HELP, CWinApp::OnHelp)

END_MESSAGE_MAP()

 

/////////////////////////////////////////////////////////////////////////////

// CMyApp construction

 

CMyApp::CMyApp()

{

// TODO: add construction code here,

// Place all significant initialization in InitInstance

}

 

/////////////////////////////////////////////////////////////////////////////

// The one and only CMyApp object

 

CMyApp theApp;

 

/////////////////////////////////////////////////////////////////////////////

// CMyApp initialization

 

BOOL CMyApp::InitInstance()

{

AfxEnableControlContainer();

    skinppLoadSkin(_T("MAC.ssk"));

::CoInitialize(NULL);      //访问COM库

HRESULT hr;       //函数返回值,如果这个函数执行完返回时将有包含实际意义的数字,如果立即返回将包含状态信息

try   /*try关键字用来表示一个代码块,在可能发生的异常。

对于每一个try语句,必须有至少有一个相应的catch子句。如果出现异常,c

atch子句参数进行评估,以确定它是否是能够处理特殊情况。特殊条件下,

如果不能处理任何相应的try语句的catch子句,然后控制权转移的方法调用链和以前的所有异常类型进行评估,

直到找到一个能够处理的条件。*/

{

hr=m_pCon.CreateInstance("ADODB.Connection");   //创建连接。CreateInstance是智能指针本身的函数

if(SUCCEEDED(hr))

{

m_pCon->ConnectionTimeout=3;

hr=m_pCon->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=canyin.mdb","","",adModeUnknown);

     //打开到数据库的连接,同步打开连接

}

}

catch(_com_error e)

{

CString temp;

temp.Format("连接数据库错误信息:%s",e.ErrorMessage());    //格式化输出信息

::MessageBox(NULL,temp,"提示信息",NULL);            //弹出消息提醒框

return false;

}

 

 

#ifdef _AFXDLL

Enable3dControls(); // Call this when using MFC in a shared DLL

#else

Enable3dControlsStatic(); // Call this when linking to MFC statically

#endif

 

CMyDlg dlg;

m_pMainWnd = &dlg;

int nResponse = dlg.DoModal();

if (nResponse == IDOK)

{

// TODO: Place code here to handle when the dialog is

//  dismissed with OK

}

else if (nResponse == IDCANCEL)

{

// TODO: Place code here to handle when the dialog is

//  dismissed with Cancel

}

 

// Since the dialog has been closed, return FALSE so that we exit the

//  application, rather than start the application's message pump.

return FALSE;

}

 

2.CMyDlg类

   #include "stdafx.h"

#include "my.h"

#include "myDlg.h"

#include "Logindlg.h"

#include "Kaitaidlg.h"

#include "Jiezhangdlg.h"

#include "Diancaidlg.h"

#include "Zhucedlg.h"

#include "Quanxiandlg.h"

#include "Jiacaidlg.h"

 

 

 

 

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

 

 

/////////////////////////////////////////////////////////////////////////////

// CAboutDlg dialog used for App About

extern CMyApp theApp;         //引入一个全局变量

class CAboutDlg : public CDialog

{

public:

CAboutDlg();

 

// Dialog Data

//{{AFX_DATA(CAboutDlg)

enum { IDD = IDD_ABOUTBOX };

//}}AFX_DATA

 

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CAboutDlg)

protected:

virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

//}}AFX_VIRTUAL

 

// Implementation

protected:

//{{AFX_MSG(CAboutDlg)

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

 

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

{

//{{AFX_DATA_INIT(CAboutDlg)

//}}AFX_DATA_INIT

}

 

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CAboutDlg)

//}}AFX_DATA_MAP

}

 

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

//{{AFX_MSG_MAP(CAboutDlg)

// No message handlers

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

 

/////////////////////////////////////////////////////////////////////////////

// CMyDlg dialog

 

CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)

: CDialog(CMyDlg::IDD, pParent)

{

//{{AFX_DATA_INIT(CMyDlg)

// NOTE: the ClassWizard will add member initialization here

//}}AFX_DATA_INIT

// Note that LoadIcon does not require a subsequent DestroyIcon in Win32

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

 

void CMyDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CMyDlg)

DDX_Control(pDX, IDC_BUTTON_ZHUCE, m_zhuce);

DDX_Control(pDX, IDC_BUTTON_QUANXIAN, m_quanxian);

DDX_Control(pDX, IDC_BUTTON_KAITAI, m_kaitai);

DDX_Control(pDX, IDC_BUTTON_jiezhang, m_jiezhang);

DDX_Control(pDX, IDC_BUTTON_ADDCAI, m_addcai);

//}}AFX_DATA_MAP

}

 

BEGIN_MESSAGE_MAP(CMyDlg, CDialog)

//{{AFX_MSG_MAP(CMyDlg)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_BN_CLICKED(IDC_BUTTON_ADDCAI, OnButtonAddcai)

ON_BN_CLICKED(IDC_BUTTON_CANCLE, OnButtonCancle)

ON_BN_CLICKED(IDC_BUTTON_jiezhang, OnBUTTONjiezhang)

ON_BN_CLICKED(IDC_BUTTON_KAITAI, OnButtonKaitai)

ON_BN_CLICKED(IDC_BUTTON_LOGIN, OnButtonLogin)

ON_BN_CLICKED(IDC_BUTTON_QUANXIAN, OnButtonQuanxian)

ON_BN_CLICKED(IDC_BUTTON_ZHUCE, OnButtonZhuce)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

 

/////////////////////////////////////////////////////////////////////////////

// CMyDlg message handlers

 

BOOL CMyDlg::OnInitDialog()

{

CDialog::OnInitDialog();

 

// Add "About..." menu item to system menu.

 

// IDM_ABOUTBOX must be in the system command range.

ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX < 0xF000);

 

CMenu* pSysMenu = GetSystemMenu(FALSE);

if (pSysMenu != NULL)

{

CString strAboutMenu;

strAboutMenu.LoadString(IDS_ABOUTBOX);

if (!strAboutMenu.IsEmpty())

{

pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

}

}

 

// Set the icon for this dialog.  The framework does this automatically

//  when the application's main window is not a dialog

SetIcon(m_hIcon, TRUE); // Set big icon

SetIcon(m_hIcon, FALSE); // Set small icon

 

// TODO: Add extra initialization here

SetIcon(LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME)),TRUE);

 

     m_jiezhang.EnableWindow(false);

     m_addcai.EnableWindow(false);

     m_kaitai.EnableWindow(false);

 m_quanxian.EnableWindow(false);

 m_zhuce.EnableWindow(false);

 

return TRUE;  // return TRUE  unless you set the focus to a control

}

 

void CMyDlg::OnSysCommand(UINT nID, LPARAM lParam)

{

if ((nID & 0xFFF0) == IDM_ABOUTBOX)

{

CAboutDlg dlgAbout;

dlgAbout.DoModal();  //创建模态对话框

}

else

{

CDialog::OnSysCommand(nID, lParam);

}

}

 

// If you add a minimize button to your dialog, you will need the code below

//  to draw the icon.  For MFC applications using the document/view model,

//  this is automatically done for you by the framework.

 

void CMyDlg::OnPaint() 

{

if (IsIconic())

{

CPaintDC dc(this); // device context for painting

 

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

 

// Center icon in client rectangle

int cxIcon = GetSystemMetrics(SM_CXICON);

int cyIcon = GetSystemMetrics(SM_CYICON);

CRect rect;

GetClientRect(&rect);

int x = (rect.Width() - cxIcon + 1) / 2;

int y = (rect.Height() - cyIcon + 1) / 2;

 

// Draw the icon

dc.DrawIcon(x, y, m_hIcon);

}

else

{

CDialog::OnPaint();

}

}

 

// The system calls this to obtain the cursor to display while the user drags

//  the minimized window.

HCURSOR CMyDlg::OnQueryDragIcon()

{

return (HCURSOR) m_hIcon;

}

 

 

void CMyDlg::OnButtonAddcai() 

{

// TODO: Add your control notification handler code here

CJiacaidlg dlg;

dlg.DoModal();

}

 

void CMyDlg::OnButtonCancle() 

{

// TODO: Add your control notification handler code here

if(IDYES==MessageBox("确定退出?","退出程序",  MB_ICONQUESTION|MB_YESNO ))    //判断是否点击确定

DestroyWindow();    

}

 

void CMyDlg::OnBUTTONjiezhang() 

{

// TODO: Add your control notification handler code here

CJiezhangdlg jiezhangdlg;

jiezhangdlg.DoModal();

}

 

void CMyDlg::OnButtonKaitai() 

{

// TODO: Add your control notification handler code here

CKaitaidlg kaitaidlg;

kaitaidlg.DoModal();

}

 

void CMyDlg::OnButtonLogin() 

{

// TODO: Add your control notification handler code here

CLogindlg Logindlg;

if(Logindlg.DoModal()==IDOK)

{

CString Sql="select * from login where Uname='"+theApp.name+"'";

m_pRs=theApp.m_pCon->Execute((_bstr_t)Sql,NULL,adCmdText);

CString Str=(char*)(_bstr_t)m_pRs->GetCollect("power");

int radio=atoi(Str);        //通过查找找到表示权限radio的值

if(radio==0)

{

               m_jiezhang.EnableWindow(true);

   m_addcai.EnableWindow(true);

               m_kaitai.EnableWindow(true);

   m_quanxian.EnableWindow(true);

   m_zhuce.EnableWindow(true);

 

}

if(radio==2)

{

               m_jiezhang.EnableWindow(true);

   m_addcai.EnableWindow(true);

               m_kaitai.EnableWindow(true);

   m_quanxian.EnableWindow(false);

   m_zhuce.EnableWindow(false);

}

// m_Statusbar.SetPaneText(1,"当前用户:"+theApp.name);

// SetWindowText("餐饮管理系统      当前登录用户:"+theApp.name);

 

}

if(Logindlg.i==3)

CDialog::OnCancel();

}

 

void CMyDlg::OnButtonQuanxian() 

{

// TODO: Add your control notification handler code here

CQuanxiandlg dlg;

dlg.DoModal();

}

 

void CMyDlg::OnButtonZhuce() 

{

// TODO: Add your control notification handler code here

CZhucedlg zhucedlg;

zhucedlg.DoModal();

}