ListControl双击实现可编辑

http://blog.csdn.net/zhenhua10/article/details/5622497

所谓List Contro l,就是用来做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) //  editItem为一输入框控件, 
13           {
14               RECT rect;
15               rect.left   =     0  ;
16               rect.top   =     0  ;
17               rect.bottom   =     15  ;
18               rect.right   =     200  ;
19                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(  info  .iItem,   info  .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   }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值