赞
踩
所谓List Contro l,就是用来做LIist的,至于编辑,估计MS也没提供这个功能。比较诡异的是在给List Control 设置属性的时候居然看到Edit Label ,处于好奇点了点,发现只能修改第一列,改了之后失去焦点又变 回原来的文本。没有深入试下去,我估计可以修改第一列的数据。
其实要实现编辑功能,只要做一个Edit Control 就可以了,当需要编辑的时候,把这个Edit Control 动态显示到需要显示的地方。看效果图:
双击输入框:
输入完成,点击空白处:
列表的所选属性如下:
另外需要为控件绑定一个控件变量,此处控件变量名为m_List。相添加完成后,可以看到在头文件中自动添加了如下代码。
CListCtrl m_List;
另外,在CPP文件中也会自动添加部分代码,此处就不在做演示工作了。
然后,添加响应List Control的双击事件:
注意,在相关的头文件中需要先添加如下成员变量:
CEdit editItem;
int hitRow;
int hitCol;
void CDlgCourseInfoModify::OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult) { LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR); // TODO: 在此添加控件通知处理程序代码 *pResult = 0; LVHITTESTINFO info; info.pt = pNMItemActivate->ptAction; if (m_List.SubItemHitTest(&info) != -1) { hitRow = info.iItem; hitCol = info.iSubItem; if (editItem.m_hWnd == NULL){ RECT rect; rect.left = 3; rect.top = 3; rect.bottom = 3; rect.right = 3; editItem.Create(WS_CHILD | ES_LEFT | WS_BORDER | ES_AUTOHSCROLL | ES_WANTRETURN | ES_MULTILINE, rect, this, 101); editItem.SetFont(this->GetFont(), FALSE); } CRect rect; m_List.GetSubItemRect(info.iItem, info.iSubItem, LVIR_BOUNDS, rect); rect.top += 12; rect.left += 13; rect.right += 13; rect.bottom += 12; editItem.SetWindowText(m_List.GetItemText(info.iItem, info.iSubItem)); editItem.MoveWindow(&rect, TRUE); editItem.ShowWindow(TRUE); editItem.SetFocus(); } }
在这个代码里面先得到鼠标双击的位置,判断是否击中了单元格,击中就调用Edit Control ,大小就是选中的单元 格,至于为什么rect要+12啊+13什么的,那是因为他出来的输入框跟单元格没对齐,导致很丑,这里可以根据自己的界面进行调整。最后再给这个Edit Control 一 个焦点,就可以直接输入了。
另外,为了能使输入之后有所反应,我们还要做一个鼠标的单击事件响应函数。
void CDlgCourseInfoModify::OnNMClickList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
*pResult = 0;
if (editItem.m_hWnd != NULL){
editItem.ShowWindow(0);
if (hitRow != -1){
CString text;
editItem.GetWindowText(text);
m_List.SetItemText(hitRow, hitCol, text);
}
}
hitCol = hitRow = -1;
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。