CListCtrl结合combo-box的单元格编辑与下拉菜单实战

添加单元格编辑功能

使用CEdit控件动态创建编辑框,当用户点击单元格时显示。在LVN_BEGINLABELEDITLVN_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控件创建下拉框,结合CListCtrlGetSubItemRect精确定位。在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;
    }
    // ...更新单元格数据
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值