之前写过一篇(list Control实现单元格编辑)文章,那篇文章不是很完善执行的时候有时会出错,这篇文章经过完善后还加入了Combo Box功能!

这里我就只是晒一下我的代码;

头文件:

  1. // ListControlTestDlg.h : 头文件
  2. //
  3. #pragma once
  4. #include "afxcmn.h"
  5. #include "MyClstctrl.h"
  6. #include "afxwin.h"
  7. #define  IDC_EDIT 0xffff
  8. // CListControlTestDlg 对话框
  9. class CListControlTestDlg : public CDialog
  10. {
  11. // 构造
  12. public:
  13. CListControlTestDlg(CWnd* pParent = NULL);  // 标准构造函数
  14. // 对话框数据
  15. enum { IDD = IDD_LISTCONTROLTEST_DIALOG };
  16. protected:
  17. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
  18. // 实现
  19. protected:
  20. HICON m_hIcon;
  21. // 生成的消息映射函数
  22. virtual BOOL OnInitDialog();
  23. afx_msg void OnPaint();
  24. afx_msg HCURSOR OnQueryDragIcon();
  25. DECLARE_MESSAGE_MAP()
  26. public:
  27. afx_msg void OnNMRClickList1(NMHDR *pNMHDR, LRESULT *pResult);
  28. CListCtrl m_list;
  29. afx_msg void OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult);
  30. afx_msg void OnNMClickList1(NMHDR *pNMHDR, LRESULT *pResult);
  31. CEdit m_Edit;
  32. int m_Item;  //要Edit行
  33. int m_SubItem; //要Edit列
  34. int rowCount;  //总行数
  35. int m_ComItem; // 要加入Combo Box 的行
  36. int m_ComSubItem; //要加入Combo Box的列 为了区别才这样定义,下面的两个bool类型也一样
  37. bool  needSave; //用于保存标志,如果有过编写则为TURE,当下次编辑时会在原来的位置输入原来输入的内容
  38. bool  ComneedSave;
  39. afx_msg void OnLvnItemchangedList1(NMHDR *pNMHDR, LRESULT *pResult);
  40. CComboBox m_comBox;
  41. };

Cpp文件:

  1. void CListControlTestDlg::DoDataExchange(CDataExchange* pDX)
  2. {
  3. CDialog::DoDataExchange(pDX);
  4. DDX_Control(pDX, IDC_LIST1, m_list);  //关联控件
  5. }
  1. BEGIN_MESSAGE_MAP(CListControlTestDlg, CDialog)
  2. ON_WM_PAINT()
  3. ON_WM_QUERYDRAGICON()
  4. //}}AFX_MSG_MAP            //关联函数处理消息
  5. ON_NOTIFY(NM_RCLICK, IDC_LIST1, &CListControlTestDlg::OnNMRClickList1) //关联处理点击右键函数
  6. ON_NOTIFY(NM_DBLCLK, IDC_LIST1, &CListControlTestDlg::OnNMDblclkList1) //关联处理双击左键函数
  7. ON_NOTIFY(NM_CLICK, IDC_LIST1, &CListControlTestDlg::OnNMClickList1)   //关联处理单击左键函数
  8. ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST1, &CListControlTestDlg::OnLvnItemchangedList1)
  9. END_MESSAGE_MAP()

在OnInitDialog()函数内做一些初始化处理

  1. BOOL CListControlTestDlg::OnInitDialog()
  2. {
  3. CDialog::OnInitDialog();
  4. // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
  5. //  执行此操作
  6. SetIcon(m_hIcon, TRUE);         // 设置大图标
  7. SetIcon(m_hIcon, FALSE);        // 设置小图标
  8. // TODO: 在此添加额外的初始化代码
  9. RECT  m_rect;
  10. m_list.GetClientRect(&m_rect); //获取list的客户区
  11. m_list.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT); //设置list风格
  12. m_list.InsertColumn(0,_T("学号"),LVCFMT_LEFT, m_rect.right/4);
  13. m_list.InsertColumn(1,_T("姓名"),LVCFMT_LEFT, m_rect.right/4);
  14. m_list.InsertColumn(2,_T("性别"),LVCFMT_LEFT, m_rect.right/4);
  15. m_list.InsertColumn(3,_T("班级"),LVCFMT_LEFT, m_rect.right/4);
  16. m_list.InsertItem(0,_T("09090901"));
  17. m_list.SetItemText(0,1,_T("小李"));
  18. m_list.SetItemText(0,2,_T("男"));
  19. m_list.SetItemText(0,3,_T("计科0901"));
  20. m_list.InsertItem(1,_T("09090902"));
  21. m_list.SetItemText(1,1,_T("小王"));
  22. m_list.SetItemText(1,2,_T("男"));
  23. m_list.SetItemText(1,3,_T("计科0902"));
  24. rowCount = m_list.GetItemCount();  //获取行数
  25. needSave = false; //初始化为FLASE;
  26. ComneedSave = false;
  27. return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
  28. }

这里我就只是将单击左键时的函数实现代码上传上来,里面实现了Edit和Combo Box 控件功能

  1. void CListControlTestDlg::OnNMClickList1(NMHDR *pNMHDR, LRESULT *pResult)
  2. {
  3. LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
  4. // TODO: 在此添加控件通知处理程序代码
  5. //我这里有两种办法可以实现
  6. NM_LISTVIEW  *pEditCtrl = (NM_LISTVIEW *)pNMHDR;
  7. CRect  EditRect;
  8. CRect  ComRect;
  9. //CPoint  point;
  10. //GetCursorPos(&point);
  11. //m_list.ScreenToClient(&point);
  12. //LVHITTESTINFO info;
  13. //info.pt = point;
  14. //info.flags = LVHT_ABOVE
  15. //m_Item = m_list.SubItemHitTest(&info);
  16. if (pEditCtrl->iItem == -1)
  17. {
  18. //当点击其他区域时,显示内容
  19. if (needSave)
  20. {
  21. //needSave == TURE
  22. CString  EditStr;
  23. m_Edit.GetWindowText(EditStr); //获取输入的内容
  24. m_list.SetItemText(m_Item,m_SubItem,EditStr); //m_Item,m_SubItem这两个变量的值是原来的单元格的值
  25. m_Edit.ShowWindow(SW_HIDE);
  26. }
  27. if (ComneedSave)
  28. {
  29. CString strCom;
  30. m_comBox.GetWindowText(strCom);
  31. m_list.SetItemText(m_ComItem,m_ComSubItem,strCom);
  32. m_comBox.ShowWindow(SW_HIDE);
  33. }
  34. /*
  35. if (m_Edit.m_hWnd != NULL)
  36. {
  37. m_Edit.ShowWindow(SW_HIDE);
  38. }
  39. if (m_comBox.m_hWnd != NULL)
  40. {
  41. m_comBox.ShowWindow(SW_HIDE);
  42. }
  43. */
  44. return;
  45. }
  46. //m_SubItem = info.iSubItem;
  47. //在1,2,4列实现编辑
  48. if (pEditCtrl->iItem < rowCount && pEditCtrl->iSubItem != 2)
  49. {
  50. if (m_comBox.m_hWnd != NULL)
  51. {
  52. CString strCom;
  53. m_comBox.GetWindowText(strCom);
  54. m_list.SetItemText(m_ComItem,m_ComSubItem,strCom);//ComBoBox保存之前数据
  55. m_comBox.ShowWindow(SW_HIDE);
  56. }
  57. if (needSave)
  58. {
  59. //needSave == TURE
  60. CString  EditStr;
  61. m_Edit.GetWindowText(EditStr); //获取输入的内容
  62. m_list.SetItemText(m_Item,m_SubItem,EditStr); //m_Item,m_SubItem这两个变量的值是原来的单元格的值
  63. }
  64. m_Item = pEditCtrl->iItem; //行数
  65. m_SubItem = pEditCtrl->iSubItem; //列数
  66. m_list.GetSubItemRect(m_Item,m_SubItem,LVIR_LABEL,EditRect); //获取单元格的空间
  67. if (m_Edit.m_hWnd == NULL)
  68. {    //m_Edit.m_hWnd == NULL说明还没创建
  69. //RECT rect;
  70. //rect.left = rect.top = 0;
  71. //rect.bottom = 20;
  72. //rect.right = 100;
  73. needSave = true;
  74. m_Edit.Create(ES_AUTOHSCROLL|WS_CHILD|ES_LEFT|ES_WANTRETURN|WS_BORDER,
  75. CRect(0,0,0,0),this,IDC_EDIT);
  76. //IDC_EDIT已近在头文件中定义,这个很重要,很多时候会忽略,
  77. //网上找到的实现编辑办法中这个都没说明
  78. //我定义为#define  IDC_EDIT 0xffff
  79. m_Edit.ShowWindow(SW_HIDE); //Edit创建完后隐藏
  80. m_Edit.SetFont(this->GetFont(),FALSE);//设置字体
  81. /*
  82. CFont tpFont;
  83. tpFont.CreateStockObject(DEFAULT_GUI_FONT);
  84. m_Edit.SetFont(&tpFont);
  85. tpFont.DeleteObject();
  86. */
  87. }
  88. m_Edit.SetParent(&m_list); //将list control设置为父窗口,生成的Edit才能正确定位,这个也很重要,
  89. EditRect.SetRect(EditRect.left,EditRect.top,EditRect.left+m_list.GetColumnWidth(m_SubItem),EditRect.bottom);
  90. //m_list.GetColumnWidth(m_SubItem)获取列的宽度
  91. CString strItem = m_list.GetItemText(m_Item,m_SubItem);
  92. m_Edit.MoveWindow(&EditRect);
  93. m_Edit.ShowWindow(SW_SHOW);
  94. m_Edit.SetWindowText(strItem);
  95. m_Edit.SetFocus();//设置为焦点
  96. m_Edit.SetSel(0,-1);  //0,-1表示单元格内容全选中
  97. }
  98. //在第三列插入Combo Box
  99. if (pEditCtrl->iSubItem == 2)
  100. {
  101. if (m_Edit.m_hWnd != NULL)
  102. {
  103. CString  EditStr;
  104. m_Edit.GetWindowText(EditStr); //获取输入的内容
  105. m_list.SetItemText(m_Item,m_SubItem,EditStr); //m_Item,m_SubItem这两个变量的值是原来的单元格的值
  106. m_Edit.ShowWindow(SW_HIDE);
  107. }
  108. if (ComneedSave)
  109. {
  110. CString strCom;
  111. m_comBox.GetWindowText(strCom);
  112. m_list.SetItemText(m_ComItem,m_ComSubItem,strCom);
  113. }
  114. m_ComItem = pEditCtrl->iItem; //行数
  115. m_ComSubItem = pEditCtrl->iSubItem; //列数
  116. m_list.GetSubItemRect(m_ComItem,m_ComSubItem,LVIR_LABEL,ComRect);
  117. if (m_comBox.m_hWnd == NULL)
  118. {
  119. ComneedSave = true;
  120. m_comBox.Create(WS_CHILD|WS_VISIBLE|CBS_SORT|CBS_DROPDOWN|CBS_OEMCONVERT,CRect(0,0,40,40),this,0);
  121. //CBS_OEMCONVERT 实现可编辑
  122. //CBS_DROPDOWN   产生一个下拉式框,小图标
  123. //CBS_DROPDOWNLIST   图标代替单元格
  124. m_comBox.AddString(_T("男"));  //添加选项
  125. m_comBox.AddString(_T("女"));
  126. m_comBox.SetFont(this->GetFont(),FALSE);
  127. // m_comBox.ShowWindow(SW_HIDE);
  128. }
  129. CString  ComstrItem;
  130. m_comBox.SetParent(&m_list);
  131. ComstrItem = m_list.GetItemText(m_ComItem,m_ComSubItem);
  132. ComRect.SetRect(ComRect.left,ComRect.top,ComRect.left+m_list.GetColumnWidth(m_ComSubItem),ComRect.bottom);
  133. m_comBox.MoveWindow(&ComRect);
  134. m_comBox.ShowWindow(SW_SHOW);
  135. m_comBox.SetWindowText(ComstrItem);  //当显示Combo Box控件时里面的内容为原来的内容,不然是空白的
  136. m_comBox.SetFocus(); //设置焦点
  137. }
  138. *pResult = 0;
  139. }

listcontrol 加combobox的更多相关文章

  1. listcontrol 加combobox实现

    头文件 #pragma once#include "D:\Work\山东项目\StandardizedDrawing\sdUtils\CSGrid.h"#include " ...

  2. ExtJs基础知识总结:自定义弹窗和ComboBox自动联想加载(四)

    概述 Extjs弹窗可以分为消息弹窗.对话框,这些弹窗的方式ExtJs自带的Ext.Msg.alert就已经可以满足简单消息提示,但是相对复杂的提示,比如如何将Ext.grid.Panel的控件显示嵌 ...

  3. 加载ComboBox控件

    /// <summary> /// 加载公司 /// </summary> /// <param name="cbbCompany">Combo ...

  4. extjs Combobox动态加载数据问题,mode:local 还是remote

    var fabircTypeDs = new Ext.data.Store({ proxy: new Ext.data.HttpProxy({ url: 'province.do' }), reade ...

  5. combobox远程加载数据的总结和Json数据的小结

    1.从后台返回请求加载Combobox下拉框数据 html部分1 <select name="mateBelongZ" id="mateBelongZID" ...

  6. easyui combobox 动态加载数据C#

    <script type="text/javascript" src="Scripts/jquery-1.8.2.min.js"></scri ...

  7. easyui combobox 动态加载的两种方法

    reload 方法 javascript代码 //指定id 和 text 否则始终选择第一个 $('#contact_city').combobox({ valueField:'id', textFi ...

  8. easyui combobox 动态加载数组数据

    怕自己忘了,记录下来以后用方便 html部分 <input id="rzcode" name="businesItemId" style="wi ...

  9. ExtJS ComboBox同时加载远程和本地数据

    ExtJS ComboBox同时加载远程和本地数据 原文:http://gblog.hbcf.net/index.php/archives/233 ComboBox比较特殊需求,将远程数据和本地数据同 ...

随机推荐

  1. Display certain line(s) from a text file in Linux.

    Purpose: Display certain line or lines from a text file, such as : Display the 1000th line from file ...

  2. Linux经常使用命令-文件搜索命令-文件搜索命令find

    命令名称:find 命令所在路径:/bin/find 语法:find [搜索范围] [匹配条件] 功能描写叙述:文件搜索 演示样例 find /etc - name init 在文件夹/etc 中查找 ...

  3. 连载:面向对象葵花宝典:思想、技巧与实践(34) - DIP原则

    DIP,dependency inversion principle,中文翻译为"依赖倒置原则". DIP是大名鼎鼎的Martin大师提出来的.他在1996 5月的C++ Repo ...

  4. struts2 与spring整合

    要把struts2的action交给spring管理,这样spring才干帮struts2注入须要的的bean(一開始action是由struts初始化,所以想注入spring里面的bean是注入不了 ...

  5. leetCode(49):Count Primes

    Description: Count the number of prime numbers less than a non-negative number, n. 推断一个数是否是质数主要有下面几种 ...

  6. 深入理解MVC C#+HtmlAgilityPack+Dapper走一波爬虫 StackExchange.Redis 二次封装 C# WPF 用MediaElement控件实现视频循环播放 net 异步与同步

    深入理解MVC   MVC无人不知,可很多程序员对MVC的概念的理解似乎有误,换言之他们一直在错用MVC,尽管即使如此软件也能被写出来,然而软件内部代码的组织方式却是不科学的,这会影响到软件的可维护性 ...

  7. ZOJ 3888 Twelves Monkeys (预处理+优先队列)

    题目链接:ZOJ 3888 Twelves Monkeys 题意:题目描写叙述起来比較绕,直接讲案例 9 3 3 9 1 6 1 4 1 6 7 2 输入n,m,q.n限制了你询问的年份,m台时光机, ...

  8. HBase无法连接ZooKeeper问题

    上次搭建HBase环境后,运行登陆server时,报以下的错误: hadoop@gpmaster logs]$ hbase shell SLF4J: Class path contains multi ...

  9. SQL SERVER学习笔记:临时表与表变量

    本文主要摘自徐海蔚的<Microsoft SQL SERVER企业级平台管理实践> 表变量可以作为存储过程的返回参数,而临时表不行.(存疑?表值参数只在SQL SERVER2008才开始支 ...

  10. C++ 函数模板与类模板(使用 Qt 开发编译环境)

    注意:本文中代码均使用 Qt 开发编译环境,如有疑问和建议欢迎随时留言. 模板是 C++ 支持参数化程序设计的工具,通过它可以实现参数多态性.所谓参数多态性,就是将程序所处理的对象的类型参数化,使得一 ...