一、开发环境
1、VS2010;
2、C++ / MFC;
二、主要目标及重点
1、目标:实现在双击列表框时的动态修改,包括:
1)双击空白处时自动添加一行;
2)双击已有数据时使用显示编辑框实现动态修改子项。
2、重点内容:
1)List Control控件NM_DCLICK消息响应事件;
2)Edit Control的KillFocus消息响应;
3)Edit Control的动态显示及隐藏;
4)List Control获取指定行和列的编号,并获取指定行和列的内容及修改赋值。
三、开发示例
1、创建基于对话框的MFC应用程序,删除原有的静态文本;
2、添加一个List Control控件和一个Edit Control控件,并分别关联控制变量m_ListTem和m_EditTest(List Control控件适当调整大小,Edit Control大小不用调整);
3、初始化对话框函数OnInitDialog中实现List Control控件和Edit Control控件的初始化,代码如下:
m_edit.ShowWindow(SW_HIDE);
CRect rect;
m_ListTest.GetClientRect(&rect);
int iLength = rect.Width();
m_ListTest.SetExtendedStyle(m_ListTest.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
m_ListTest.InsertColumn(0, _T("编号"), LVCFMT_CENTER, 40);
m_ListTest.InsertColumn(1, _T("频率(Hz)"), LVCFMT_CENTER, 80);
m_ListTest.InsertColumn(2, _T("加速度(g)"), LVCFMT_CENTER, (iLength - 120)/3);
m_ListTest.InsertColumn(3, _T("速度(m/s)"), LVCFMT_CENTER, (iLength - 120)/3);
m_ListTest.InsertColumn(4, _T("位移(mm)"), LVCFMT_CENTER, (iLength - 120)/3);
5、为List Control控件添加NM_DBLCLK消息响应,并添加代码如下:
void CListControlDlg::OnNMDblclkListTest(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
CRect rc;
CString strTemp;
NM_LISTVIEW *pNMListView = (NM_LISTVIEW *)pNMHDR;
m_Row = pNMListView->iItem;
m_Col = pNMListView->iSubItem;
if (pNMListView->iItem == -1) //选择空白处,添加一行,并设置焦点为最后一行,第二列
{
m_Row = m_ListTest.GetItemCount();
strTemp.Format(_T("%d"), m_Row + 1);
m_ListTest.InsertItem(m_Row,strTemp);
m_ListTest.SetItemState(m_Row, LVIS_SELECTED | LVIS_FOCUSED,LVIS_SELECTED | LVIS_FOCUSED);
m_ListTest.EnsureVisible(m_Row, FALSE);
//m_Col = 1;
}
if (m_Col != 0) // 选择子项
{
m_ListTest.GetSubItemRect(m_Row, m_Col, LVIR_LABEL, rc);
m_edit.SetParent(&m_ListTest);
m_edit.MoveWindow(rc);
m_edit.SetWindowTextW(m_ListTest.GetItemText(m_Row, m_Col));
m_edit.ShowWindow(SW_SHOW);
m_edit.SetFocus();//设置Edit焦点
m_edit.ShowCaret();//显示光标
m_edit.SetSel(0, -1);//全选
}
*pResult = 0;
}
6、为Edit Control控件添加EN_KILLFOCUS消息响应,并添加代码如下:
void CListControlDlg::OnEnKillfocusEditInsert()
{
// TODO: 在此添加控件通知处理程序代码
CString str;
m_edit.GetWindowTextW(str);
m_ListTest.SetItemText(m_Row, m_Col, str);
m_edit.ShowWindow(SW_HIDE);
}
7、生成 ---> 生成解决方案,即可测试运行,效果下图所示:
图1 初始化效果
图2 动态修改子项
图3 动态添加一行
备注:
源码下载链接:http://download.csdn.net/detail/qingyang8513/9473162
参考:
1)http://blog.csdn.net/xianglifighter/article/details/17592209