龙马谷

 找回密码
 立即注册

QQ登录

只需一步,快速开始

龙马谷VIP会员办理客服QQ:82926983(如果临时会话没有收到回复,请先加QQ好友再发。)
1 [已完结] GG修改器新手入门与实战教程 31课 2 [已完结] GG修改器美化修改教程 6课 3 [已完结] GG修改器Lua脚本新手入门教程 12课
4 [已完结] 触动精灵脚本新手入门必学教程 22课 5 [已完结] 手游自动化脚本入门实战教程 9课 6 [已完结] C++射击游戏方框骨骼透视与自瞄教程 27课
7 [已完结] C++零基础UE4逆向开发FPS透视自瞄教程 29课 8 [已完结] C++零基础大漠模拟器手游自动化辅助教程 22课 9 [已完结] C++零基础开发DXF内存脚本辅助教程 32课
以下是天马阁VIP教程,本站与天马阁合作,赞助VIP可以获得天马阁对应VIP会员,名额有限! 点击进入天马阁论坛
1 [已完结] x64CE与x64dbg入门基础教程 7课 2 [已完结] x64汇编语言基础教程 16课 3 [已完结] x64辅助入门基础教程 9课
4 [已完结] C++x64内存辅助实战技术教程 149课 5 [已完结] C++x64内存检测与过检测技术教程 10课 6 [已完结] C+x64二叉树分析遍历与LUA自动登陆教程 19课
7 [已完结] C++BT功能原理与x64实战教程 29课 8 [已完结] C+FPS框透视与自瞄x64实现原理及防护思路
查看: 4411|回复: 0

MFC ListControl使用总结 设置背景,双击修改值

[复制链接]

14

主题

3

回帖

22

积分

编程入门

Rank: 1

龙马币
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中的内容。

001.png

为控件添加变量及事件处理程序
为List control添加control类型变量m_paramList,添加NM_DBLCLK处理程序(相应双击事件)。
为Edit control添加control类型变量m_paramEdit,添加EN_KILLFOCUS处理程序。

代码部分
在对应窗口类添加私有成员。

  1. private:
  2.         // 参数输入窗口双击后获得的横纵坐标
  3.         int m_Row;
  4.         int m_Col;
复制代码

在窗口类源文件添加代码,我的窗口类名为CImageSimDlg。

  1. //双击更改某一项的值
  2. //双击获取所选编辑框的横纵坐标,将一个edit控件移动到此处进行输入
  3. //通过后续的OnEnKillfocusEditParam()传递函数并处理
  4. void CImageSimDlg::OnNMDblclkListParam(NMHDR *pNMHDR, LRESULT *pResult)
  5. {
  6.         LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<NMITEMACTIVATE*>(pNMHDR);
  7.         // TODO: 在此添加控件通知处理程序代码
  8.         *pResult = 0;
  9.         NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
  10.         CRect rc;

  11.         m_Row = pNMListView->iItem;//获得选中的行
  12.         m_Col = pNMListView->iSubItem;//获得选中列
  13.         int n = m_paramList.GetItemCount();//获取当前一共多少行
  14.         if (pNMListView->iSubItem < 7) //如果选择的是子项;
  15.         {
  16.                 m_paramList.GetSubItemRect(m_Row, m_Col, LVIR_LABEL, rc);//获得子项的RECT;
  17.                 m_paramEdit.SetParent(&m_paramList);//转换坐标为列表框中的坐标
  18.                 m_paramEdit.MoveWindow(rc);//移动Edit到RECT坐在的位置;
  19.                 m_paramEdit.SetWindowText(m_paramList.GetItemText(m_Row, m_Col));//将该子项中的值放在Edit控件中;
  20.                 m_paramEdit.ShowWindow(SW_SHOW);//显示Edit控件;
  21.                 m_paramEdit.SetFocus();//设置Edit焦点
  22.                 m_paramEdit.ShowCaret();//显示光标
  23.                 m_paramEdit.SetSel(-1);//将光标移动到最后
  24.                 if (m_Row == n - 1)
  25.                 {
  26.                         m_paramList.InsertItem(m_Row + 1, _T(""));
  27.                 }
  28.         }
  29.         *pResult = 0;
  30. }

  31. void CImageSimDlg::OnEnKillfocusEditParam()
  32. {
  33.         // TODO: 在此添加控件通知处理程序代码
  34.         CString tem;
  35.         m_paramEdit.GetWindowText(tem); //得到用户输入的新的内容
  36.         m_paramList.SetItemText(m_Row, m_Col, tem); //设置编辑框的新内容
  37.         m_paramEdit.ShowWindow(SW_HIDE); //应藏编辑框
  38. }

  39. // 输入参数List初始化函数
  40. void CImageSimDlg::InitListParam()
  41. {
  42.         // 创建一个空的图标,目的是简单的控制行高度
  43.         CImageList imagelist_Dis;
  44.         imagelist_Dis.Create(1, 24, ILC_COLOR, 1, 1);

  45.         m_paramList.SetImageList(&imagelist_Dis, LVSIL_SMALL);

  46.         // 修改风格和扩展风格
  47.         LONG lStyle_Dis = GetWindowLong(m_paramList.m_hWnd, GWL_STYLE);        // 获取当前窗口风格
  48.         lStyle_Dis &= ~LVS_TYPEMASK;                                                                                                // 清除显示方式位
  49.         lStyle_Dis |= LVS_REPORT;                                                                                                        // 设置报表风格
  50.         SetWindowLong(m_paramList.m_hWnd, GWL_STYLE, lStyle_Dis);                // 设置窗口风格

  51.         DWORD dwStyle_Dis = m_paramList.GetExtendedStyle();

  52.         // 选中某行使整行高亮(只适用于报表风格的listctrl)
  53.         dwStyle_Dis |= LVS_EX_FULLROWSELECT;
  54.         dwStyle_Dis |= LVS_EX_GRIDLINES;                                                                                        // 网格线(只适用与报表风格的listctrl)
  55.         dwStyle_Dis |= LVS_EX_FLATSB;
  56.         dwStyle_Dis |= LVS_EX_DOUBLEBUFFER;
  57.         m_paramList.SetExtendedStyle(dwStyle_Dis);                                                // 设置扩展风格

  58.         m_paramList.SetBkColor(RGB(166, 202, 240));                                                // 设置背景颜色
  59.         m_paramList.SetTextBkColor(RGB(166, 202, 240));                                        // 设置文本背景颜色
  60.         m_paramList.SetTextColor(RGB(0, 0, 0));                                                        // 设置文本颜色

  61.         // 设备信息参数表建立
  62.         LV_COLUMN col_Dis;
  63.         col_Dis.mask = LVCF_FMT|LVCF_SUBITEM|LVCF_TEXT|LVCF_WIDTH;
  64.         col_Dis.fmt = LVCFMT_CENTER;
  65.         col_Dis.iSubItem = 0;
  66.         col_Dis.pszText = _T("数据类型");
  67.         col_Dis.cx = 60;
  68.         m_paramList.InsertColumn(0, &col_Dis);
  69.         // 每列宽度
  70.         int colLen[5] = {100, 100, 100, 100, 100};
  71.         m_paramList.InsertColumn(1, _T("数据个数/行"), LVCFMT_CENTER, colLen[0]);
  72.         m_paramList.InsertColumn(2, _T("行数"), LVCFMT_CENTER, colLen[1]);
  73.         m_paramList.InsertColumn(3, _T("行空闲数"), LVCFMT_CENTER, colLen[2]);
  74.         m_paramList.InsertColumn(4, _T("帧空闲"), LVCFMT_CENTER, colLen[3]);
  75.         m_paramList.InsertColumn(5, _T("图像个数"), LVCFMT_CENTER, colLen[4]);

  76.         // 插入行
  77.         CString Line;
  78.         for(int i=1;i<=10;i++)
  79.         {
  80.                 Line.Format(_T("%d"), i);
  81.                 m_paramList.InsertItem(i, Line, 0);
  82.         }
  83. }
复制代码

InitListParam函数在窗口初始化时调用。最后效果如下:

020.png


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

龙马谷| C/C++辅助教程| 安卓逆向安全| 论坛导航| 免责申明|Archiver|
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表龙马谷立场!
任何人不得以任何方式翻录、盗版或出售本站视频,一经发现我们将追究其相关责任!
我们一直在努力成为最好的编程论坛!
Copyright© 2018-2021 All Right Reserved.
在线客服
快速回复 返回顶部 返回列表