MFC 的List Control控件实现可编辑

    所谓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   }

 

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值