添加单元格编辑功能
使用CEdit控件动态创建编辑框,当用户点击单元格时显示。在LVN_BEGINLABELEDIT和LVN_ENDLABELEDIT消息处理函数中控制编辑流程。
重写OnLButtonDown函数检测点击位置,计算单元格坐标后创建编辑框:
void CMyListCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
LVHITTESTINFO hitTestInfo = {0};
hitTestInfo.pt = point;
SubItemHitTest(&hitTestInfo);
if(hitTestInfo.iItem != -1 && hitTestInfo.iSubItem != 0)
{
m_edit.ShowWindow(SW_HIDE);
CRect rect;
GetSubItemRect(hitTestInfo.iItem, hitTestInfo.iSubItem, LVIR_BOUNDS, rect);
m_edit.SetWindowText(GetItemText(hitTestInfo.iItem, hitTestInfo.iSubItem));
m_edit.MoveWindow(rect);
m_edit.ShowWindow(SW_SHOW);
m_edit.SetFocus();
m_edit.SetSel(0, -1);
}
CListCtrl::OnLButtonDown(nFlags, point);
}
实现单元格下拉列表
使用CComboBox控件创建下拉框,结合CListCtrl的GetSubItemRect精确定位。在PreSubclassWindow中初始化下拉控件:
m_combo.Create(WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST,
CRect(0,0,100,100), this, IDC_COMBO);
m_combo.AddString(_T("Option1"));
m_combo.AddString(_T("Option2"));
m_combo.ShowWindow(SW_HIDE);
处理点击事件显示下拉框:
void CMyListCtrl::OnClick(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMITEMACTIVATE pNMIA = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
if(pNMIA->iItem != -1 && pNMIA->iSubItem == targetCol)
{
CRect rect;
GetSubItemRect(pNMIA->iItem, pNMIA->iSubItem, LVIR_BOUNDS, rect);
m_combo.MoveWindow(rect);
m_combo.ShowWindow(SW_SHOW);
m_combo.SetFocus();
}
*pResult = 0;
}
数据同步机制
为下拉框添加CBN_SELCHANGE消息处理,将选择结果回填到列表单元格:
void CMyListCtrl::OnComboSelChange()
{
CString str;
m_combo.GetLBText(m_combo.GetCurSel(), str);
SetItemText(m_nItem, m_nSubItem, str);
m_combo.ShowWindow(SW_HIDE);
}
编辑框的EN_KILLFOCUS消息处理确保内容更新:
void CMyListCtrl::OnEditKillFocus()
{
CString str;
m_edit.GetWindowText(str);
SetItemText(m_nItem, m_nSubItem, str);
m_edit.ShowWindow(SW_HIDE);
}
样式控制技巧
设置扩展样式改善用户体验:
SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
对于下拉框的视觉效果,可以调用SetWindowPos调整高度:
rect.bottom += 150; // 展开下拉区域
m_combo.SetWindowPos(NULL, rect.left, rect.top,
rect.Width(), rect.Height(), SWP_NOZORDER);
输入验证处理
在编辑框关闭前添加验证逻辑:
void CMyListCtrl::OnEditKillFocus()
{
CString str;
m_edit.GetWindowText(str);
if(!ValidateInput(str)) // 自定义验证函数
{
MessageBox(_T("Invalid input!"));
m_edit.SetFocus();
return;
}
// ...更新单元格数据
}
392

被折叠的 条评论
为什么被折叠?



