2015-04-22 8 views
2

Я создал проект Visual Studio MFC с CListCtrl. Я добавил некоторые элементы в класс CDialog, например:VisualStudio MFC CListCtrl SetItemText сбой

int l_iItem = m_listCtrl.InsertItem(LVIF_TEXT|LVIF_STATE, counter, someString, 0, LVIS_SELECTED, 0, 0);  
m_listCtrl.SetItemText(l_iItem, 1, blockHexChar); 
m_listCtrl.SetItemText(l_iItem, 2, description); 

Это прекрасно работает.

Впоследствии я хочу отредактировать подэлемент (над событием двойного щелчка). Работы тоже прекрасные.

Если редактирование закончено (это в классе CListCtrl),

OnEndLabelEdit(NMHDR* pNMHDR, LRESULT* pResult) 

будет называться. Это выглядит так:

LV_DISPINFO *plvDispInfo = (LV_DISPINFO *)pNMHDR; 
LV_ITEM *plvItem = &plvDispInfo->item; 
if (plvItem->pszText != NULL) 
{ 
    bool res = SetItemText(plvItem->iItem, plvItem->iSubItem, plvItem->pszText); 
} 

Я всегда получаю 0 назад, поэтому SetItemText не работает.

Любая идея, что я делаю неправильно?

Приветствия ehmkey

ответ

0

Спасибо за ваш вклад, но проблема была в MESSAGE_MAP (....) в классе CDialog.

У меня есть член, который содержит список, и я непосредственно сопоставлен с классом CListCtrl.

BEGIN_MESSAGE_MAP(CPeriDialog, CDialog) 
    ON_NOTIFY(LVN_ENDLABELEDIT, IDC_LIST1, &CListCtrl::OnEndLabelEdit) 
END_MESSAGE_MAP() 

Теперь я создал функцию обертки, которая передает событие в нужное место.

BEGIN_MESSAGE_MAP(CPeriDialog, CDialog) 
    ON_NOTIFY(LVN_ENDLABELEDIT, IDC_LIST1, &CPeriDialog::EndEdit) 
END_MESSAGE_MAP() 

Функция просто выглядит, как это

void CPeriDialog::EndEdit(NMHDR* pNMHDR, LRESULT* pResult) 
{ 
    m_listCtrl.OnEndLabelEdit(pNMHDR, pResult); 
} 
0

Вы должны размещать себе определенное пользователем сообщение (WM_USER+NNN) с использованием PostMessage изнутри OnEndLabelEdit. Измените метку в ответ на это сообщение.

0

LVN_ENDLABELEDIT передает указатель на NMLVDISPINFO через lParam. Я думаю, что вы просматриваете неправильную структуру при обработке уведомления. С помощью мастера класса для создания обработчика событий в VS2013 дает

void CMFCApplication6Dlg::OnLvnEndlabeleditList1(NMHDR *pNMHDR, LRESULT *pResult) 
    { 
    NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR); 
    // TODO: Add your control notification handler code here 
    *pResult = 0; 
    }