酒店点餐系统开发详解(六)
酒店点餐系统开发详解(六) ——疑难解决 在本系统的详细设计过程中遇到了很多的麻烦,经过分析、思考和网上搜索等方式将所有问题均给一一化解了,现与大家分享以共勉。 1、CDataGrid的使用 之所以使用CDataGrid完全是为了偷懒,不过它却让我差点崩溃,因为它并没有想象中的那么方便,关键是网上或书上关于它的资料都少得可怜。幸运的是本系统对其要求不高,因而被我巧妙地化解了。 我看中CDataGrid在使用时可以根据所查询属性的不同而自动更换表中的列名,因为本系统涉及不同的查询条件返回的是不同的属性列(列名称不同)。 1)得到某单元格值 //获取所选项信息 VARIANT?index; ????CColumns?columns; ????CColumn?column; ????index.vt?=?VT_INT; ???? ????columns?=?grid.GetColumns();??//得到当前选中行的列集 ????long?nCount?=?columns.GetCount();?//列数
index.lVal?=?0; //dishid所在位置 ????column?=?columns.GetItem(index);//顺序得到单元格的值 ????CString?dishid?=?column.GetText();
????index.lVal?=?2; //cookid所在位置 ????column?=?columns.GetItem(index); ????CString?cookid?=?column.GetText(); 2)在使用中我发现当单击CDataGrid控件的某一行然后用CDataGrid?table.GetRow()获取所选行时,并不能得到正确的行号,然而双击所选行时能够得到正确的行号,所以我采取单击变双击的方式解决了这个问题。 添加单击CDataGrid控件消息ON_EVENT(CClientTerminalDlg,?IDC_MENU_DATAGRID,?-600?/*?Click?*/,?OnClickMenuDatagrid,?VTS_NONE)和双击CDataGrid控件消息ON_EVENT(CClientTerminalDlg,?-601?/*?DblClick?*/,?OnDblClickMenuDatagrid,?VTS_NONE),函数实现如下: //需双击才能获取到所选行号,显示图片 void?CClientTerminalDlg::OnDblClickMenuDatagrid()? { DisplayDishPicture(m_MenuDataGrid); //显示图片 } //在单击事件中模拟双击事件,以实现图片的正确更新 void?CClientTerminalDlg::OnClickMenuDatagrid()? { //m_ClickCount是为了防止不断地发送单击消息 if(m_MenuClickCount?==?0){ m_MenuClickCount?=?1; //立即阻止下次单击事件发送单击消息 //发送点击消息 mouse_event(MOUSEEVENTF_LEFTDOWN,0);? mouse_event(MOUSEEVENTF_LEFTUP,0); //开启定时器10ms后恢复该操作 SetTimer(1,10,NULL); } } 2、CListCtrl中加入CComboBox控件 1)添加类成员变量CComboBox m_EditComboBox;?和?CListCtrl m_ScoreList;然后在初始化函数中加入如下函数: m_EditComboBox.SetParent(&m_ScoreList);////确保CComboBox的坐标是相对于列表控件而言的 2)添加单击CListCtrl消息,单击消息对应函数实现如下: void?CScoreDlg::OnClickScoreList(NMHDR*?pNMHDR,?LRESULT*?pResult)? { //?TODO:?Add?your?control?notification?handler?code?here POINT?PT; ????GetCursorPos(&PT); m_ScoreList.ScreenToClient(&PT); ????LVHITTESTINFO?hitInfo; ????hitInfo.pt?=?PT; m_ScoreList.SubItemHitTest(&hitInfo); ???? ????if(hitInfo.flags?&?LVHT_ONITEMLABEL){ //判断是否单击在文本上 ????????CRect?rect; m_ScoreList.GetSubItemRect(hitInfo.iItem,hitInfo.iSubItem,LVIR_BOUNDS,rect); ????????if?(hitInfo.iSubItem?==?0){ ????????????rect.right=rect.left+m_ScoreList.GetColumnWidth(0); ????????} else?if(hitInfo.iSubItem?==?4){ //若选中的为评分项则显示下拉列表框 m_SelectedCol?=?hitInfo.iSubItem; m_SelectedRow?=?hitInfo.iItem;
m_EditComboBox.MoveWindow(&rect,TRUE); m_EditComboBox.ShowWindow(SW_NORMAL); m_EditComboBox.BringWindowToTop(); m_EditComboBox.SetFocus(); //使组合框聚焦 m_EditComboBox.SetCurSel(0); //默认选项 } } *pResult?=?0; } 3)添加控件CComboBox失去焦点时的处理函数如下: void?CScoreDlg::OnKillfocusEditCombo()? { POINT?pt;
????GetCursorPos(&pt); ????m_ScoreList.ScreenToClient(&pt);
????CRect?rect; ????m_ScoreList.GetSubItemRect(m_SelectedRow,m_SelectedCol,rect); ????if(!rect.PtInRect(pt)){ //如果单击在一个节点文本区域内 CString?score; ????????m_EditComboBox.GetWindowText(score); ????????m_ScoreList.SetItemText(m_SelectedRow,score); ????????m_EditComboBox.ShowWindow(SW_HIDE);//将组合框隐藏 ????} } 3、设置Static控件背景透明 添加消息ON_WM_CTLCOLOR,在函数中添加如下代码: HBRUSH?CScoreDlg::OnCtlColor(CDC*?pDC,?CWnd*?pWnd,?UINT?nCtlColor)? { HBRUSH?hbr?=?CDialog::OnCtlColor(pDC,?pWnd,?nCtlColor);
//?TODO:?Change?any?attributes?of?the?DC?here if(nCtlColor?==?CTLCOLOR_STATIC){ //设置静态文本框背景为透明
pDC->SetBkMode(TRANSPARENT); return?(HBRUSH)::GetStockObject(NULL_BRUSH); } //?TODO:?Return?a?different?brush?if?the?default?is?not?desired return?hbr; } 4、CEdit中将光标定位到字符串结尾 ?????//将光标移动到编辑框中字符结尾处 ((CEdit*)GetDlgItem(IDC_COOKID))->SetSel(-1); ((CEdit*)GetDlgItem(IDC_COOKID))->SetFocus(); 5、远程连接数据库设置 1)SQL?Server?2005设置 http://www.webjx.com/database/sqlserver-7123.htm 2)SQL?Server?2000?设置 http://soft.zdnet.com.cn/software_zone/2008/0922/1144458.shtml 6、数据库连接字符串设置 http://blog.csdn.net/jyh_jack/archive/2008/04/07/2257512.aspx http://www.connectionstrings.com/sqlserver 7、位图的无损伸缩 http://www.codeguru.com/cpp/g-m/bitmap/specialeffects/article.php/c4897/Accelerated-Smooth-Bitmap-Resizing.htm 8、对话框中添加背景图片 添加ON_WM_ERASEBKGND消息,函数实现如下: BOOL?CXXDlg::OnEraseBkgnd(CDC*?pDC)? { //背景图片 //获得客户区尺寸 CRect?rect; GetClientRect(&rect); //加载背景位图 CBitmap?bitmap; bitmap.LoadBitmap(IDB_BMP_SCORE_BG);//图片ID
BITMAP?bmp; bitmap.GetBitmap(&bmp); //创建内存DC CDC?dc; dc.CreateCompatibleDC(pDC); //选择位图 CBitmap*?pOldBitmap?=?dc.SelectObject(&bitmap); //绘制位图 // pDC->BitBlt(0,rect.Width(),rect.Height(),&dc,SRCCOPY); pDC->StretchBlt(0,bmp.bmWidth,bmp.bmHeight,SRCCOPY); //恢复原有位图 dc.SelectObject(pOldBitmap); return?TRUE; } 9、在VC中实现淡入淡出的启动画面 http://group.qqread.com/thread-45110-1-1.html 10、添加背景音乐 http://topic.csdn.net/u/20080524/16/36c1f481-a266-4c68-8cc7-816b1594e585.html 11、同一时间仅显示一个非模态对话框 1)添加类成员变量CXXDlg?*m_dlg; 2)如下进行调用 if(m_dlg->GetSafeHwnd()?==?NULL){ m_dlg->Create(IDD_ACCOUNT_MANAGE); m_dlg->ShowWindow(SW_SHOW); } 12、在Dialog中使用Menu和Toolbar http://www.vckbase.com/document/viewdoc/?id=265 好了,就先总结到这儿吧!接下来将进入酒店点餐系统2.0版的开发,敬请期待!!! ? 源代码下载地址:http://download.csdn.net/source/2406335?标题有误,请见谅... (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- sql-server – SQL Server数据库同步
- sql-server – 如何找到SQL事务日志使用的空间?
- SQL Server 2008 清空删除日志文件(瞬间日志变几
- sql-server-2008 – 将SQL 2008数据库迁移到Azur
- sql-server – 具有ReturnValue参数的EF Execute
- MySQL5.6下windows msi安装详细介绍
- SQLSERVER2005调试存储过程跟函数
- 不使用任何数据库对asp.net网站进行身份验证
- sql-server – 设置varchar(8000)有什么后果?
- sql-server – 管道/ veritcal bar字符在TSQL中意