您的位置:首页 > 其它

酒店点餐系统开发详解(六)

2010-05-29 13:25 363 查看
酒店点餐系统开发详解(六)
——疑难解决
在本系统的详细设计过程中遇到了很多的麻烦,经过分析、思考和网上搜索等方式将所有问题均给一一化解了,现与大家分享以共勉。
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, IDC_MENU_DATAGRID, -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,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,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,LVIR_BOUNDS,rect);
if(!rect.PtInRect(pt)){ //如果单击在一个节点文本区域内
CString score;
m_EditComboBox.GetWindowText(score);
m_ScoreList.SetItemText(m_SelectedRow,m_SelectedCol,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,0,rect.Width(),rect.Height(),&dc,0,0,SRCCOPY);
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dc,0,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 标题有误,请见谅...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: