2015-04-22 154 views
2

我用CListCtrl創建了一個MFC Visual Studio項目。我在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

感謝您的輸入,但問題是在CDialog類的MESSAGE_MAP(....)。

我在這裏有一個成員,它擁有列表,我直接映射到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

你必須張貼自己使用PostMessageOnEndLabelEdit內的用戶定義的消息(WM_USER+NNN)。根據該消息更改標籤。

0

LVN_ENDLABELEDIT通過lParam傳遞一個指向NMLVDISPINFO的指針。我認爲在處理通知時你會看到錯誤的結構。使用類嚮導生成在VS2013的事件處理程序提供了

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