- 注册时间
 - 2021-4-16
 
- 最后登录
 - 2023-8-13
 
- 在线时间
 - 4 小时
 
 
 
 
 
编程入门 
  
	- 龙马币
 - 48 
 
 
 
 
 | 
 
 
MFC ListControl使用总结 设置背景,双击修改值 
 
前言 
现需要使用一个8*5的表格输入参数。 
 
添加控件 
如下图所示,使用了一个List control(ID: IDC_LIST_PARAM), 
一个Edit control(ID: IDC_EDIT_PARAM, 属性中visible改为false)以及一个static text. 
其中List control用来显示表格,Edit control用来辅助编辑List control中的内容。 
 
 
 
 
为控件添加变量及事件处理程序 
为List control添加control类型变量m_paramList,添加NM_DBLCLK处理程序(相应双击事件)。 
为Edit control添加control类型变量m_paramEdit,添加EN_KILLFOCUS处理程序。 
 
代码部分 
在对应窗口类添加私有成员。 
 
- private:
 
 -         // 参数输入窗口双击后获得的横纵坐标
 
 -         int m_Row;
 
 -         int m_Col;
 
 
  复制代码 
在窗口类源文件添加代码,我的窗口类名为CImageSimDlg。 
 
- //双击更改某一项的值
 
 - //双击获取所选编辑框的横纵坐标,将一个edit控件移动到此处进行输入
 
 - //通过后续的OnEnKillfocusEditParam()传递函数并处理
 
 - void CImageSimDlg::OnNMDblclkListParam(NMHDR *pNMHDR, LRESULT *pResult)
 
 - {
 
 -         LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<NMITEMACTIVATE*>(pNMHDR);
 
 -         // TODO: 在此添加控件通知处理程序代码
 
 -         *pResult = 0;
 
 -         NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
 
 -         CRect rc;
 
  
-         m_Row = pNMListView->iItem;//获得选中的行
 
 -         m_Col = pNMListView->iSubItem;//获得选中列
 
 -         int n = m_paramList.GetItemCount();//获取当前一共多少行
 
 -         if (pNMListView->iSubItem < 7) //如果选择的是子项;
 
 -         {
 
 -                 m_paramList.GetSubItemRect(m_Row, m_Col, LVIR_LABEL, rc);//获得子项的RECT;
 
 -                 m_paramEdit.SetParent(&m_paramList);//转换坐标为列表框中的坐标
 
 -                 m_paramEdit.MoveWindow(rc);//移动Edit到RECT坐在的位置;
 
 -                 m_paramEdit.SetWindowText(m_paramList.GetItemText(m_Row, m_Col));//将该子项中的值放在Edit控件中;
 
 -                 m_paramEdit.ShowWindow(SW_SHOW);//显示Edit控件;
 
 -                 m_paramEdit.SetFocus();//设置Edit焦点
 
 -                 m_paramEdit.ShowCaret();//显示光标
 
 -                 m_paramEdit.SetSel(-1);//将光标移动到最后
 
 -                 if (m_Row == n - 1)
 
 -                 {
 
 -                         m_paramList.InsertItem(m_Row + 1, _T(""));
 
 -                 }
 
 -         }
 
 -         *pResult = 0;
 
 - }
 
  
- void CImageSimDlg::OnEnKillfocusEditParam()
 
 - {
 
 -         // TODO: 在此添加控件通知处理程序代码
 
 -         CString tem;
 
 -         m_paramEdit.GetWindowText(tem); //得到用户输入的新的内容
 
 -         m_paramList.SetItemText(m_Row, m_Col, tem); //设置编辑框的新内容
 
 -         m_paramEdit.ShowWindow(SW_HIDE); //应藏编辑框
 
 - }
 
  
- // 输入参数List初始化函数
 
 - void CImageSimDlg::InitListParam()
 
 - {
 
 -         // 创建一个空的图标,目的是简单的控制行高度
 
 -         CImageList imagelist_Dis;
 
 -         imagelist_Dis.Create(1, 24, ILC_COLOR, 1, 1); 
 
  
-         m_paramList.SetImageList(&imagelist_Dis, LVSIL_SMALL);
 
  
-         // 修改风格和扩展风格
 
 -         LONG lStyle_Dis = GetWindowLong(m_paramList.m_hWnd, GWL_STYLE);        // 获取当前窗口风格
 
 -         lStyle_Dis &= ~LVS_TYPEMASK;                                                                                                // 清除显示方式位 
 
 -         lStyle_Dis |= LVS_REPORT;                                                                                                        // 设置报表风格
 
 -         SetWindowLong(m_paramList.m_hWnd, GWL_STYLE, lStyle_Dis);                // 设置窗口风格
 
  
-         DWORD dwStyle_Dis = m_paramList.GetExtendedStyle();
 
  
-         // 选中某行使整行高亮(只适用于报表风格的listctrl)
 
 -         dwStyle_Dis |= LVS_EX_FULLROWSELECT;
 
 -         dwStyle_Dis |= LVS_EX_GRIDLINES;                                                                                        // 网格线(只适用与报表风格的listctrl)
 
 -         dwStyle_Dis |= LVS_EX_FLATSB;
 
 -         dwStyle_Dis |= LVS_EX_DOUBLEBUFFER;
 
 -         m_paramList.SetExtendedStyle(dwStyle_Dis);                                                // 设置扩展风格
 
  
-         m_paramList.SetBkColor(RGB(166, 202, 240));                                                // 设置背景颜色
 
 -         m_paramList.SetTextBkColor(RGB(166, 202, 240));                                        // 设置文本背景颜色
 
 -         m_paramList.SetTextColor(RGB(0, 0, 0));                                                        // 设置文本颜色
 
  
-         // 设备信息参数表建立
 
 -         LV_COLUMN col_Dis;
 
 -         col_Dis.mask = LVCF_FMT|LVCF_SUBITEM|LVCF_TEXT|LVCF_WIDTH;
 
 -         col_Dis.fmt = LVCFMT_CENTER;
 
 -         col_Dis.iSubItem = 0;
 
 -         col_Dis.pszText = _T("数据类型");
 
 -         col_Dis.cx = 60;
 
 -         m_paramList.InsertColumn(0, &col_Dis);
 
 -         // 每列宽度
 
 -         int colLen[5] = {100, 100, 100, 100, 100};
 
 -         m_paramList.InsertColumn(1, _T("数据个数/行"), LVCFMT_CENTER, colLen[0]);
 
 -         m_paramList.InsertColumn(2, _T("行数"), LVCFMT_CENTER, colLen[1]);
 
 -         m_paramList.InsertColumn(3, _T("行空闲数"), LVCFMT_CENTER, colLen[2]);
 
 -         m_paramList.InsertColumn(4, _T("帧空闲"), LVCFMT_CENTER, colLen[3]);
 
 -         m_paramList.InsertColumn(5, _T("图像个数"), LVCFMT_CENTER, colLen[4]);
 
  
-         // 插入行
 
 -         CString Line;
 
 -         for(int i=1;i<=10;i++)
 
 -         {
 
 -                 Line.Format(_T("%d"), i);
 
 -                 m_paramList.InsertItem(i, Line, 0);
 
 -         }
 
 - }
 
 
  复制代码 
InitListParam函数在窗口初始化时调用。最后效果如下: 
 
 
 
 
 
 |   
 
 
 
 |