MFC中ListBox实现商品的入库和出库

来源:互联网 发布:网络女主播是什么 编辑:程序博客网 时间:2024/04/30 08:48

在开发实例中,经常会用到商品的入库和出库功能

下面让我们来完成这简单功能的实现


首先,我们为listbox设置Selection属性为Extended 。该属性可以设置为用Shift+鼠标左键选择多个条目。

下面是界面图形。




然后并为各个空间关联变量。


“入库”按钮的BN_CLICKED消息响应函数如下:





void CMFCApplication7Dlg::OnBnClickedButton3()
{
// TODO:  在此添加控件通知处理程序代码
UpdateData(TRUE);
if (m_unit.IsEmpty()){
AfxMessageBox(_T("装备名称不能为空"));
return;
}
m_ctlLis1.AddString(m_unit);
m_unit = "";
UpdateData(FALSE);


}



借出,归还的响应函数如下:


void CMFCApplication7Dlg::OnBnClickedButton1()
{
// TODO:  借出


int nCount = m_ctlLis1.GetSelCount();
if (!nCount){
return; 
}


int *SelItems = new int[nCount];


m_ctlLis1.GetSelItems(nCount, SelItems);


for (int i = 0; i < nCount; ++i){
CString strText;
int iIndex;
m_ctlLis1.GetText(SelItems[i], strText);
DWORD dwData = m_ctlList2.GetItemData(SelItems[i]);
iIndex = m_ctlList2.AddString(strText);
m_ctlList2.SetItemData(iIndex, dwData);


}


for (int i = nCount - 1; i >= 0; --i){
m_ctlLis1.DeleteString(SelItems[i]);
}


delete[]SelItems;


m_ctlLis1.SetSel(-1, false);


if (m_ctlLis1.GetSelCount()){
m_ctlOut.EnableWindow(TRUE);
}
else{
m_ctlOut.EnableWindow(FALSE);
}
}




void CMFCApplication7Dlg::OnBnClickedButton2()
{
// TODO:  归还
int nCount = m_ctlList2.GetSelCount();


if (!nCount)
return;


int *SelItems = new int[nCount];


m_ctlList2.GetSelItems(nCount, SelItems);


for (int i = 0; i < nCount; i++){
CString strText;
int iIndex;
m_ctlList2.GetText(SelItems[i], strText);
DWORD dwdata = m_ctlList2.GetItemData(SelItems[i]);


iIndex = m_ctlLis1.AddString(strText);
m_ctlLis1.SetItemData(iIndex, dwdata);
}


for (int i = nCount - 1; i >= 0; --i){
m_ctlList2.DeleteString(SelItems[i]);
delete[]SelItems;
m_ctlList2.SetSel(-1, false);
}


if (m_ctlLis1.GetSelCount()){
m_ctlIn.EnableWindow(TRUE);
}
else{
m_ctlIn.EnableWindow(FALSE);
}


if (m_ctlList2.GetSelCount()){
m_ctlOut.EnableWindow(TRUE);
}
else{
m_ctlOut.EnableWindow(FALSE);
}




}



下面代码是根据选中状态确定下呀按钮的有效状态。

只有在列表框中有条目被选中的时候,按钮才会生效。

使用classWizard为两个列表框添加LBN_SELCHANGE消息响应函数。

代码如下



void CMFCApplication7Dlg::OnLbnSelchangeList1()
{
// TODO:  m_ctllist1的选中响应
if (m_ctlLis1.GetSelCount()){
m_ctlIn.EnableWindow(TRUE);
}
else{
m_ctlIn.EnableWindow(FALSE);
}
}




void CMFCApplication7Dlg::OnLbnSelchangeList2()
{
// TODO:  m_ctllist2的选中响应
if (m_ctlList2.GetSelCount()){
m_ctlOut.EnableWindow(TRUE);
}
else{
m_ctlOut.EnableWindow(FALSE);
}
}



以及实现双击列表框中列表项实现转移功能



void CMFCApplication7Dlg::OnLbnDblclkList1()
{
// TODO:  在此添加控件通知处理程序代码
OnBnClickedButton1();
}




void CMFCApplication7Dlg::OnLbnDblclkList2()
{
// TODO:  在此添加控件通知处理程序代码
OnBnClickedButton2();
}


要点分析:


MFC中ListBox提供了列表操作相关的函数,常用的简单函数如下(ps:了解更多上MSDN去查看该类的具体接口)

1.添加,删除

Addstring(LPCTSTR lpsz);

DeleteString(UINT nIndex);

int InsertString(int nIndex , LPCTSTR lpsz);void ResetString();

2.获取,设定当前选中行

int Getsel();

intSetSel(int nIndex);


如果指明了选中多行,就需要先调用GetSelCount得到选中的个数,然后通过GetSelItems(int nMax , LPINT grInt);函数得到选中的所有行。

然后调用GetLBText(int nIndex ,LPTSTR lpsz)得到列表框中选中的字符串。


3.查找列表框中的行

int FindString(int nStartAfter , LPCTSTR lpsz);在当前所有行中查找字符串


int SelectString(int nStartAfter , LPATSTR lpsz);选中包含着指定字符串的行。



冰冻三尺非一日之寒,让我们每日进步一点点。


0 0
原创粉丝点击