您的代码是一个处理CListCtrl控件单击事件的函数。从您的描述中,我了解到您遇到的问题是新状态(new state)和旧状态(old state)的返回值都是0,而您期望当单击后,新状态应该有一个选中状态。
首先,请确保您的CListCtrl控件已经设置了单选模式和整行选择模式。您可以在对话框的OnInitDialog()方法中添加以下代码来设置这些模式:m_listCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_ONECLICKACTIVATE);
其中,m_listCtrl是CListCtrl控件的对象。这样设置后,当您单击某一行时,整行都将被选中。
然后,在处理单击事件的函数中,您需要使用GetItemState方法来获取新状态(new state)和旧状态(old state)。NMITEMACTIVATE结构体中的uNewState和uOldState成员主要用于响应其他类型的通知消息,如LVN_ITEMCHANGED。在处理NM_CLICK消息时,您可以使用以下代码来获取新状态和旧状态:UINT ns = m_listCtrl.GetItemState(han, LVIS_SELECTED);
str.Format(_T("新状态ns=%d\r\n"), ns);
OutputDebugString(str);
UINT olds = m_listCtrl.GetItemState(han, LVIS_SELECTED) ? 0 : LVIS_SELECTED;
str.Format(_T("老状态olds=%d\r\n"), olds);
OutputDebugString(str);
这里,m_listCtrl是CListCtrl控件的对象。GetItemState方法需要两个参数:项的索引(index)和状态掩码(state mask)。在这个例子中,我们使用LVIS_SELECTED作为状态掩码,表示我们只关心选中状态。
上面的代码将获取新状态和旧状态,并将它们的值分别输出到调试窗口。请尝试使用这些修改后的代码,看看是否能解决您遇到的问题。 |