今天想做一个可编辑单元格的 listview,样式是 LVS_REPORT 与 LVS_EDITLABELS

网上搜索了一些相关资料,照葫芦画瓢写了一个,可测试的时候发现,当从第2列开始编辑的时候,第1列的内容就显示不出来。

网上搜索了一下,有一个网友和我遇到的问题一样: https://stackoverflow.com/questions/8658128/subclassing-list-view-to-edit-only-its-subitems?rq=1

下面是他贴出来的代码:

  1. WNDPROC wpOrigEditProc;
  2. RECT rcSubItem;
  3.  
  4. LRESULT CALLBACK WndProcEditList(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
  5. switch (uMsg) {
  6. case WM_WINDOWPOSCHANGING:
  7. {
  8. WINDOWPOS *pos = (WINDOWPOS*) lParam;
  9.  
  10. pos->x = rcSubItem.left; // 定位 listview 编辑框的位置
  11. pos->cx = rcSubItem.right;
  12. }
  13. break;
  14. default:
  15. return CallWindowProc(wpOrigEditProc, hWnd, uMsg, wParam, lParam);
  16. }
  17. return ;
  18. }
  19.  
  20. LRESULT CALLBACK WndProcList(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
  21. static HWND hEdit;
  22. static RECT rc;
  23. static LVITEM lvI;
  24. static unsigned char bEditing = ;
  25. switch (uMsg) {
  26. case WM_NOTIFY:
  27. switch (((NMHDR*) lParam)->code) {
  28. case NM_CLICK:
  29. lvI.iItem = ((NMITEMACTIVATE*) lParam)->iItem;
  30. lvI.iSubItem = ((NMITEMACTIVATE*) lParam)->iSubItem;
  31. break;
  32. case NM_DBLCLK:
  33. SendMessage(hWnd, LVM_EDITLABEL, lvI.iItem, );
  34. break;
  35. case LVN_BEGINLABELEDIT:
  36. {
  37. char text[];
  38. bEditing = ;
  39. hEdit = (HWND) SendMessage(hWnd, LVM_GETEDITCONTROL, , );
  40. rcSubItem.top = lvI.iSubItem;
  41. rcSubItem.left = LVIR_LABEL;
  42. SendMessage(hWnd, LVM_GETSUBITEMRECT, lvI.iItem, (long) &rcSubItem);
  43. rcSubItem.right = SendMessage(hWnd, LVM_GETCOLUMNWIDTH, lvI.iSubItem, );
  44. wpOrigEditProc = (WNDPROC) SetWindowLong(hEdit, GWL_WNDPROC, (long) WndProcEditList);
  45. lvI.pszText = text;
  46. lvI.cchTextMax = ;
  47. SendMessage(hWnd, LVM_GETITEMTEXT, lvI.iItem, (long) &lvI);
  48. SetWindowText(hEdit, lvI.pszText);
  49. }
  50. break;
  51. case LVN_ENDLABELEDIT:
  52. bEditing = ;
  53. SetWindowLong(hEdit, GWL_WNDPROC, (long) wpOrigEditProc);
  54. if (!lvI.iSubItem) return ;
  55. lvI.pszText = ((NMLVDISPINFO*) lParam)->item.pszText;
  56. if (!lvI.pszText) return ;
  57. SendMessage(hWnd, LVM_SETITEMTEXT, lvI.iItem, (long) &lvI);
  58. break;
  59. default:
  60. return CallWindowProc((WNDPROC) GetClassLong(hWnd, GCL_WNDPROC), hWnd, uMsg, wParam, lParam);
  61. }
  62. break;
  63. case WM_PAINT:
  64. if (bEditing) {
  65. RECT rcItem;
  66. if (lvI.iSubItem > ) {
  67. rcItem.left = LVIR_LABEL;
  68. if (SendMessage(hWnd, LVM_GETITEMRECT, lvI.iItem, (long) &rcItem))
  69. ValidateRect(hWnd, &rcItem);
  70. }
  71. }
  72. default:
  73. return CallWindowProc((WNDPROC) GetClassLong(hWnd, GCL_WNDPROC), hWnd, uMsg, wParam, lParam);
  74. }
  75. return ;
  76. }
  77.  
  78. LRESULT CALLBACK WndProcMain(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
  79. static HWND hList;
  80. static RECT rc;
  81. switch (uMsg) {
  82. case WM_NOTIFY:
  83. switch (((NMHDR*) lParam)->code) {
  84. case NM_CLICK:
  85. case NM_DBLCLK:
  86. case LVN_BEGINLABELEDIT:
  87. case LVN_ENDLABELEDIT:
  88. return CallWindowProc(WndProcList, ((NMHDR*) lParam)->hwndFrom, uMsg, wParam, lParam);
  89. }
  90. break;
  91. case WM_CREATE:
  92. {
  93. LVCOLUMN lvc;
  94. LVITEM lvI;
  95. unsigned int i;
  96. float vertex;
  97. char text[];
  98.  
  99. hList = CreateWindow(WC_LISTVIEW, , WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_EDITLABELS, rc.left, rc.top, rc.right, rc.bottom, hWnd, , hInstance, );
  100. SendMessage(hList, LVM_SETEXTENDEDLISTVIEWSTYLE, , LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
  101. SetWindowLong(hList, GWL_WNDPROC, (long) WndProcList);
  102.  
  103. lvc.mask = LVCF_WIDTH;
  104. lvc.cx = ;
  105. SendMessage(hList, LVM_INSERTCOLUMN, , (LPARAM) &lvc);
  106.  
  107. lvc.mask = LVCF_TEXT;
  108. lvc.pszText = "Vertex";
  109. SendMessage(hList, LVM_INSERTCOLUMN, , (LPARAM) &lvc);
  110. SendMessage(hList, LVM_SETCOLUMNWIDTH, , LVSCW_AUTOSIZE_USEHEADER);
  111.  
  112. lvI.mask = LVIF_TEXT;
  113. lvI.pszText = text;
  114.  
  115. for (i = ; i < ; i++) {
  116. vertex = (float) i;
  117. lvI.iItem = i;
  118. lvI.iSubItem = ;
  119. sprintf(text, "%d", i);
  120. SendMessage(hList, LVM_INSERTITEM, , (LPARAM) &lvI);
  121. lvI.iSubItem = ;
  122. sprintf(text, "%f, %f, %f", vertex - , vertex, vertex + );
  123. SendMessage(hList, LVM_SETITEM, , (LPARAM) &lvI);
  124. }
  125. }
  126. break;
  127. case WM_SIZE:
  128. GetClientRect(hWnd, &rc);
  129. MoveWindow(hList, rc.left, rc.top, rc.right, rc.bottom, );
  130. SendMessage(hList, LVM_SETCOLUMNWIDTH, , LVSCW_AUTOSIZE_USEHEADER);
  131. break;
  132. case WM_DESTROY:
  133. PostQuitMessage();
  134. break;
  135. default:
  136. return DefWindowProc(hWnd, uMsg, wParam, lParam);
  137. }
  138. return ;
  139. }

至于为什么当编辑第2,3,... 列时,当前行的第1列的内容不显示的原因,我还是没找到。

不过我找到了一个解决办法: 就是给 listview 添加一个空白列, 宽度设置为 0

lvc.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_FMT;

lvc.pszText = "";
lvc.cx = 0; //宽度设置为 0
lvc.fmt = LVCFMT_CENTER;

这也是不是办法的办法了,反正我没有更好的解决方案。

名品推荐:歌菲妮 韩锦 米熙

listview 样式 LVS_REPORT 与 LVS_EDITLABELS 编辑单元格时,当前行第一列内容不显示的更多相关文章

  1. LVC函数重要参数 EDT_CLL_CB:退出可编辑单元格时回调

    6. I_GRID_SETTINGS 参数属性该参数用于设置Grid相关参数(打印.单元格回调):类型为:LVC_S_GLAY,该结构包括:01) COLL_TOP_P:最小化 TOP_OF_PAGE ...

  2. EasyUI DataGrid编辑单元格时使用combogrid

    仅提供一段columns配置代码供参考: conditions对象是一个已赋值的数组对象集合.下拉框数据可直接使用conditions数据,也可以通过url获取. columns : [[ { fie ...

  3. FineUI大版本升级,外置ExtJS库、去AXD化、表格合计行、表格可编辑单元格的增删改、顶部菜单框架

    这是一篇很长的文章,在开始正文之前,请允许我代表目前排名前 20 中唯一的 .Net 开源软件 FineUI 拉下选票: 投票地址: https://code.csdn.net/2013OSSurve ...

  4. 扩展jquery easyui datagrid编辑单元格

    扩展jquery easyui datagrid编辑单元格 1.随便聊聊 这段时间由于工作上的业务需求,对jquery easyui比较感兴趣,根据比较浅薄的js知识,对jquery easyui中的 ...

  5. 获取wpf datagrid当前被编辑单元格的内容

    原文 获取wpf datagrid当前被编辑单元格的内容 确认修改单元个的值, 使用到datagrid的两个事件 开始编辑事件 BeginningEdit="dataGrid_Beginni ...

  6. 动态渲染可编辑单元格的Table

    一.问题描述 问题是这样的,后台传了xArr = [x1, x2,...,xn]和yArr = [y1, y2, ..yn]两个数组,前端要渲染出表格并且可以填写每个单元格的值,然后按照一定数据结构保 ...

  7. Swift - 可编辑表格样例(可直接编辑单元格中内容、移动删除单元格)

    (本文代码已升级至Swift3)   本文演示如何制作一个可以编辑单元格内容的表格(UITableView). 1,效果图 (1)默认状态下,表格不可编辑,当点击单元格的时候会弹出提示框显示选中的内容 ...

  8. 固定表头,单元格td宽度自适应,多内容出现-横向纵向滚动条数据表格的<前世今生>

    固定表头,单元格td宽度自适应,多内容出现-横向纵向滚动条数据表格的<前世今生>     先上图例   & 无论多少数据--都完美! 背景:由于我司行业方向,需要很多数据报表,则t ...

  9. EXCEL在改动某几个单元格时隐藏空列

    概述 今天我哥来找我帮他搞下excel表格,本着程序猿对程序无所不能的精神,我爽快的答应了.结果查了半天才搞定.现在记录在此,供自己以后参考,相信对其他人也有用. PS:这几天正在弄博客,马上就要弄完 ...

随机推荐

  1. null值经过强转会怎样?

    null还是null,类型不会改变的,也不会报错!

  2. linux pstree命令

    pstree命令可以使进程以tree的形式显示 pstree -ssystemd─┬─UVPHostd───6*[{UVPHostd}] ├─acpid ├─2*[agetty] ├─crond ├─ ...

  3. WPF中关于对前台Xaml中Triggers的一些重要思考。

    今天在做一个小Demo的时候碰到了一个比较奇怪的问题,就是其中一个Trigger始终无法执行,<Trigger Property="Popup.IsOpen" Value=& ...

  4. SQL字段类型bit 查询时注意

    sql 查询时  字段=1 或 字段=0 c# 里也是

  5. Lodop打印控件 打印透明图问题

    Lodop通过增设transcolor属性实现了“先字后章”效果,这个属性可以把某种颜色转成类似透明的效果.例如:把图章的底色白色变成透明:transcolor="#FFFFFF" ...

  6. git reset 版本回退的三种用法总结

    git reset (–mixed) HEAD~1 回退一个版本,且会将暂存区的内容和本地已提交的内容全部恢复到未暂存的状态,不影响原来本地文件(未提交的也不受影响) git reset –soft ...

  7. KKT条件

    kkt条件背下来容易.理解上还有问题 主要是lambda≥0和lambda*f(x)=0这两个条件懵逼. 下面说明一下为什么 参考:https://blog.csdn.net/newthinker_w ...

  8. @EnableWebMvc

    1.启用MVC Java config 或 MVC XML namespace 想要启用MVC Java config,只需要将@EnableWebMvc添加到你的一个@Configuration c ...

  9. Mysql 计划任务

    -- 设置 show variables like '%sche%'; ; -- Start存储过程 drop PROCEDURE if exists test; CREATE PROCEDURE t ...

  10. UOJ274 [清华集训2016] 温暖会指引我们前行 【LCT】【最大生成树】

    题目分析: 差评,最大生成树裸题.hack数据还卡常. 代码: #include<bits/stdc++.h> using namespace std; ; struct LCT{ ],d ...