CListCtrl,CListView与LVN
CListCtrl,CListView与LVN_ITEMCHANGED消息
若要在CListCtrl中行发生改变时得到通知,可以映射LVN_ITEMCHANGED消息。
ON_NOTIFY_REFLECT(LVN_ITEMCHANGED, OnItemchanged)
afx_msg void OnItemchanged(NMHDR* pNMHDR,LRESULT* pResult);
// 行选择改变
void CMyListCtrl::OnItemchanged(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
...您要进行的操作...
*pResult = 0;
}
注意,LVN_ITEMCHANGED消息的产生有以下几种可能:
1、由选中到没选中的变化;
2、由没选中到选中的变化;
3、由选中一行到选中另外一行的变化;
4、使用CListCtrl::SetItem函数更改了行;
如何检测LVN_ITEMCHANGED消息是由那一变化产生的呢?
NM_LISTVIEW结构成员变量uChanged和uNewState包含着这类信息,看如下代码:
void CRunListView::OnItemchanged(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if(pNMListView->uChanged == LVIF_STATE)
{
if(pNMListView->uNewState)
TRACE0("选择改变且有选中的行\r\n");
else
TRACE0("选择改变且没有选中的行\r\n");
}
else
TRACE0("行改变(CListCtrl::SetItem)\r\n");
*pResult = 0;
}