#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;
}