可编辑列表

来源:互联网 发布:java新手二次开发好吗 编辑:程序博客网 时间:2024/06/05 03:33

学习mfc练习源文件参考http://blog.csdn.net/qingyang8513/article/details/50986455

一、开发环境


1、VS2015;

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控件的初始化,代码如下:

[cpp] view plain copy
  1. m_edit.ShowWindow(SW_HIDE);  
  2. CRect rect;  
  3. m_ListTest.GetClientRect(&rect);  
  4. int iLength = rect.Width();  
  5. m_ListTest.SetExtendedStyle(m_ListTest.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);  
  6. m_ListTest.InsertColumn(0, _T("编号"), LVCFMT_CENTER, 40);  
  7. m_ListTest.InsertColumn(1, _T("频率(Hz)"), LVCFMT_CENTER, 80);  
  8. m_ListTest.InsertColumn(2, _T("加速度(g)"), LVCFMT_CENTER, (iLength - 120)/3);  
  9. m_ListTest.InsertColumn(3, _T("速度(m/s)"), LVCFMT_CENTER, (iLength - 120)/3);  
  10. m_ListTest.InsertColumn(4, _T("位移(mm)"), LVCFMT_CENTER, (iLength - 120)/3);  


4、对话框头文件中添加int型变量m_Row和m_Col,用于保存双击时选中的行和列号,并初始化为-1(未选中状态);

5、为List Control控件添加NM_DBLCLK消息响应,并添加代码如下:

[cpp] view plain copy
  1. void CListControlDlg::OnNMDblclkListTest(NMHDR *pNMHDR, LRESULT *pResult)  
  2. {  
  3.     LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);  
  4.     // TODO: 在此添加控件通知处理程序代码  
  5.     CRect rc;  
  6.     CString strTemp;  
  7.     NM_LISTVIEW *pNMListView = (NM_LISTVIEW *)pNMHDR;  
  8.     m_Row = pNMListView->iItem;  
  9.     m_Col = pNMListView->iSubItem;  
  10.   
  11.     if (pNMListView->iItem == -1)    //选择空白处,添加一行,并设置焦点为最后一行,第二列  
  12.     {  
  13.         m_Row = m_ListTest.GetItemCount();  
  14.         strTemp.Format(_T("%d"), m_Row + 1);  
  15.         m_ListTest.InsertItem(m_Row,strTemp);  
  16.         m_ListTest.SetItemState(m_Row, LVIS_SELECTED | LVIS_FOCUSED,LVIS_SELECTED | LVIS_FOCUSED);  
  17.         m_ListTest.EnsureVisible(m_Row, FALSE);  
  18.         //m_Col = 1;  
  19.     }  
  20.   
  21.     if (m_Col != 0) // 选择子项  
  22.     {  
  23.         m_ListTest.GetSubItemRect(m_Row, m_Col, LVIR_LABEL, rc);  
  24.         m_edit.SetParent(&m_ListTest);  
  25.         m_edit.MoveWindow(rc);  
  26.         m_edit.SetWindowTextW(m_ListTest.GetItemText(m_Row, m_Col));  
  27.         m_edit.ShowWindow(SW_SHOW);  
  28.         m_edit.SetFocus();//设置Edit焦点  
  29.         m_edit.ShowCaret();//显示光标  
  30.         m_edit.SetSel(0, -1);//全选  
  31.     }  
  32.       
  33.     *pResult = 0;  
  34. }  

6、为Edit Control控件添加EN_KILLFOCUS消息响应,并添加代码如下:

[cpp] view plain copy
  1. void CListControlDlg::OnEnKillfocusEditInsert()  
  2. {  
  3.     // TODO: 在此添加控件通知处理程序代码  
  4.     CString str;  
  5.     m_edit.GetWindowTextW(str);  
  6.     m_ListTest.SetItemText(m_Row, m_Col, str);  
  7.     m_edit.ShowWindow(SW_HIDE);  
  8. }  


7、生成 ---> 生成解决方案,即可测试运行,效果下图所示:


图1  初始化效果


图2  动态修改子项


图3  动态添加一行