提示IDispatch error #3088 "; 是哪里错了呢

笑掠残月 2011-10-17 06:18:41
代码如下:
UpdateData();

CTime tm, tmEnd; // 时间变量
CString sql; // 数据库变量
CString str, strDate, DateEnd; // 日期变量
CString itemtext; //文本内容
int row = 0; //定义行数
int count = 1; //定义列数

m_DataList.DeleteAllItems(); //清空列表数据
m_DTPStart.GetTime(tm);
str = tm.Format("%Y-%m-%d");

sql.Format("select PartID, PartName, PNweight, PLength, PBmpPath from Parts where PartDate = '%s' order by PartID ACS", str);

m_AdoConn.OnInitADOConn();
m_pRs = m_AdoConn.GetRecordSet((_bstr_t)sql); //获取结果表记录

if( m_pRs->adoEOF )
{
MessageBox("表内数据为空!", "提示", MB_OK | MB_ICONINFORMATION);
return;
}
while( ! m_pRs->adoEOF )
{
m_DataList.InsertItem(row, ""); //在列表视图控件中插入一个新项
for (int index = 0; index < 5; index++)
{
//获取数据库里对应的内容
itemtext = (TCHAR*)(_bstr_t)m_pRs->GetFields()->GetItem((long)index)->Value;
//讲文本内容插入行列
m_DataList.SetItemText(row, count, itemtext);
count++;
}
count = 1;
row++;
m_pRs->MoveNext();
}
m_AdoConn.ExitConn();

运行后就一直提示IDispatch error #3088 ";,sql字段我检查了也没检查出什么问题。是哪里错了呢?
...全文
1631 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuucyf 2011-10-18
  • 打赏
  • 举报
回复
最简单的方法是你把sql这里对应的字符串拷贝到SQL下去运行,看看能不能执行就知道原因了呀!
笑掠残月 2011-10-18
  • 打赏
  • 举报
回复
我把SQL语句改成
sql.Format("select [PartID], [PartName], [PNweight], [PLength], [PBmpPath] from [Parts] where [PartDate] = '%s' order by [PartID] ASC", str);
后,不提示IDispatch error #3088 ";错误,但提示IDispatch error #3088 ";了?难道真的就是字段错了?没有可能是语句错了?
笑掠残月 2011-10-18
  • 打赏
  • 举报
回复
知道了,是关键字沒加[],要加的。另外"ACS"寫錯了,應該是"ASC". 字段"PartDate"還像是與函數名衝突。
sql.Format("select [PartID], [PartName], [PNweight], [PLength], [PBmpPath] from [Parts] where [PDate] = '%s' order by PartID ASC", str);
zxdyu2009 2011-10-17
  • 打赏
  • 举报
回复
断点单步调试下看看上哪个语句执行出出错?
诶呦 2011-10-17
  • 打赏
  • 举报
回复
出现这种错误一般是SQL语句的错误,很可能是SQL语句里用到的字段名称和数据库的表中使用的字段名称不一致.仔细检查检查SQL语句和数据库中的表,肯定能发现错误所在!
首先新建一个工程名称为ADO的基本对话框工程。然后: 1.在头文件stdafx.h 中加入 #import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","rsEOF") 2.在ADODLG.cpp中加入 void CADODlg::OnBtnQuery() { CoInitialize(NULL); // 初始化COM环境 _ConnectionPtr conn(__uuidof(Connection)); // 创建连接对象 _RecordsetPtr rst(__uuidof(Recordset)); // 创建记录集 try { conn->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=data.mdb;Persist Security Info=False;Jet OLEDB:Database Password=691126" ,"", "", adModeUnknown); // 打开数据库并建立连接(有密码) //conn->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=data.mdb;" ,"", "", adModeUnknown); // 打开数据库并建立连接(没有密码) rst->Open(_variant_t("select * from sheet1"), _variant_t((IDispatch*) conn), adOpenDynamic, adLockOptimistic, -1); // 读取数据表 while(!rst->rsEOF) { ((CListBox*)GetDlgItem(IDC_LIST1))->AddString((_bstr_t)rst->GetCollect("姓名")); // 查询"姓名"字段 rst->MoveNext(); } } catch(_com_error e) { CString errormessage; // 保存误信息 errormessage.Format("Error: %s", e.ErrorMessage()); // 设置误信息的格式 //AfxMessageBox(errormessage); // 以对话框的形式输出误信息 MessageBox(errormessage,"提示"); } //MessageBox("查询结束!","提示",0); rst->Close(); conn->Close(); rst.Release(); // 释放相应COM接口上的引用计数 conn.Release(); CoUninitialize(); // 卸载COM环境库 }
餐饮管理系统 一、需求分析 随着社会服务行业的发展,餐饮业对自身服务的质量和能力也有了更高的要求。餐饮管理系统正是在这样的情况之下越来越受到重视。餐厅的内部服务项目众多,既需要完成前台的服务工作,还需要完成后台的管理工作,如果没有一套可靠的餐饮管理系统,单凭手工操作,不仅效率低,而且会极大地影响到酒店的服务质量。 设计的目标:实现餐饮管理的科学化、自动化,提高各个模版的办公效率,为高质量的餐饮服务提供保证。 系统功能概述 民以食为天,随着人民生活水平的提高,餐饮业在服务行业中占有越来越重要的地位。经过多年发展,餐饮管理已经逐渐由定性管理,进入到重视定量管理的科学阶段。众所周知,在定量管理的具体实现方法和手段方面,最有效的工具就是计算机管理。 传统的手工操作管理存在着许多无法避免的问题,例如: 人工计算机账单金额出现差; 收银工作中跑单、漏单、偷钱现象普遍; 个别服务员作弊、改单、宰客情形时有发生; 客人消费单据难以保存和查询。 如果借助计算机来管理,就可以轻松的解决处理这些问题。一个餐饮管理信息系统应该包括基本的餐厅的服务管理、管理人员信息的维护等,以及与之相应的操作。所以整个餐饮管理信息系统分为两个大部分,即后台的数据管理维护和前台的操作。后台数据库的管理能保证系统各项功能正常运行,前台操作能提供给客户尽可能方便快捷的服务。 功能模块划分 1. 前台操作系统 订餐管理模块:点菜(输入桌台代码和食物代码)、加菜、下单。 结账管理模块:结账(输入桌台代码)、结账方式选择(包括现金结账、信用卡结账、支票结账、签单等)。 交班管理模块:统计当班数据(包括桌台数、人民币结账金额以及总金额等),为下班操作作准备。 2. 后台管理维护系统 用户权限设置:可以查询员工的基本资料(姓名、性别、年龄、出生年月、籍贯、家庭住址等),员工登录名称、密码、员工操作权限等,可以根据需要进行设置。 菜谱设置:新菜单录入(包括菜式名称、代码、类型、价格、成本等)、菜式修改、删除等菜式维护。 付款方式设置:分为人民币付款、信用卡、支票签单等,可以根据需要进行添加和删除。 系统流程分析 系统流程图1所示。当用户进入系统主界面以后,新用户经过注册后才能凭借其用户名和密码登录,老用户可以直接登录。用户登录以后,系统自动判断出其操作权限。操作权限包括普通员工和管理人员。新用户的操作权限默认为是普通员工。普通员工只能进行订餐、结账操作,而管理人员除此之外还可以进行系统设置与营业分析。 • 图1 当有顾客订餐的时候,员工输入桌台号和食物代码即可进行点菜,在结账以前,加菜是允许的。当顾客结账的时候,员工输入桌台号,选择顾客的付款方式,即可完成结账。 在下班时间,员工可以统计当班期间的消费情况。这样,员工注销此次登录,退出系统,一天的工作就到此结束。 管理人员可以随时进行系统设置,包括菜谱设置、用户权限设置、付款方式设置等。 功能模块调用 餐饮管理系统调用了以下功能模块: 用户注册模块、用户登录模块、数据显示模块。 二、概念设计 图2 给出了餐饮管理系统的E-R实体关系图。收银员、餐桌、菜单三者之间的关系是订餐,其中订餐关系包括的属性有:餐桌编号、菜肴编号、菜肴名称、菜肴单价、菜肴数量、菜肴价格、菜肴折扣、是否结账、结账时间。 三、逻辑设计 将E-R关系模型转化为二维表。本系统主要需要6个表,分别为用户信息表(UserInfo)、菜谱信息表(MenuInfo)、订餐信息表(OrderInfo)、桌台信息表(DeskInfo)、付款方式表(PayModeInfo)、当班统计表(CaldayInfo),各个表中字段的类型以及说明如表1-表6所示。 表1 用户信息表 表2 菜谱信息表 表3 订餐信息表 表4 桌台信息表 表5 付款方式表 表6 当班统计表 其中,用户信息表主要存储用户的基本信息,权限项决定了用户的操作权限。菜谱信息表存储食物的基本信息。价格项为结账与结算提供依据。桌台信息表存储各个桌台的消费情况,如消费金额、是否结账等。订餐信息表存储各个桌台的点菜情况。付款方式表存储了基本的付款方式,供结账时选择。当班统计表存储员工当班期间的营业情况。 四、数据库设计 数据库管理系统采用Microsoft SQL Server 2000作为后台数据库。首先,在企业管理器中建立一个名为MenuManageSys的数据库,然后建立以上6个数据库表,并设定主键、长度。这样,数据库的设计已经完成。 五、详细设计 本餐饮管理系统采用Visual C++ + SQL Server来开发。利用ADO技术调用后台数据库,使用了两个ADO智能指针_ConnectionPtr和_RecordsetPtr,其中_ConnectionPtr用来连接后台SQL Server数据库,_RecordsetPtr指针用来对数据库的表中的记录集进行操作。工程使用的是基于对话框的程序,每个对话框为一个类,父类为CDialog,实现的一些功能都封装在类的函数中,体现了面向对象编程语言C++的特性。 导入ADO接口:在工程的stdafx.h文件里直接引入符号#import引入ADO库文件,加入下面一行代码,以使编译器能正确编译: #import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename ("EOF","adoEOF") 用_ConnectionPtr指针连接数据库:在CmenuManageSysApp类的BOOL InitInstance()函数中加入以下代码: m_pConnection.CreateInstance("ADODB.Connection"); try { m_pConnection->ConnectionTimeout = 8; m_pConnection->PutCursorLocation(adUseClient); m_pConnection->Open("driver={SQL Server};Server=172.29.130.47; DATABASE=MenuManageSys;UID=;PWD=","","",adModeUnknown); } catch(_com_error e) { AfxMessageBox("数据库连接失败!"); return FALSE; } 1.设计工程框架 餐饮管理系统的框架是一个对话框类型的操作界面,用户注册、登录后,可对餐饮管理的各个功能模块进行操作。 1.1设置主界面 系统主界面如图3: 图3 每个事件的对应代码如下: (1) 单击“注册”菜单,弹出“注册”对话框,代码如下: void CMenuManageSysDlg::OnRegister() { CRegisterDlg dlg(this); dlg.DoModal(); } (2) 单击“登录”菜单,弹出“登录”对话框,代码如下: void CMenuManageSysDlg::OnLogin() { CLoginDlg dlg(this); dlg.DoModal(); } (3) 单击“订餐”菜单,判断用户是否登录,代码如下: void CMenuManageSysDlg::OnUpdateOrderSystem(CCmdUI* pCmdUI) { if(theApp.m_Level==0||theApp.m_Level==1) { pCmdUI->Enable(true); } else { pCmdUI->Enable(false); AfxMessageBox("请您先登录"); } } (4) 如果用户已经登录,弹出“餐桌信息”对话框,否则提示用户登录,代码如下: void CMenuManageSysDlg::OnOrderSystem() { CDeskDlg dlg; dlg.DoModal(); } (5) 单击“结账”菜单,判断用户是否登录,代码如下: void CMenuManageSysDlg::OnUpdatePayCheck(CCmdUI* pCmdUI) { if(theApp.m_Level==0||theApp.m_Level==1) { pCmdUI->Enable(true); } else { pCmdUI->Enable(false); AfxMessageBox("请您先登录"); } } (6) 如果用户已经登录,弹出“结账”对话框,否则提示用户先登录,代码如下: void CMenuManageSysDlg::OnPayCheck() { CPayDlg dlg; dlg.DoModal(); } (7) 单击“下班”菜单,判断用户是否登录,代码如下: void CMenuManageSysDlg::OnUpdateChangeDuty(CCmdUI* pCmdUI) { if(theApp.m_Level==0||theApp.m_Level==1) { pCmdUI->Enable(true); } else { pCmdUI->Enable(false); AfxMessageBox("请您先登录"); } } (8) 如果用户已经登录,弹出“交接班”对话框,否则提示用户先登录,代码如下: void CMenuManageSysDlg::OnChangeDuty() { COffdutyDlg dlg; dlg.DoModal(); } (9) 单击“用户权限设置”菜单,判断用户是否登录及其权限,代码如下: void CMenuManageSysDlg::OnUpdateSetLevel(CCmdUI* pCmdUI) { if(theApp.m_Level==1) { pCmdUI->Enable(true); } else if(theApp.m_Level==0) { pCmdUI->Enable(false); AfxMessageBox("您无权进行用户级别设置"); } else { pCmdUI->Enable(false); AfxMessageBox("请您先登录"); } } (10) 如果权限是管理人员,弹出“权限设置”对话框,如果是普通员工会提示无权进行用户级别设置,代码如下: void CMenuManageSysDlg::OnSetLevel() { CLevelDlg dlg; dlg.DoModal(); } (11) 单击“菜谱设置”菜单,判断用户是否登录及其权限,代码如下: void CMenuManageSysDlg::OnUpdateSetMenu(CCmdUI* pCmdUI) { if(theApp.m_Level==1) { pCmdUI->Enable(true); } else if(theApp.m_Level==0) { pCmdUI->Enable(false); AfxMessageBox("您无权进行菜谱设置"); } else { pCmdUI->Enable(false); AfxMessageBox("请您先登录"); } } (12)如果权限是管理人员,弹出“菜谱设置”对话框,如果是普通员工会提示无权进行用户级别设置,代码如下: void CMenuManageSysDlg::OnSetMenu() { CMenuSetDlg dlg; dlg.DoModal(); } (13)单击“付款方式设置”菜单,判断用户是否登录及其权限,代码如下: void CMenuManageSysDlg::OnUpdatePaymodeSet(CCmdUI* pCmdUI) { if(theApp.m_Level==1) { pCmdUI->Enable(true); } else if(theApp.m_Level==0) { pCmdUI->Enable(false); AfxMessageBox("您无权进行付款方式设置"); } else { pCmdUI->Enable(false); AfxMessageBox("请您先登录"); } } (14)如果权限是管理人员,弹出“设置付款方式”对话框,如果是普通员工会提示无权进行用户级别设置,代码如下: void CMenuManageSysDlg::OnPaymodeSet() { CSetPaymodeDlg dlg; dlg.DoModal(); } (15)单击“注销”菜单,提示用户本次登录已注销,代码如下: void CMenuManageSysDlg::OnLogout() { if(MessageBox("您确定要注销吗","注销询问",MB_OKCANCEL|MB_ICONQUESTION)==IDOK) { theApp.m_Level=-1; AfxMessageBox("本次登录已注销"); } } (16)单击“退出系统”,在确定退出后,关闭系统,代码如下: void CMenuManageSysDlg::OnExitSystem() { if(MessageBox("真的要退出系统吗","退出询问",MB_OKCANCEL|MB_ICONQUESTION)==IDOK) { CDialog::OnOK(); } } 1.2设计注册模块 注册模块如图4: 图4 注册模块 在输入了完整的信息,按下“确定”按钮后,如果没有重复用户,则注册成功,代码如下: void CRegisterDlg::OnRegisterBtn() { // TODO: Add your control notification handler code here UpdateData(TRUE); if(!m_strUserName.IsEmpty()&&!m_strUserNative.IsEmpty() &&!m_strUserAdddress.IsEmpty() &&!m_strUserPwd.IsEmpty()&& !m_strUserPwdAgain.IsEmpty() && !m_strUserNum.IsEmpty() &&m_nUserAge != 0) { if(m_strUserPwd.CompareNoCase(m_strUserPwdAgain) != 0 ) { MessageBox("密码有误,请重新输入密码。","系统注册"); } else { try { m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open("SELECT*FROMUserInfo",_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText); } catch(_com_error e) { CString temp; temp.Format("连接数据库误信息:%s",e.ErrorMessage()); AfxMessageBox(temp); return; } m_pRecordset->AddNew(); m_pRecordset->PutCollect("UserName",_variant_t(m_strUserName)); m_pRecordset->PutCollect("UserPwd",_variant_t(m_strUserPwd)); m_pRecordset->PutCollect("UserNative",_variant_t(m_strUserNative)); m_pRecordset->PutCollect("UserAddress",_variant_t(m_strUserAdddress)); m_pRecordset->PutCollect("UserNum",_variant_t(m_strUserNum)); CString str; if(m_nUserSex==0) { m_pRecordset->PutCollect("UserSex",_variant_t("男")); } else m_pRecordset->PutCollect("UserSex",_variant_t("女")); str.Format("%d",m_nUserAge); m_pRecordset->PutCollect("UserAge",_variant_t(str)); str.Format("%d",0); m_pRecordset->PutCollect("UserLevel",_variant_t(str)); m_pRecordset->Update(); m_pRecordset->Close(); m_pRecordset = NULL; MessageBox("恭喜您注册成功","系统注册"); CDialog::OnOK(); return; } } else { MessageBox("请输入完整注册信息","系统注册"); } } 登录模块如图5: 图5 登录模块 输入完整信息,并单击“确定”按钮后,如果用户名不存在,则重新输入;如果密码误,则重新输入,在重新输入三次密码后还不正确,则退出登录界面,登录失败。代码如下: void CLoginDlg::OnOK() { UpdateData(TRUE); if(!m_strUserName.IsEmpty() && !m_strPassword.IsEmpty()) { try { CString sql,str; // str.Format("%d",m_nUserNum); sql = "SELECT * FROM UserInfo WHERE UserName='"+m_strUserName+"' and UserNum='"+m_strUserNum+"' and UserPwd = '"+m_strPassword+"' "; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText); if(m_pRecordset->adoEOF) { m_pRecordset->Close(); sql= "SELECT * FROM UserInfo WHERE UserName='"+m_strUserName+"' AND UserNum='"+m_strUserNum+"' "; try { m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText); if(m_pRecordset->adoEOF) { MessageBox("此用户不存在!","登录系统"); } else { if(count>=2) { MessageBox("登录次数过多,系统关闭","系统登录误",MB_OK|MB_ICONWARNING); CDialog::OnOK(); } else { MessageBox("密码误!","登录系统"); count++; } return; } } catch(_com_error e)///捕捉异常 { CString temp; temp.Format("连接数据库误信息:%s",e.ErrorMessage()); AfxMessageBox(temp); return; } } else { theApp.m_Level = m_pRecordset->GetCollect("UserLevel").lVal; theApp.m_name = m_strUserName; MessageBox("登录成功!","登录系统",MB_OKCANCEL|MB_ICONQUESTION); CDialog::OnOK(); return; } } catch(_com_error e)///捕捉异常 { CString temp; temp.Format("连接数据库误信息:%s",e.ErrorMessage()); AfxMessageBox(temp); return; } m_pRecordset->Close(); m_pRecordset = NULL; } else { MessageBox("请输入用户名和密码","登录系统"); } } 到此,注册模块与登录模块就设计完成。新用户注册以后,凭借其用户名和密码可以登陆,从而对系统进行操作。 3.功能模块设计 根据功能模块划分,可以将餐饮管理系统的功能模块划分为值班员管理模块、菜谱管理模块、用户管理模块、订餐模块、结账模块,下面对工程各个功能进行介绍。 3.1订餐模块设计 订餐模块的功能是员工输入桌台号码和食物代码进行点菜、根据需要加菜、下单。订餐模块如图6所示: 图6 订餐模块 为对话框类添加3个数据集对象: _RecordsetPtr m_pRecordset_Desk; _RecordsetPtr m_pRecordset_Order; _RecordsetPtr m_pRecordset_Menu; 对话框类的各成员函数的代码如下: CDeskDlg::CDeskDlg(CWnd* pParent /*=NULL*/) : CDialog(CDeskDlg::IDD, pParent) { //{{AFX_DATA_INIT(CDeskDlg) m_nOrderDeskNumber = 0; m_nOrderFoodNumber = 0; m_nOrderFoodRebate = 100; m_nOrderFoodAcount = 1; //}}AFX_DATA_INIT } BOOL CDeskDlg::OnInitDialog() //对话框初始化函数 { CDialog::OnInitDialog(); GetDlgItem(IDOK)->EnableWindow(FALSE); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CDeskDlg::OnOrderBtn() //点菜消息按钮 { UpdateData(TRUE); CString str; CString sql; if(m_nOrderDeskNumber == 0) { AfxMessageBox("请输入餐桌编号"); return; } if(m_nOrderFoodNumber != 0 ) { str.Format("%d",m_nOrderFoodNumber); sql = "SELECT * FROM MenuInfo WHERE FoodNum = "+str+" "; m_pRecordset_Menu.CreateInstance("ADODB.Recordset"); m_pRecordset_Menu->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset_Menu->GetRecordCount()==0) { AfxMessageBox("该菜肴编号不存在,请重新输入编号"); return; } else { int m_nTempPrice; CString m_strTempName; m_nTempPrice = m_pRecordset_Menu->GetCollect("FoodPrice").lVal;//食物价格 m_strTempName = m_pRecordset_Menu->GetCollect("FoodName").bstrVal;//食物名称 m_pRecordset_Menu->Close(); str.Format("%d",m_nOrderDeskNumber);//桌子编号 sql = "SELECT * FROM OrderInfo WHERE DeskNum = "+str+" "; m_pRecordset_Order.CreateInstance("ADODB.Recordset"); m_pRecordset_Order->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_pRecordset_Order->AddNew(); str.Format("%d",m_nOrderDeskNumber); m_pRecordset_Order->PutCollect("DeskNum" ,_variant_t(str));//餐桌编号 str.Format("%d" , m_nOrderFoodNumber); m_pRecordset_Order->PutCollect("FoodNum" ,_variant_t(str));//食物编号 str.Format("%d",m_nTempPrice); m_pRecordset_Order->PutCollect("FoodSignalPrice" ,_variant_t(str));//食物单价 str.Format("%d",m_nOrderFoodAcount); m_pRecordset_Order->PutCollect("FoodAcount" ,_variant_t(str));//食物数量 m_nTempPrice *=m_nOrderFoodAcount; str.Format("%d",m_nTempPrice); m_pRecordset_Order->PutCollect("FoodPrice" ,_variant_t(str));//食物价格 str.Format("%d",m_nOrderFoodRebate); m_pRecordset_Order->PutCollect("FoodRebate" ,_variant_t(str));//食物折扣 int m_nTempRePrice; m_nTempRePrice = (int)m_nTempPrice*m_nOrderFoodRebate/100; str.Format("%d",m_nTempRePrice); m_pRecordset_Order->PutCollect("FoodRePrice" ,_variant_t(str)); //折后价格(小计) m_pRecordset_Order->PutCollect("FoodName" ,_variant_t(m_strTempName));//食物名称 int m_nTempCheck; m_nTempCheck = 0; str.Format("%d",m_nTempCheck); m_pRecordset_Order->PutCollect("FoodCheck" ,_variant_t(str));//是否结帐 CString paytime; CTime now=CTime::GetCurrentTime(); paytime=now.Format(_T("%Y-%m-%d %H:%M:%S")); m_pRecordset_Order->PutCollect("FoodTime",_variant_t(paytime));//点菜时间 m_pRecordset_Order->Update(); m_pRecordset_Order ->Close(); str.Format("%d",m_nOrderDeskNumber); CString str1; str1.Format("%d" , 0); sql = "SELECT * FROM OrderInfo WHERE DeskNum = "+str+" and FoodCheck = "+str1+" "; m_pRecordset_Order.CreateInstance("ADODB.Recordset"); m_pRecordset_Order->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_dbFood.SetRefDataSource(NULL); m_dbFood.SetRefDataSource((LPUNKNOWN)m_pRecordset_Order); m_dbFood.SetColumnHeaders(2) ; m_dbFood.Refresh(); GetDlgItem(IDOK)->EnableWindow(TRUE); } } else { AfxMessageBox("请输入菜肴编号"); return; } } void CDeskDlg::OnOK() //下单消息按钮 { CString str,sql,str1; int m_nTempRePrice; m_nTotalPrice = 0; while(!m_pRecordset_Order->adoEOF) { m_nTempRePrice=m_pRecordset_Order->GetCollect("FoodRePrice").lVal; m_nTotalPrice += m_nTempRePrice; m_pRecordset_Order->MoveNext(); } if(m_nTotalPrice>0) { int temp=0; str1.Format("%d",temp); str.Format("%d",m_nOrderDeskNumber); sql = "SELECT * FROM DeskInfo WHERE DeskNum = "+str+" and DeskCheck = "+str1+""; m_pRecordset_Desk.CreateInstance("ADODB.Recordset"); m_pRecordset_Desk->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset_Desk->GetRecordCount()==0) { m_pRecordset_Desk->AddNew(); str.Format("%d",m_nOrderDeskNumber); m_pRecordset_Desk->PutCollect("DeskNum",(_variant_t)str); str.Format("%d",m_nTotalPrice); m_pRecordset_Desk->PutCollect("DeskPrice",(_variant_t)str); temp = 0; str.Format("%d" , temp); m_pRecordset_Desk->PutCollect("DeskCheck",(_variant_t)str); } else { str.Format("%d",m_nTotalPrice); m_pRecordset_Desk->PutCollect("DeskPrice",(_variant_t)str); } m_pRecordset_Desk->Update(); m_pRecordset_Desk->Close(); } CDialog::OnOK(); } void CDeskDlg::OnUpdateOrderDeskNumber() //根据餐桌号自动将原来已点的食物信息绑定到数据列表 { UpdateData(TRUE); CString str,sql; str.Format("%d",m_nOrderDeskNumber); CString str1; int temp=0; str1.Format("%d" , temp); sql = "SELECT * FROM OrderInfo WHERE DeskNum = "+str+" and FoodCheck = "+str1+" "; m_pRecordset_Order.CreateInstance("ADODB.Recordset"); m_pRecordset_Order->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_dbFood.SetRefDataSource(NULL); m_dbFood.SetRefDataSource((LPUNKNOWN)m_pRecordset_Order); m_dbFood.SetColumnHeaders(2) ; m_dbFood.Refresh(); } 3.2结账模块设计 结账模块的功能是员工输入桌台代码进行结账、选择结账方式(包括现金结账、信用卡结账、支票结账、签单等)、自动找零。结账模块如图7所示: 图7 结账模块 为对话框类添加3个数据集对象,代码如下: _RecordsetPtr m_pRecordset_Paymode; _RecordsetPtr m_pRecordset_Order; _RecordsetPtr m_pRecordset_Desk; 对话框类的各成员函数的代码如下: CPayDlg::CPayDlg(CWnd* pParent /*=NULL*/) : CDialog(CPayDlg::IDD, pParent) { //{{AFX_DATA_INIT(CPayDlg) m_strPaymode = _T(""); m_strPayUserName = _T(""); m_nPayDeskNumber = 0; m_nPayTotalPrice = 0; m_nPayRealPrice = 0; m_nPayRePrice = 0; m_timePay = COleDateTime::GetCurrentTime(); //}}AFX_DATA_INIT } BOOL CPayDlg::OnInitDialog() //对话框初始化函数 { CDialog::OnInitDialog(); m_strPayUserName=theApp.m_name; CString sql; sql="SELECT * FROM PayModeInfo"; m_pRecordset_Paymode.CreateInstance("ADODB.Recordset"); m_pRecordset_Paymode->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset_Paymode->GetRecordCount()!=0) { while(!m_pRecordset_Paymode->adoEOF) { m_coPaymode.AddString((LPCTSTR)(_bstr_t)m_pRecordset_Paymode->GetCollect("NAME")); m_pRecordset_Paymode->MoveNext(); } m_pRecordset_Paymode->Close(); m_coPaymode.SetCurSel(0); } UpdateData(FALSE); return TRUE; } void CPayDlg::OnUpdatePayDeskNumber() //自动将对应桌号的点菜信息以及消费情况显示在桌面上 { UpdateData(TRUE); CString sql,str,str1; int temp=0; str.Format("%d",m_nPayDeskNumber); str1.Format("%d",temp); sql="SELECT * FROM DeskInfo WHERE DeskNum="+str+" AND DeskCheck="+str1+" "; m_pRecordset_Desk.CreateInstance("ADODB.Recordset"); m_pRecordset_Desk->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset_Desk->GetRecordCount()!=0) { m_nPayTotalPrice=m_pRecordset_Desk->GetCollect("DeskPrice").lVal; } m_pRecordset_Desk->Close(); sql="SELECT * FROM OrderInfo WHERE DeskNum="+str+" AND FoodCheck="+str1+" "; m_pRecordset_Order.CreateInstance("ADODB.Recordset"); m_pRecordset_Order->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_dbPay.SetRefDataSource(NULL); m_dbPay.SetRefDataSource((LPUNKNOWN)m_pRecordset_Order); m_dbPay.SetColumnHeaders(1); m_dbPay.Refresh(); UpdateData(FALSE); } void CPayDlg::OnUpdatePayRealprice() //根据实收金额自动计算找零金额 { UpdateData(TRUE); m_nPayRePrice=m_nPayRealPrice-m_nPayTotalPrice; UpdateData(FALSE); } void CPayDlg::OnOK() //确定按钮消息函数,将数据写回DESK表和ORDER表,结账完成 { UpdateData(TRUE); if(!m_strPaymode.IsEmpty()&&m_nPayRealPrice!=0) { CString sql,str,str1; int temp=0; str.Format("%d",m_nPayDeskNumber); str1.Format("%d",temp); sql="SELECT * FROM DeskInfo WHERE DeskNum="+str+" AND DeskCheck="+str1+" "; m_pRecordset_Desk.CreateInstance("ADODB.Recordset"); m_pRecordset_Desk->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset_Desk->GetRecordCount!=0) { temp=1; str.Format("%d",temp); m_pRecordset_Desk->PutCollect("DeskCheck",(_variant_t)str); int selmode; selmode=m_coPaymode.GetCurSel(); m_coPaymode.GetLBText(selmode,m_strPaymode); m_pRecordset_Desk->PutCollect("DeskPaymode",_variant_t(m_strPaymode)); CString paytime; CTime now=CTime::GetCurrentTime(); paytime=now.Format(_T("%Y-%m-%d %H:%M:%S")); m_pRecordset_Desk->PutCollect("DeskDateTime",(_variant_t)paytime); m_pRecordset_Desk->PutCollect("DeskName",(_variant_t)m_strPayUserName); } m_pRecordset_Desk->Update(); m_pRecordset_Desk->Close(); str.Format("%d",m_nPayDeskNumber); sql="SELECT * FROM OrderInfo WHERE DeskNum="+str+" AND FoodCheck="+str1+" "; m_pRecordset_Order.CreateInstance("ADODB.Recordset"); m_pRecordset_Order->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset_Order->GetRecordCount()!=0) { temp=1; str.Format("%d",temp); while(!m_pRecordset_Order->adoEOF) { m_pRecordset_Order->PutCollect("FoodCheck",(_variant_t)str); m_pRecordset_Order->Update(); m_pRecordset_Order->MoveNext(); } } m_pRecordset_Order->Close(); str.Format("%d",m_nPayDeskNumber); str+="号桌已结账"; AfxMessageBox(str); CDialog::OnOK(); } else { AfxMessageBox("请输入完整信息"); } } 到此,结账模块已经设计完成。 3.3交接班模块设计 交接班模块的功能是管理员统计当班数据(包括桌台数、人民币结账金额以及总金额等),为下班操作做准备。交接班模块如图8所示: 图8 交接班模块 为对话框类添加两个数据集对象,代码如下: _RecordsetPtr m_pRecordset_Off; _RecordsetPtr m_pRecordset_Desk; 对话框类的各成员函数的代码如下: COffdutyDlg::COffdutyDlg(CWnd* pParent /*=NULL*/) : CDialog(COffdutyDlg::IDD, pParent) { //{{AFX_DATA_INIT(COffdutyDlg) m_strDayName = _T(""); m_nTotalAcount = 0; m_timeDay = 0; //}}AFX_DATA_INIT } BOOL COffdutyDlg::OnInitDialog() //对话框初始化 { CDialog::OnInitDialog(); m_timeDay=CTime::GetCurrentTime(); m_strDayName=theApp.m_name; UpdateData(FALSE); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void COffdutyDlg::OnCalDayBtn() //统计按钮,负责当班统计 { CString sql,str; int temp=1; str.Format("%d",temp); sql="SELECT * FROM DeskInfo WHERE DeskCheck="+str+" AND DeskName='"+m_strDayName+"' "; m_pRecordset_Desk.CreateInstance("ADODB.Recordset"); m_pRecordset_Desk->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); int renminbi_jine=0,qita_jine=0,total_jine=0,acount=0; if(m_pRecordset_Desk->GetRecordCount!=0) { while(!m_pRecordset_Desk->adoEOF) { str=m_pRecordset_Desk->GetCollect("DeskPaymode").bstrVal; if(str.CompareNoCase("人民币")==0) { renminbi_jine+=m_pRecordset_Desk->GetCollect("DeskPrice").lVal; } else { qita_jine+=m_pRecordset_Desk->GetCollect("DeskPrice").lVal; } acount++; m_pRecordset_Desk->MoveNext(); } } m_pRecordset_Desk->Close(); total_jine=renminbi_jine+qita_jine; m_pRecordset_Off.CreateInstance("ADODB.Recordset"); m_pRecordset_Off->Open("SELECT * FROM CalDayInfo",_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset_Off->GetRecordCount!=0) { while(!m_pRecordset_Off->adoEOF) { m_pRecordset_Off->Delete(adAffectCurrent); m_pRecordset_Off->Update(); m_pRecordset_Off->MoveNext(); } } m_pRecordset_Off->AddNew(); m_pRecordset_Off->PutCollect("mode",_variant_t("人民币")); str.Format("%d",renminbi_jine); m_pRecordset_Off->PutCollect("money",_variant_t(str)); m_pRecordset_Off->AddNew(); m_pRecordset_Off->PutCollect("mode",_variant_t("其他")); str.Format("%d",qita_jine); m_pRecordset_Off->PutCollect("money",_variant_t(str)); m_pRecordset_Off->AddNew(); m_pRecordset_Off->PutCollect("mode",_variant_t("合计")); str.Format("%d",total_jine); m_pRecordset_Off->PutCollect("money",_variant_t(str)); m_dbTotalDay.SetRefDataSource(NULL); m_dbTotalDay.SetRefDataSource((LPUNKNOWN)m_pRecordset_Off); m_dbTotalDay.SetColumnHeaders(2); m_dbTotalDay.Refresh(); m_pRecordset_Off->Update(); m_nTotalAcount=acount; UpdateData(FALSE); } 3.4用户权限管理模块设计 用户权限模块的功能是方便管理人员查询员工的基本资料,设置员工的操作权限。用户权限设置模块的设计如图9: 图9 权限设置模块 对话框类的各成员函数的代码如下: CLevelDlg::CLevelDlg(CWnd* pParent /*=NULL*/) : CDialog(CLevelDlg::IDD, pParent) { //{{AFX_DATA_INIT(CLevelDlg) m_strUserName = _T(""); m_strUserNum = _T(""); m_strLevelSelect = _T(""); //}}AFX_DATA_INIT } BOOL CLevelDlg::OnInitDialog() { CDialog::OnInitDialog(); m_coLevelSelect.AddString("管理员"); m_coLevelSelect.AddString("用户"); GetDlgItem(IDC_LEVEL_SELECT)->EnableWindow(FALSE); GetDlgItem(IDC_CONFIRM)->EnableWindow(FALSE); UpdateData(FALSE); CString sql; sql="SELECT * FROM UserInfo "; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_dbUserInfo.SetRefDataSource(NULL); m_dbUserInfo.SetRefDataSource((LPUNKNOWN)m_pRecordset); m_dbUserInfo.SetColumnHeaders(2); m_dbUserInfo.Refresh(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CLevelDlg::OnChange() { GetDlgItem(IDC_LEVEL_SELECT)->EnableWindow(TRUE); GetDlgItem(IDC_CONFIRM)->EnableWindow(TRUE); UpdateData(TRUE); CString sql; sql="SELECT UserName,UserNum,UserLevel,UserPwd FROM UserInfo WHERE UserName='"+m_strUserName+"' AND UserNum='"+m_strUserNum+"' "; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_dbUserInfo.SetRefDataSource(NULL); m_dbUserInfo.SetRefDataSource((LPUNKNOWN)m_pRecordset); m_dbUserInfo.SetColumnHeaders(2); m_dbUserInfo.Refresh(); } void CLevelDlg::OnConfirm() { UpdateData(TRUE); if(!m_strLevelSelect.IsEmpty()) { if(m_strLevelSelect.CompareNoCase("管理员")==0) { CString str,sql; int temp=1; str.Format("%d",temp); sql="SELECT UserName,UserNum,UserLevel,UserPwd FROM UserInfo WHERE UserName='"+m_strUserName+"' AND UserNum='"+m_strUserNum+"' "; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_pRecordset->PutCollect("UserLevel",_variant_t(str)); m_pRecordset->Update(); m_dbUserInfo.SetRefDataSource(NULL); m_dbUserInfo.SetRefDataSource((LPUNKNOWN)m_pRecordset); m_dbUserInfo.SetColumnHeaders(2); m_dbUserInfo.Refresh(); AfxMessageBox("权限修改成功"); GetDlgItem(IDC_LEVEL_SELECT)->EnableWindow(FALSE); GetDlgItem(IDC_CONFIRM)->EnableWindow(FALSE); } else { CString str,sql; int temp=0; str.Format("%d",temp); sql="SELECT UserName,UserNum,UserLevel,UserPwd FROM UserInfo WHERE UserName='"+m_strUserName+"' AND UserNum='"+m_strUserNum+"' "; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_pRecordset->PutCollect("UserLevel",_variant_t(str)); m_pRecordset->Update(); m_dbUserInfo.SetRefDataSource(NULL); m_dbUserInfo.SetRefDataSource((LPUNKNOWN)m_pRecordset); m_dbUserInfo.SetColumnHeaders(2); m_dbUserInfo.Refresh(); AfxMessageBox("权限修改成功"); GetDlgItem(IDC_LEVEL_SELECT)->EnableWindow(FALSE); GetDlgItem(IDC_CONFIRM)->EnableWindow(FALSE); } } else { AfxMessageBox("请选择权限"); } } void CLevelDlg::OnShowAll() { CString sql; sql="SELECT * FROM UserInfo "; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_dbUserInfo.SetRefDataSource(NULL); m_dbUserInfo.SetRefDataSource((LPUNKNOWN)m_pRecordset); m_dbUserInfo.SetColumnHeaders(2); m_dbUserInfo.Refresh(); GetDlgItem(IDC_LEVEL_SELECT)->EnableWindow(FALSE); GetDlgItem(IDC_CONFIRM)->EnableWindow(FALSE); } 至此,权限设置模块设计完成。 3.5菜谱管理模块设计 菜谱管理模块的功能是管理人员进行新菜式的录入、菜式修改、删除等菜式维护。菜谱管理模块如图10: 图10 菜单管理模块 对话框类的各成员函数的代码如下: CMenuSetDlg::CMenuSetDlg(CWnd* pParent /*=NULL*/) : CDialog(CMenuSetDlg::IDD, pParent) { //{{AFX_DATA_INIT(CMenuSetDlg) m_nInputNum = 0; m_nCost = 0; m_strName = _T(""); m_nNum = 0; m_nPrice = 0; m_strRemark = _T(""); m_strType = _T(""); //}}AFX_DATA_INIT } BOOL CMenuSetDlg::OnInitDialog() //对话框初始化 { CDialog::OnInitDialog(); GetDlgItem(IDC_MODIFYSAVE)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_NUM)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_NAME)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_TYPE)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_PRICE)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_COST)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_REMARK)->EnableWindow(FALSE); GetDlgItem(IDC_DEL)->EnableWindow(FALSE); GetDlgItem(IDC_INQUIRY)->EnableWindow(FALSE); GetDlgItem(IDC_MODIFY)->EnableWindow(FALSE); GetDlgItem(IDC_ADDSAVE)->EnableWindow(FALSE); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CMenuSetDlg::OnUpdateEditInputNum() { UpdateData(TRUE); if(m_nInputNum!=0) { GetDlgItem(IDC_INQUIRY)->EnableWindow(TRUE); GetDlgItem(IDC_MODIFY)->EnableWindow(FALSE); GetDlgItem(IDC_DEL)->EnableWindow(FALSE); GetDlgItem(IDC_MODIFYSAVE)->EnableWindow(FALSE); } } void CMenuSetDlg::OnInquiry() //查询 { UpdateData(TRUE); CString sql,str; str.Format("%d",m_nInputNum); sql="SELECT * FROM MenuInfo WHERE FoodNum="+str+" "; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset->GetRecordCount()!=0) { m_nInputNum=0; m_nNum=m_pRecordset->GetCollect("FoodNum").lVal; m_strName=m_pRecordset->GetCollect("FoodName").bstrVal; m_strType=m_pRecordset->GetCollect("FoodType").bstrVal; m_nPrice=m_pRecordset->GetCollect("FoodPrice").lVal; m_nCost=m_pRecordset->GetCollect("FoodCost").lVal; m_strRemark=m_pRecordset->GetCollect("FoodRemark").bstrVal; GetDlgItem(IDC_EDIT_NUM)->EnableWindow(FALSE); GetDlgItem(IDC_DEL)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_NAME)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_TYPE)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_PRICE)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_COST)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_REMARK)->EnableWindow(FALSE); GetDlgItem(IDC_INQUIRY)->EnableWindow(FALSE); GetDlgItem(IDC_MODIFY)->EnableWindow(TRUE); GetDlgItem(IDC_ADDSAVE)->EnableWindow(FALSE); } else { // m_nInputNum=0; AfxMessageBox("您所查找的菜肴不存在"); GetDlgItem(IDC_DEL)->EnableWindow(FALSE); GetDlgItem(IDC_INQUIRY)->EnableWindow(FALSE); GetDlgItem(IDC_MODIFY)->EnableWindow(FALSE); GetDlgItem(IDC_ADDSAVE)->EnableWindow(FALSE); } UpdateData(FALSE); } void CMenuSetDlg::OnAddNew() //新增 { m_nCost = 0; m_strName = _T(""); m_nNum = 0; m_nPrice = 0; m_strRemark = _T(""); m_strType = _T(""); GetDlgItem(IDC_ADDSAVE)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_NUM)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_NAME)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_TYPE)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_PRICE)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_COST)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_REMARK)->EnableWindow(TRUE); GetDlgItem(IDC_MODIFYSAVE)->EnableWindow(FALSE); GetDlgItem(IDC_INQUIRY)->EnableWindow(FALSE); GetDlgItem(IDC_MODIFY)->EnableWindow(FALSE); GetDlgItem(IDC_DEL)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_INPUT_NUM)->EnableWindow(TRUE); UpdateData(FALSE); } void CMenuSetDlg::OnAddSave() //保存所增加项 { UpdateData(TRUE); if(m_nCost!=0 && m_nNum!=0 && m_nPrice!=0 && !m_strName.IsEmpty() && !m_strRemark.IsEmpty() && !m_strType.IsEmpty()) { GetDlgItem(IDC_EDIT_NUM)->EnableWindow(FALSE); GetDlgItem(IDC_ADDSAVE)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_NAME)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_TYPE)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_PRICE)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_COST)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_REMARK)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_INPUT_NUM)->EnableWindow(TRUE); CString str,sql; str.Format("%d",m_nNum); sql="SELECT * FROM MenuInfo WHERE FoodNum="+str+""; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset->GetRecordCount()!=0) { AfxMessageBox("菜肴号码已存在"); } else { m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open("SELECT * FROM MenuInfo",_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_nNum==0) { AfxMessageBox("菜肴号码不能为0"); return; } else { m_pRecordset->AddNew(); str.Format("%d",m_nNum); m_pRecordset->PutCollect("FoodNum",_variant_t(str)); m_pRecordset->PutCollect("FoodName",_variant_t(m_strName)); m_pRecordset->PutCollect("FoodType",_variant_t(m_strType)); str.Format("%d",m_nPrice); m_pRecordset->PutCollect("FoodPrice",_variant_t(str)); str.Format("%d",m_nCost); m_pRecordset->PutCollect("FoodCost",_variant_t(str)); m_pRecordset->PutCollect("FoodRemark",_variant_t(m_strRemark)); m_pRecordset->Update(); m_pRecordset->Close(); AfxMessageBox("已保存"); m_nCost = 0; m_strName = _T(""); m_nNum = 0; m_nPrice = 0; m_strRemark = _T(""); m_strType = _T(""); UpdateData(FALSE); } } } else AfxMessageBox("请输入完整信息"); } void CMenuSetDlg::OnModify() //修改 { GetDlgItem(IDC_EDIT_NUM)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_NAME)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_TYPE)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_PRICE)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_COST)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_REMARK)->EnableWindow(TRUE); GetDlgItem(IDC_MODIFYSAVE)->EnableWindow(TRUE); GetDlgItem(IDC_DEL)->EnableWindow(FALSE); m_nCost = 0; m_nPrice = 0; m_strRemark = _T(""); m_strType = _T(""); UpdateData(FALSE); } void CMenuSetDlg::OnModifysave() //保存修改 { UpdateData(TRUE); if(!m_strType.IsEmpty()&&m_nPrice!=0&&m_nCost!=0&&!m_strRemark.IsEmpty()) { CString str,sql; str.Format("%d",m_nNum); // m_pRecordset->PutCollect("FoodNum",_variant_t(str)); // m_pRecordset->PutCollect("FoodName",_variant_t(m_strName)); m_pRecordset->PutCollect("FoodType",_variant_t(m_strType)); str.Format("%d",m_nPrice); m_pRecordset->PutCollect("FoodPrice",_variant_t(str)); str.Format("%d",m_nCost); m_pRecordset->PutCollect("FoodCost",_variant_t(str)); m_pRecordset->PutCollect("FoodRemark",_variant_t(m_strRemark)); m_pRecordset->Update(); AfxMessageBox("修改成功"); GetDlgItem(IDC_MODIFY)->EnableWindow(FALSE); GetDlgItem(IDC_MODIFYSAVE)->EnableWindow(FALSE); } else { AfxMessageBox("请输入完整信息"); } } void CMenuSetDlg::OnDel() { m_pRecordset->Delete(adAffectCurrent); m_pRecordset->Close(); AfxMessageBox("删除成功"); GetDlgItem(IDC_DEL)->EnableWindow(FALSE); GetDlgItem(IDC_MODIFY)->EnableWindow(FALSE); } 至此,菜谱管理模块设计完成。 3.6付款方式设置模块设计 付款方式设置模块如图11: 图11 付款方式模块 对话框类的各成员函数的代码如下: CSetPaymodeDlg::CSetPaymodeDlg(CWnd* pParent /*=NULL*/) : CDialog(CSetPaymodeDlg::IDD, pParent) { //{{AFX_DATA_INIT(CSetPaymodeDlg) m_strPaymode = _T(""); //}}AFX_DATA_INIT } BOOL CSetPaymodeDlg::OnInitDialog() //对话框初始化 { CDialog::OnInitDialog(); m_bAdd=FALSE; m_bDel=FALSE; m_sInputPaymode.ShowWindow(SW_HIDE); m_editPaymode.ShowWindow(SW_HIDE); m_btnSure.ShowWindow(SW_HIDE); CString sql; sql="SELECT * FROM PayModeInfo"; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_dbPaymode.SetRefDataSource(NULL); m_dbPaymode.SetRefDataSource((LPUNKNOWN)m_pRecordset); m_dbPaymode.SetColumnHeaders(1); m_dbPaymode.Refresh(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CSetPaymodeDlg::OnPaymodeAddBtn() //单击按钮后,开始新增 { m_sInputPaymode.ShowWindow(SW_SHOW); m_editPaymode.ShowWindow(SW_SHOW); m_btnSure.ShowWindow(SW_SHOW); m_bAdd=TRUE; m_bDel=FALSE; } void CSetPaymodeDlg::OnPaymodeDelBtn() //单击按钮后,开始删除 { m_sInputPaymode.ShowWindow(SW_SHOW); m_editPaymode.ShowWindow(SW_SHOW); m_btnSure.ShowWindow(SW_SHOW); m_bAdd=FALSE; m_bDel=TRUE; } void CSetPaymodeDlg::OnOK() //确定添加或者删除 { UpdateData(TRUE); if(!m_strPaymode.IsEmpty()) { if(m_bAdd==TRUE) { CString str; BOOL flag=0; m_pRecordset->MoveFirst(); while(!m_pRecordset->adoEOF) { str=m_pRecordset->GetCollect("NAME").bstrVal; if(str.CompareNoCase(m_strPaymode)==0) { MessageBox("您输入的付款方式已存在","输入误",MB_OK|MB_ICONWARNING); flag=1; break; } else m_pRecordset->MoveNext(); } /* CString sql; sql="SELECT * FROM PayModeInfo WHERE NAME='"+m_strPaymode+"' "; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset->GetRecordCount()==0) { MessageBox("您输入的付款方式已存在","输入误",MB_OK|MB_ICONWARNING); flag=1; } */ if(flag==0) { m_pRecordset->MoveLast(); m_pRecordset->AddNew(); m_pRecordset->PutCollect("NAME",_variant_t(m_strPaymode)); m_pRecordset->Update(); m_dbPaymode.SetRefDataSource(NULL); m_dbPaymode.SetRefDataSource((LPUNKNOWN)m_pRecordset); m_dbPaymode.SetColumnHeaders(1); m_dbPaymode.Refresh(); m_bAdd=FALSE; } } if(m_bDel==TRUE) { BOOL flag=0; UpdateData(TRUE); CString str; int newid; /* m_pRecordset->MoveFirst(); while(!m_pRecordset->adoEOF) { str=m_pRecordset->GetCollect("NAME").bstrVal; if(str.CompareNoCase(m_strPaymode)==0) { flag=1; m_pRecordset->Delete(adAffectCurrent); m_pRecordset->Update(); break; } else m_pRecordset->MoveNext(); } */ CString sql; sql="SELECT * FROM PayModeInfo WHERE NAME='"+m_strPaymode+"'"; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset->GetRecordCount()!=0) { flag=1; m_pRecordset->Delete(adAffectCurrent); m_pRecordset->Update(); m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open("SELECT * FROM PayModeInfo",_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_dbPaymode.SetRefDataSource(NULL); m_dbPaymode.SetRefDataSource((LPUNKNOWN)m_pRecordset); m_dbPaymode.SetColumnHeaders(1); m_dbPaymode.Refresh(); m_bDel=FALSE; } if(flag==0) { MessageBox("您输入的付款方式不存在,请查询后确认","输入误",MB_OK|MB_ICONWARNING); } m_dbPaymode.Refresh(); m_bDel=FALSE; } m_editPaymode.SetWindowText(""); m_sInputPaymode.ShowWindow(SW_HIDE); m_editPaymode.ShowWindow(SW_HIDE); m_btnSure.ShowWindow(SW_HIDE); } else { AfxMessageBox("请输入付款方式"); } } 至此,付款方式设置模块设计完成。 六、系统演示 系统设计并编写完成后,编译运行程序,初始界面如图12所示: 图12 1. 系统登录 单击“登录”菜单,弹出登录界面,在登陆界面输入框中分别输入用户编号、用户名和密码,如图13所示。 如果用户名和密码都正确,那么就可以登陆系统,系统提示如图14所示。 图13 图14 如果用户名不存在或密码输入不正确,系统提示如图15和图16所示,将无法进入系统。 图15 图16 如果未登录就进行其他操作,系统提示如图17所示。只有登录后才能操作其他功能。单击“注册”菜单,弹出注册对话框如图18所示。 按要求填写完注册信息,如果注册名未被注册,并且前后两次输入的密码一致,那么系统给出如图19所示提示。 如果前后两次输入密码不一致,系统给出如图20所示提示,此时注册不成功。 图19 图20 2.订餐操作 系统登录后,单击“订餐”菜单,弹出“餐桌信息”对话框,如图21所示。 餐桌第一次订餐时,输入餐桌编号、食物编号、数量以及折扣,单击“点菜”按钮,在右侧点菜信息栏中列举了该餐桌所点的菜肴,如图22所示。 图21 图22 如果餐桌已经订过餐,但是还没有结账,则在餐桌编号输入框输入餐桌号,在点菜信息栏中显示该桌已点的菜。 单击“下单”按钮,即可把点菜信息记录下来。 3.结账操作 单击“结账”菜单,弹出“结账单”对话框。输入桌台号,自动显示对应的点菜信息以及消费金额。选取付款方式和实收金额后,界面会自动显示找零金额,结果如图23所示。 图23 4.用户权限设置 单击“管理”|“用户权限设置”,弹出“权限设置”对话框,如图24所示,所有用户的信息都显示在数据列表中。 输入要查询的用户编号和名称,单击“更改”,该用户的信息就显示在列表中,结果如图25所示。 图24 图25 选择权限,单击确定后,如图26所示,用户权限已被修改。 图26 单击“显示全部”,结果如图27所示。 图27 5.菜谱管理 单击“管理”|“菜谱设置”菜单,弹出“菜谱设置”对话框,如图28所示。 图28 在“菜谱设置”对话框中可以对菜谱进行查找、添加、删除、修改等操作。 6.付款方式设置 单击“管理”|“付款方式设置”菜单,弹出“付款方式”对话框,如图29所示。 单击“新增”或“删除”按钮,显示新增付款方式文本框和“确定”按钮,如图30所示。 图29 图30 在文本框中输入要增加/删除的付款方式,并单击“确定”按钮,将新增或删除所选择的付款方式。 7.注销用户 单击“注销”菜单,弹出“注销询问”对话框如图31所示。选择“确定”,注销成功,如图32所示。 图31 图32 8.系统退出 单击“退出系统”菜单,弹出“退出询问”对话框如图33所示。选择“确定”,则系统退出。 图33 至此,系统的全部功能已经演示完毕。 七、结束语 经过两个多星期的时间,终于完成了本系统的设计。虽然本系统有一些漏洞和不完善的地方,但是本系统结合餐饮管理的实际情况,基于数据库设计通用的模块,对餐饮管理的前台和后台操作进行功能模块的设计,实现了餐饮管理的基本功能。 在设计的过程中,遇到了很多的技术上的问题。例如,第一次接触ADO数据库访问技术,对用ADO来连接数据库不是很了解,出现了很多的问题,设计受到了很大的阻碍。经过向专业指导老师请教和参阅了有关书籍后,终于把一些问题解决了。在本次设计中,我懂得了“书到用时方恨少”的道理,发现了自己在专业方面还有很多要提高的地方,在今后的学习中,我一定努力进步! 参考文献: [1] 萨师煊,王珊.数据库系统概论[M]第3版.北京:高等教育出版社,2000 [2] 侯其锋,李晓华,李莎.Visual C++数据库通用模块开发与系统移植.北京:清华大学出版社,2007 致 谢 在这次课程设计中,戴小鹏老师给了我很大的帮助。他对我的精心指导和关心,使我在设计的过程中受到了很大的启发。特别是他的那份耐心和责任心,使我在今后的学习和工作中受益匪浅。在此,特向戴小鹏老师表示衷心的感谢!
目录 (1) 如何通过代码获得应用程序主窗口的 指针? 5 (2) 确定应用程序的路径 6 (3) 如何在程序中获得其他程序的 图标? 6 (4) 获得各种目录信息 7 (5) 如何自定义消息 8 (6) 如何改变窗口的图标? 8 (7) 如何改变窗口的缺省风格? 8 (8) 如何将窗口居中显示? 9 (9) 如何让窗口和 MDI窗口一启动就最大化和最小化? 10 (10) 如何限制窗口的大小? 10 (11) 如何使窗口不可见? 10 (12) 如何创建一个字回绕的CEditView 10 (13) 如何使程序保持极小状态? 11 (14) 移动窗口 11 (15) 通用控件的显示窗口 12 (16) 重置窗口的大小 12 (17) 如何单击除了窗口标题栏以外的区域使窗口移动 12 (18) 如何改变视窗的背景颜色 14 (19) 如何改变窗口标题 15 (20) 如何防止主框窗口在其说明中显示活动的文档名 17 (21) 如何获取有关窗口正在处理的当前消息的信息 17 (22) 如何在代码中获取工具条和状态条的指针 18 (23) 如何使能和禁止工具条的工具提示 18 (24) 如何创建一个不规则形状的窗口 19 (25) 如何获取应用程序的 实例句柄? 23 (26) 如何编程结束应用程序? 23 (27) 如何创建和使用无模式对话框 24 (28) 如何防止主框窗口在其说明中显示活动的文档名 26 (29) 如何在代码中获取工具条和状态条的指针 27 (30) 怎样加载其他的应用程序? 27 (31) 如何在代码中获取工具条和状态条的指针 28 (33) 如何设置工具条标题 29 (34) 如何使窗口始终在最前方? 30 (35) 如何在对话框中显示一个位图 30 (36) 如何改变对话或窗体视窗的背景颜色 30 (37) 如何获取一个对话控件的指针 32 (38) 如何禁止和使能控件 33 (39) 如何改变控件的字体 33 (40) 如何在OLE控件中使用OLE_COLOR数据类型 35 (41) 在不使用通用文件打开对话的情况下如何显示一个文件列表 35 (42) 为什么旋转按钮控件看起来倒转 36 (43) 为什么旋转按钮控件不能自动地更新它下面的编辑控件 37 (44) 如何用位图显示下压按钮 37 (45) 如何一个创建三态下压按钮 38 (46) 如何动态创建控件 38 (47) 如何限制编辑框中的准许字符 38 (48) 如何改变控件的颜色 40 (49) 当向列表框中添加多个项时如何防止闪烁 43 (50) 如何向编辑控件中添加文本 43 (51) 如何访问预定义的GDI对象 44 (52) 如何获取GDI对象的属性信息 45 (53) 如何实现一个橡皮区矩形 46 (54) 如何更新翻转背景颜色的文本 49 (55) 如何创建一个具有特定点大小的字体 50 (56) 如何计算一个串的大小 51 (57) 如何显示旋转文本 52 (58) 如何正确显示包含标签字符的串 54 (59) 如何快速地格式化一个CString对象 55 (60) 串太长时如何在其末尾显示一个省略号 55 (61) 为什么即使调用EnableMenuItem菜单项后,菜单项还处于禁止状态 56 (62) 如何给系统菜单添加一个菜单项 56 (63) 如何确定顶层菜单所占据的菜单行数 58 (64) 在用户环境中如何确定系统显示元素的颜色 59 (65) 如何查询和设置系统参数 59 (66) 如何确定当前屏幕分辨率 60 (67) 如何使用一个预定义的Windows光标 60 (68) 如何检索原先的Task Manager应用程序使用的任务列表 61 (70) 在哪儿创建临文件 63 (71) 我怎样才能建立一个等待光标? 64 (73) 如何访问桌面窗口 65 (74) 什么是COLORREF? 我该怎样用它? 66 (75) AppWizard所产生的STDAFX文件是干什么用的? 66 (76) 我在我的程序中是了CDWordArray。我向它添加了约10,000个整数,这使得它变得非常非常慢。为什么会这么糟? 67 (77) 我该如何改变MDI框架窗口的子窗口的大小以使在窗口以一定的大小打开? 67 (78) 在我的程序的某些部分,我可以调用 MessageBox 函数来建立一个信息对话框,例如在视类中。 67 (79) 我需要在我的程序中设置全局变量,以使文档中的所有类都能访问。我应该吧它放到哪儿? 68 (80) 我听说MFC可以发现内存漏洞,我怎样使用该特性? 68 (81) 我怎样才能在我的应用程序中循环浏览已经打开的文档? 68 (82)才能在我的应用程序中循环浏览已经打开的视? 68 (83)数PreCreateWindow是干什么用的? 69 (84)该怎样防止MFC在窗口标题栏上把文档名预置成应用程序名? 69 (85) 我应该怎样防止MFC在窗口标题栏上添加文档名? 69 (86)我应该如何改变视窗口的大小? 69 (87)我有一无模式对话框。我怎样才能在窗口退出时删除CDialog对象? 69 (88)为什么把“delete this”放在PostNcDestroy中而不是OnNcDestroy? 69 (89) File菜单中的MRU列表是从哪儿来的?列表中的名字放在哪儿了?我怎样才能改变列表中项目的最大值? 70 (90) 我在菜单中添加了新的项。但是,当我选该项时,在状态栏上没有出现任何提示信息。为什么? 70 (91) 我怎样才能在应用程序的缺省系统菜单中加上一些东西? 70 (92) 我建立了一个对话框。但是当我显示该对话框时,第一个编辑框总是不能获得焦点,我必须单击它来使它获得焦点。我怎样才能使第一个编辑框在对话框打开时就获得焦点? 71 (93) 我怎样才能使一个窗口具有“always on top”特性? 71 (94) 我要为我的form view添加文档模板。我先建立了对话框模板,然后使用ClassWizard建立了基于CFormView的新类,它也是从CDocument继承来的。我还建立了相应的资源并在InitInstance中添加了新的文档模板。但是,当我试图运行该程序时,出现了Assertion信息。为什么? 71 (95) 我在一对话框中有一列表框,我需要tabbed列表框中的项目。但是,当我处理含有tab字符(用AddString添加的)的列表项时,tab被显示成小黑块而没有展开。哪儿出了? 72 (96) 我建立了一个应用程序,并使用了CRecordset类。但是,当我运行该程序时,它试图要访问数据库,并给出“Internal Application Error”对话框。我应该怎样做? 72 (97) 我用ClassWizard建立了一个类。但是,我把名字取了,我想把它从项目中删除,应该如何做? 73 (98) 当我打开应用程序中的窗口时,我要传递该窗口的矩形尺寸。该矩形指定了窗口的外围大小,但是当我调用GetClientRect时,所得到的尺寸要比所希望的值要小(因为工具栏和窗口边框的缘故)。有其它方法来计算窗口的尺寸吗? 73 (99) 我在文档类中设置了一个整型变量。但是,当我试图把该变量写入Serialize函数中的archive文件中时,出现了类型误。而文档中的其它变量没有问题。为什么? 73 (100) 如何控制菜单的大小? 74 (101) 改变LVIS_SELECTED的状态颜色? 75 (102) 如何只存储文档的某一部分? 76 (103) 保存工具条菜单有bug吗? 76 (104) Tip of the day的bug 76 (105) 如何可以让我的程序可以显示在其它的窗口上面? 77 (106) 如何控制窗口框架的最大最小尺寸? 79 (107) 如何改变窗口框架的颜色? 81 (108) 如何将应用程序窗口置于屏幕正中? 82 (1)当文档被修改时,如何在标题上加上标志'*'? 82 (2)VC6.0对VC5.0的兼容性? 83 (3)打印和打印机的问题? 83 (4)CRichEditCtrl滚动条的问题? 84 (5)从数据库中读大于32k的内容? 84 (6)如何获得CRichEditCtrl中字符的位置? 86 (7)如何限制mdi子框架最大化时的大小? 86 (8)如何切换视口而不破坏它们? 87 (9)改变列表控制时发生闪烁现象? 91 (10)处理列表控件可见项的问题? 91 (11)产生线程的问题? 91 (12)CFile使用了缓冲区吗? 94 (13)DAO的密码? 94 (15)视口的不活动性如何处理? 96 (16)如何使用COleClientItem的IDispatch接口? 97 (17)关于用户自定义的消息使用? 98 (18)在打开一个文档时退出? 99 (19)在CListCtrl控件中多选择项的删除? 99 (20)工作线程的登录状态? 99 (21)如何增加视图中ActiveX控件的事件处理函数? 101 (22)如何创建一个动态的Tree控件? 102 (23)SDI程序开始时不打开文档? 102 (24)List控件中整栏选择? 103 (25)如何重载MRU文件? 104 (26)CImageList控件中图象橙色被显示为黄色? 106 (27)无法正确改变应用程序的图标? 110 (28)工具条状态的问题? 110 (29)在SDI应用程序中使用Active控件? 112 (30)有RichEdit控件的对话框无法正常显示? 112 (31)DLL中的模板成员函数? 112 (32)CFormView中的上下文帮助? 114 (33)CArchive类的WriteObject函数问题? 115 (34)RegisterWindowMessage中的BroadcastSystemMessage如何处理? 115 (35)CListCtrl中选择变化时如何获得通知? 117 (36)如何向ATL-COM对象传送一个数组? 118 (37)如何选择CTreeCtrl中的节点文本进行编辑? 119 (38)如何改变默认的光标形状? 120 (39)如何用键盘滚动分割的视口? 121 (40)如何在线程中处理状态条? 123 (41)如何阻止WINDOWS关闭? 124 (42)如何使一个按钮Disable? 124 (43)怎样从MFC扩展动态链结库(DLL)中显示一个对话框? 125 (44)想隐藏用户界面怎么办? 127 (45)如何实现SDI与MDI的转换? 128 (46) CDC中的竖排文本? 130 (47)如何激活变灰的弹出菜单? 131 (48)线程消息? 132 (49)TreeCtrl控制的显示速度太慢? 133 (50)关于工具条? 135 (51)关于线程消息? 136 (52)关于控件的焦点? 136 (53)如何捕获键盘按键? 138 (54)怎样实现3D效果? 138 (55)怎样建立客户CSocket? 138 (56)Disable一个非模态对话框的客户区? 140 (57)关于使用SetClassLong和SetCapture问题 140 (58)动画控件? 142 (59)误声明的消息? 143 (59)怎样模拟鼠标动作? 144 (60)改变对话框标题字体? 145 (61)怎样知道CWinThread对象的状态? 146 (62)如何调整控件对话框条的大小? 146 (63)如何顶端显示CStatic类文字? 147 (64)消息句柄出了什么事? 147 (65)树形控件为何闪烁? 148 (66)怎样才能关闭树形控件中的滚动条? 149 (67)如何建立一个带滚动条的窗口? 149 (68)如何实现对话框的拖放? 150 (69)TrackMouseEvent()怎么了 151 (70)奇怪的组合框控件 152 (71)关于使用MS SANS SERIF字体 152 (72)为什么DLL在字符串表中找不到字符串 157 (73)关于复选框的文本颜色 158 (74)系列化与版本的问题 159 (75)在一个控件内检测并使用ON_COMMAND消息 162 (76)为何MDI程序中有子窗口打开时主应用程序不能关. 163 (77)滚动视中LPtoDP失败 165 (78)ODBC许可问题 166 (79)怪异的字体 167 (80)自画列表框样例 170 (81)CWnd::GetMenu()的问题 173 (82)用MFC制作弹出窗口 174 (83)怎样取消一个弹出式菜单 175

16,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧