实现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