MFC应用程序中如何获取列表控件的已编辑子项索引

How to get edited subitem index of list control in MFC application

我正在 Visual Studio 2017 年用 C++ 编写一个基于对话框的 MFC 应用程序。

在对话框中我有一个列表控件。我想知道如果用户编辑列表,他会更改哪一列。

列表控件如下所示:

因此,如果我编辑单元格 Channel Mode B,我希望单元格的值为 row = 2 和 col = 1。我尝试使用以下代码:

LVCOLUMNmask 字段中,我启用了以下标志:

LVCOLUMN lvColumn;
lvColumn.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;

MESSAGE_MAP 我添加了以下通知:

ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST1, &CEditableListControlDlg::OnLvnItemchangedList1)

我写的处理程序是:

void CEditableListControlDlg::OnLvnItemchangedList1(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
    
    
    
    if (pNMLV->uChanged & LVIF_STATE)
    {
        
        if ((pNMLV->uNewState) & LVIS_SELECTED)
        {
            int iItem = pNMLV->iItem;
            int subItem = pNMLV->iSubItem;
        }
    }
    *pResult = 0;
}

在此代码中,变量 iItem 是选定的行,subItem 是选定的列。 我感兴趣的是获得pNMLV->iSubItem。我的问题是 subItem 变量的值始终为零,这意味着它尚未被 Microsoft Docs 文档选择 here

如何获取被编辑的子项的索引?

谢谢。

当您select换行时,消息会回复。如果你select同行不同列,消息将不会重复回复。因此,当您仅更改列时,iSubItem 将始终为 0。

你可以参考下面的例子

void CSdfsdfDlg::OnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult) 
{
    NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
    // TODO: Add your control notification handler code here
     
    if ((pNMListView-> uChanged   &   LVIF_STATE)   &&   (pNMListView-> uNewState   &   LVIS_SELECTED)) 
    {
        DWORD   dwPos =GetMessagePos(); 
        CPoint   point(LOWORD(dwPos),HIWORD(dwPos)); 
         
        m_lst.ScreenToClient(&point);   
         
        LVHITTESTINFO lvinfo; 
        lvinfo.pt = point; 
        lvinfo.flags = LVHT_ABOVE; 
         
        int  nItem = m_lst.SubItemHitTest(&lvinfo); 
        if(nItem!=-1) 
        { 
            CString strtemp; 
            strtemp.Format( "the row is %d and the column is %d ", lvinfo.iItem, lvinfo.iSubItem); 
            MessageBox(strtemp);
        } 
         
    }
 
 
    *pResult = 0;
}