3.6.5 商品信息键盘消息处理
这里将介绍编辑框数据输入时动态显示商品信息的方法,也讨论对键盘各个消息的处理方法,实现键盘易用性,具体代码如下:
代码位置:见光盘中本章源代码的CForeMange类。
- 1 BOOL CForeMange::PreTranslateMessage(MSG* pMsg)
- 2 {
- 3 if(pMsg->message==WM_KEYDOWN&&pMsg->wParam==VK_RETURN) //判断是否按下回车键
- 4 {
- 5 if(::GetFocus()==m_mercnum) //判断当前焦点
- 6 {
- 7 UpdateData(); //保存输入的数据
- 8 CString sqlstr; //构造查询语句
- 9 sqlstr.Format("select * from tb_merchangiseinfo where id='%s'",m_id);
- 10 if(GetRecord(sqlstr)==0) //查询结果为空
- 11 return false;
- 12 CString str=(LPCSTR)(_bstr_t)m_record->Fields->GetItem("number")->Value;
- 13 if(double(atof(str))<m_num) //取商品数量比较
- 14 { //数据清空
- 15 MessageBox("数量不够!");
- 16 m_id="";
- 17 m_singlediscount="";
- 18 m_num=0;
- 19 m_mercid.SetFocus();
- 20 m_mercid.querystr="";
- 21 m_mercnum.num=0;
- 22 return false;
- 23 }
- 24 else //商品数量充足
- 25 {
- 26 m_id="";
- 27 m_singlediscount="";
- 28 m_mercid.SetFocus();
- 29 m_mercid.querystr="";
- 30 m_mercnum.num=0;
- 31 m_alreadynum=m_list.GetItemCount();
- 32 m_mercid.InsertItem=m_alreadynum;
- 33 m_mercnum.SetWindowText("");
- 34 m_mercid.m_querystr="";
- 35 m_num=0;
- 36 m_enter=true;
- 37 GetAllMoney(); //结账找零
- 38 }
- 39 return true;
- 40 }
- 41 else if(::GetFocus()==m_editrealmoneyctrl) //判断当前焦点
- 42 {
- 43 SetBackMoney(); //设置金额显示的模式
- 44 m_backenter=true;
- 45 return false;
- 46 }
- 47 else return false;
- 48 }
- 49 return CDialog::PreTranslateMessage(pMsg);
- 50 }
第3行代码是对键盘按下消息和回车消息的处理。在输入商品信息后,按下回车键可实现购买的商品价格统计,输入实付金额后按下回车键可直接给出找零。
第5~40行代码实现了当前焦点是商品数量编辑框时的操作。
第41~46行代码实现了当前焦点是实际付款编辑框时的操作。
第5、41行代码中GetFocus()是获取当前控件的焦点,实现了键盘易用性设置。所谓键盘易用性,是指在需要输入很多不同信息的界面中,在一种信息输入完成后,按下【Enter】键,输入焦点自动跳转到下一个要输入信息的控件。为了提高工作效率,提高键盘易用性十分必要。故本系统中就实现了这种人性化的功能。上述代码中函数GetAllMoney()实现了结账找零处理,具体代码如下:
代码位置:见光盘中本章源代码的CForeMange类。
- 1 void CForeMange::GetAllMoney()
- 2 {
- 3 float allmoney=0;
- 4 CString strmoney;
- 5 int itemcount=m_list.GetItemCount(); //获取列表控件中行数
- 6 if(itemcount==0) //没有购买商品
- 7 {
- 8 ::AfxMessageBox("没有购入商品!");
- 9 GetDlgItem(IDC_MERCID)->SetFocus(); //设置控件焦点
- 10 allmoney=0;
- 11 m_allmoney.Format("累计\r\n金额:%.2f",allmoney);
- 12 m_floatallmoney=allmoney;
- 13 SetAllMoneyStyle(); //设置金额显示风格
- 14 return;
- 15 }
- 16 for(int i=0;i<itemcount;i++)
- 17 {
- 18 strmoney=m_list.GetItemText(i,6); //获取价格
- 19 allmoney+=atof(strmoney); //商品价格累计
- 20 }
- 21 m_allmoney.Format("累计\r\n金额:%.2f",allmoney);
- 22 m_floatallmoney=allmoney;
- 23 SetAllMoneyStyle(); //设置金额显示风格
- 24 UpdateData(false); //显示金额数量
- 25 }
第6~15行代码实现对没有购买商品的处理。
第16~20行代码实现购买商品价格的求和处理。
第21~24行代码实现设置金额显示风格,并显示详细的各个金额数量。