微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

酒店点餐系统开发详解六

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

——疑难解决

在本系统的详细设计过程中遇到了很多的麻烦,经过分析、思考和网上搜索等方式将所有问题均给一一化解了,现与大家分享以共勉。

1CDataGrid的使用

之所以使用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);

}

}

2CListCtrl中加入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;

}

4CEdit中将光标定位到字符串结尾

     //将光标移动到编辑框中字符结尾处

((CEdit*)GetDlgitem(IDC_COOKID))->SetSel(-1);

((CEdit*)GetDlgitem(IDC_COOKID))->SetFocus();

5、远程连接数据库设置

1sql Server 2005设置

http://www.webjx.com/database/sqlserver-7123.htm

2sql 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;

}

9VC中实现淡入淡出的启动画面

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中使用MenuToolbar

http://www.vckbase.com/document/viewdoc/?id=265

好了,就先总结到这儿吧!接下来将进入酒店点餐系统2.0版的开发,敬请期待!!!

 

代码下载地址:http://download.csdn.net/source/2406335 标题有误,请见谅...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐