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

1.窗口上拖一个Edit控件,并将Visible设置为False

2.OnInitDialog为Edit设置父窗口为CListCtrl

m_edit.SetParent(&m_lstRecord);

设置父窗口非常关键,因为后续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

posted @ 2023-12-25 15:52  快雪  阅读(96)  评论(0编辑  收藏  举报