ListControl编辑单元格数据

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


输入完成,点击空白处:
 

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

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


 



    这里比较诡异的是我用Visual Studio 2008自动生成的事件响应函数的第一行居然出错,google之后第一个就是微软关于这个自动生成代码错误的修正。
    在这个代码里面先得到鼠标双击的位置,判断是否击中了单元格,击中就调用Edit Control,大小就是选中的单元 格,至于为什么rect要+12啊+13什么的,那是因为他出来的输入框跟单元格没对齐,导致很丑。最后再给这个Edit Control一 个焦点,就可以直接输入了。
    另外,为了能使输入之后有所反应,我们还要做一个鼠标的单击事件响应函数。
 

代码
 1  void  CAddInstanceDlg::OnNMClickList3(NMHDR  * pNMHDR, LRESULT  * pResult)
 2  {
 3      LPNMITEMACTIVATE pNMItemActivate  =  reinterpret_cast < LPNMITEMACTIVATE > (pNMHDR);
 4 
 5       if (editItem.m_hWnd  !=  NULL)
 6      {
 7          editItem.ShowWindow( 0 );
 8           if (hitRow  !=   - 1 )
 9          {
10              CString text;
11              editItem.GetWindowText(text);
12              listControl.SetItemText(hitRow, hitCol, text);
13          }
14      }
15       hitCol  =  hitRow  =   - 1 ;
16       * pResult  =   0 ;
17  }


 


    这里是要判断一下是不是已经选中了单元格,如果处在编辑状态,离开了编辑状态就将文本显示在单元格上。
    如此就OK了。

 

你可能感兴趣的:(职场,休闲,ListControl)