当前位置:   article > 正文

MFC 的List Control控件实现可编辑_mfc中listctrl 双击列编辑

mfc中listctrl 双击列编辑
所谓 List Contro l,就是用来做LIist的,至于编辑,估计MS也没提供这个功能。比较诡异的是在给 List Control 设置属性的时候居然看到 Edit Label ,处于好奇点了点,发现只能修改第一列,改了之后失去焦点又变 回原来的文本。没有深入试下去,我估计可以修改第一列的数据。
其实要实现编辑功能,只要做一个 Edit Control 就可以了,当需要编辑的时候,把这个 Edit Control 动态显示到需要显示的地方。看效果图:
双击输入框:


输入完成,点击空白处:

在这里,响应List Control的双击事件:

代码
  1. 1 void CAddInstanceDlg::OnNMDblclkList3(NMHDR * pNMHDR, LRESULT * pResult)
  2. 2 {
  3. 3 LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast < LPNMITEMACTIVATE > (pNMHDR);
  4. 4
  5. 5 LVHITTESTINFO info;
  6. 6 info.pt = pNMItemActivate -> ptAction;
  7. 7
  8. 8 if (listControl.SubItemHitTest( & info) != - 1 )
  9. 9 {
  10. 10 hitRow = info.iItem;
  11. 11 hitCol = info.iSubItem;
  12. 12 if (editItem.m_hWnd == NULL) // editItem为一输入框控件,
  13. 13 {
  14. 14 RECT rect;
  15. 15 rect.left = 0 ;
  16. 16 rect.top = 0 ;
  17. 17 rect.bottom = 15 ;
  18. 18 rect.right = 200 ;
  19. 19 editItem .Create(WS_CHILD | ES_LEFT | WS_BORDER | ES_AUTOHSCROLL | ES_WANTRETURN | ES_MULTILINE, rect, this , 101 );
  20. 20 editItem.SetFont( this -> GetFont(), FALSE);
  21. 21 }
  22. 22 CRect rect;
  23. 23 listControl.GetSubItemRect(info.iItem, info.iSubItem, LVIR_BOUNDS, rect);
  24. 24 rect.top += 12 ;
  25. 25 rect.left += 13 ;
  26. 26 rect.right += 13 ;
  27. 27 rect.bottom += 12 ;
  28. 28
  29. 29 editItem.SetWindowText(listControl.GetItemText( info .iItem, info .iSubItem));
  30. 30 editItem.MoveWindow( & rect, TRUE);
  31. 31 editItem.ShowWindow( 1 );
  32. 32 editItem.SetFocus();
  33. 33 }
  34. 34 * pResult = 0 ;
  35. 35 }

这里比较诡异的是我用Visual Studio 2008自动生成的事件响应函数的第一行居然出错,google之后第一个就是微软关于这个自动生成代码错误的修正。
在这个代码里面先得到鼠标双击的位置,判断是否击中了单元格,击中就调用 Edit Control ,大小就是选中的单元 格, 至于为什么rect要+12啊+13什么的,那是因为他出来的输入框跟单元格没对齐,导致很丑,这里可以根据自己的界面进行调整。最后再给这个 Edit Control 一 个焦点,就可以直接输入了。
另外,为了能使输入之后有所反应,我们还要做一个鼠标的单击事件响应函数。
 
  1. void CAddInstanceDlg::OnNMClickList3(NMHDR * pNMHDR, LRESULT * pResult)
  2. 2 {
  3. 3 LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast < LPNMITEMACTIVATE > (pNMHDR);
  4. 4
  5. 5 if (editItem.m_hWnd != NULL)
  6. 6 {
  7. 7 editItem.ShowWindow( 0 );
  8. 8 if (hitRow != - 1 )
  9. 9 {
  10. 10 CString text;
  11. 11 editItem.GetWindowText(text);
  12. 12 listControl.SetItemText(hitRow, hitCol, text);
  13. 13 }
  14. 14 }
  15. 15 hitCol = hitRow = - 1 ;
  16. 16 * pResult = 0 ;
  17. 17 }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/301815?site
推荐阅读
相关标签
  

闽ICP备14008679号