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

标签 c++ visual-studio mfc

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

在对话框中我有一个列表控件。我想知道用户在编辑列表时更改了哪一列。

列表控件如下所示:

enter image description here

因此,如果我编辑单元格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 尚未选择它。

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

谢谢。

最佳答案

当您选择不同的线路时,消息将会响应。如果选择同一行不同列,则消息不会重复响应。因此,当您仅更改列时,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;
} 

关于c++ - 如何在MFC应用程序中获取列表控件的已编辑子项索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63885816/

相关文章:

c++ - 从析构函数中释放 boost::mutex

c# - 从代码中的变量访问结果 View

wpf - Microsoft Office 2010 使用 WPF 还是普通的旧 MFC?

c++ - 添加图标时 CMFCStatusBar 更改高度

C++ 具有多个字符的多个定界符

c++ - 在非阻塞套接字中选择函数

asp.net - Application Insights 将 ConnectedService.json 文件添加到我的项目中,这有什么作用?

c# - 有什么方法可以将我的 C# 项目添加为 IronPython/IronRuby 中的引用吗?

c++ - 如果在运行时添加两个按钮,mfc 按钮将显示不完整

c++ - 如果对象是右值,确保成员变量被移动