MFC listcontral控件 创建和添加数据
MFC list控件 从文件中添加保存数据项
先给list control控件添加拓展风格
m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
//选中行高亮和分割线
添加风格后效果如图
添加一个editControl控件,命名为m_edit,默认是Control变量;在OnInitDialog()方法里隐藏m_edit.ShowWindow(SW_HIDE);
在Dlg类中定义三个变量
int m_Row;//鼠标选中的行号
int m_Col;//鼠标选中的列号
CString m_strListItem;//鼠标选中的那一项的数据
使用类向导添加list control控件的双击消息响应函数
void Clist控件Dlg::OnDblclkList1(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
CRect rc;
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
m_Row = pNMListView->iItem;//每一行的item从零开始,双击选中行号
m_Col = pNMListView->iSubItem;//每一行中的列就是SubItem也是从零开始,获得选中列号
if (m_Col != -1&&m_Col>1)//选择子项,
{
m_list.GetSubItemRect(m_Row, m_Col, LVIR_LABEL, rc);//获得列表视图控件中的项的边框矩形
m_edit.SetParent(&m_list);
m_edit.MoveWindow(rc);
m_edit.SetWindowText(m_list.GetItemText(m_Row, m_Col));//设置选中框的数值(由用户输入 )
m_edit.ShowWindow(SW_SHOW);//显示在窗口中
m_edit.SetFocus();//设置edit焦点
m_edit.ShowCaret();//显示光标
m_edit.SetSel(-1); //-1选择编辑控件中的所有文本
}
*pResult = 0;
}
因为前两项是英雄名称和职业这个基本是不会更改的,要有改动的是后面两项价格,所以加了一个m_Col>1的判断。
但是此时只能实现edit控件中的数值修改不能实现保存,所以在edit控件中添加killfocus函数
(该edit控件的ID是IDC_EDIT5)
void Clist控件Dlg::OnKillfocusEdit5()
{
// TODO: 在此添加控件通知处理程序代码
m_edit.GetWindowText(m_strListItem);//获取修改后编辑框中的数据
m_list.SetItemText(m_Row, m_Col, m_strListItem);
int price = _wtoi(m_strListItem);
//判断修改的是金币价格还是点券价格
if (m_Col == 2)
heroVector[m_Row].Price_God = price;
if(m_Col==3)
heroVector[m_Row].Price_Tickets = price;
m_edit.ShowWindow(SW_HIDE);
}
heroVector中元素的顺序和list control中显示的顺序是一致的,这就是为什么要添加一个全局变量count来控制给list control控件添加项的时候都是从末尾插入。