实现MFC中CListCtrl双击单元格获取文本

发布时间 2023-12-25 15:54:38作者: 快雪

1.在类中定义CEdit控件

CEdit* m_edit;

2.窗口OnInitDialog创建窗口并设置父窗口为CListCtrl,设置字体

    m_edit = new CEdit();
    m_edit->Create(ES_LEFT | WS_CHILD | WS_TABSTOP | WS_BORDER,
        CRect(10, 10, 100, 100), &m_lstRecord, 1);
    m_edit->SetFont(GetFont());

设置父窗口非常关键,因为下一步Edit需要MoveWindow,而列表控件GetSubItemRect返回的区域是以列表控件左上角为(0,0)点,因此在此处设置之后,后面MoveWindow将不需要再次对Edit控件进行坐标转换。

3.响应列表控件NM_DBLCLK消息

void CXXXDlg::OnNMDblclkListRecord(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
    if (pNMItemActivate->iItem != -1)
    {
        // TODO: 在此添加控件通知处理程序代码
        CRect rect;
        if (m_lstRecord.GetSubItemRect(pNMItemActivate->iItem, pNMItemActivate->iSubItem, LVIR_LABEL, rect))
        {
            m_edit->MoveWindow(rect);
            m_edit->ShowWindow(SW_NORMAL);
            m_edit->SetWindowText(m_lstRecord.GetItemText(pNMItemActivate->iItem, pNMItemActivate->iSubItem));
            m_edit->SetSel(0, -1);//全选编辑框的内容。
            m_edit->ShowCaret();//显示光标
            m_edit->SetFocus();//设置输入焦点在编辑框上
        }
    }

    *pResult = 0;
}

4.响应CEdit控件ON_EN_KILLFOCUS(失焦)消息

void CXXXDlg::OnEnKillfocusEditText()
{
    // TODO: 在此添加控件通知处理程序代码
    m_edit->ShowWindow(SW_HIDE);
}

如果需要对单元格进行编辑,则在第3步将行、列记录在成员变量里,在第4步获取编辑框文本后,根据行、列设置回列表控件。

 

示例:

 

参考:

【1】https://blog.csdn.net/xiangzi890721/article/details/103809268

【2】https://learn.microsoft.com/zh-cn/cpp/mfc/reference/cedit-class?view=msvc-170