listctrl中的iItem值返回-1的问题?

本文介绍了在Windows编程中,ListView控件在点击第一列时返回0,其他列返回-1的问题。问题的原因在于lParam的iItem成员在非第一列点击时不正确。解决方法包括发送LVM_SUBITEMHITTEST消息以获取正确的子项索引,或者通过设置扩展样式并响应NM_CLICK消息。示例代码提供了两种解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现象: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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值