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了。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值