现象:listctrl控件中,当点击第一列时为0,点击其他列时为-1。
代码如下:
void MyView::OnNMClickList(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast(pNMHDR);
int r = pNMItemActivate->iSubItem;
int t = pNMItemActivate->iItem;
*pResult = 0;
}
原因:lParam的iItem成员仅在图标有效时才有效或单击第一列标签。要确定在一行中的其他位置发生单击时选择了哪个项目,请发送LVM_SUBITEMHITTEST消息。
解决方法1:
if (t < 0)
{
LVHITTESTINFO tHitTest;
tHitTest.pt = pNMItemActivate->ptAction;
// This assumes that MyView is the list view for which the message is processed.
// If not, you have to send the message to the list using it’s member variable
// or ::SendMessage passing it’s HWND
t = SendMessage(LVM_SUBITEMHITTEST, 0, reinterpret_cast(&tHitTest));
}
解决方法2:
通过设置listctrl列表控件的扩展控件样式,通过响应NM_CLICK消息函数。
ON_NOTIFY(NM_CLICK, IDC_LIST_ROLE, &CCtrlListDlg::OnClickList)
在初始化或者设置listctrl前,加入如下代码,设置控件扩展样式。
m_listctrl.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
void CCtrlListDlg::OnClickList(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast(pNMHDR);
CTemplate* pTemplate = CTemplate::getInstance();
int nItem = pNMItemActivate->iItem;
int nSubItem = pNMItemActivate->iSubItem;
if (nSubItem == 3)
{
CString strName = m_listCtrlRole.GetItemText(nItem, 0);
m_listCtrlRole.DeleteItem(nItem);
}
*pResult = 0;
}