Как получить отредактированный индекс элемента управления списком в приложении MFC

#c #visual-studio #mfc

#c #visual-studio #mfc

Вопрос:

Я пишу приложение MFC на основе диалога в Visual Studio 2017 на C .

В диалоговом окне у меня есть элемент управления списком. Я хочу знать, какой столбец пользователь изменяет, если он редактирует список.

элемент управления списком выглядит следующим образом:

введите описание изображения здесь

Итак, если я отредактирую ячейку Channel Mode B , я ожидаю, что значение ячейки будет row = 2 и col = 1. Я попытался использовать следующий код:

В mask поле LVCOLUMN я включил следующий флаг:

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

В MESSAGE_MAP я добавил следующее уведомление:

ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST1, amp;CEditableListControlDlg::OnLvnItemchangedList1)

и обработчик, который я написал, является:

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

  

В этом коде переменной iItem является выбранная строка, а subItem — выбранный столбец.
Что меня интересует, так это получить pNMLV->iSubItem . Моя проблема в том, что значение subItem переменной всегда равно нулю, что означает, что оно не было выбрано в документации Microsoft Docs здесь

Как я могу получить индекс отредактированного подпункта?

Спасибо.

Комментарии:

1. В чем причина такого злоупотребления элементом управления списком? Информация, которую вы пытаетесь представить, действительно требует массива флажков. Это переключатели, которые пользователь может переключать, что является наиболее естественным способом описания данных.

Ответ №1:

Когда вы выберете другую строку, сообщение ответит. Если вы выберете одну и ту же строку и разные столбцы, сообщение не будет отвечать повторно. Таким образом, 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   amp;   LVIF_STATE)   amp;amp;   (pNMListView-> uNewState   amp;   LVIS_SELECTED)) 
    {
        DWORD   dwPos =GetMessagePos(); 
        CPoint   point(LOWORD(dwPos),HIWORD(dwPos)); 
         
        m_lst.ScreenToClient(amp;point);   
         
        LVHITTESTINFO lvinfo; 
        lvinfo.pt = point; 
        lvinfo.flags = LVHT_ABOVE; 
         
        int  nItem = m_lst.SubItemHitTest(amp;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;
}