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

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

MFC ListCtrl ,可以使用 `SetItem` 函数来设置某一行的数据。为了在第二列显示图标,需要设置该列的 `iImage` 成员变量为图标的索引。具体步骤如下: 1. 创建一个包含图标的图像列表。 ```cpp CImageList m_imageList; m_imageList.Create(16, 16, ILC_COLOR, 2, 1); m_imageList.Add(AfxGetApp()->LoadIcon(IDI_ICON1)); m_imageList.Add(AfxGetApp()->LoadIcon(IDI_ICON2)); ``` 这里创建了一个 16x16 大小的图像列表,并向其添加了两个图标。 2. 将图像列表关联到 ListCtrl。 ```cpp m_listCtrl.SetImageList(&m_imageList, LVSIL_SMALL); ``` 这里将图像列表关联到 ListCtrl,并指定图像列表的类型为 `LVSIL_SMALL`。 3. 在某一行的第二列显示图标。 ```cpp LVITEM lvItem; lvItem.mask = LVIF_IMAGE; lvItem.iItem = 0; // 要设置的行号 lvItem.iSubItem = 1; // 要设置的列号 lvItem.iImage = 1; // 图标在图像列表的索引 m_listCtrl.SetItem(&lvItem); ``` 这里首先创建了一个 `LVITEM` 结构体,并将其 `mask` 成员变量设置为 `LVIF_IMAGE`,表示要设置该行的图标。然后将要设置的行号和列号分别设置为 `iItem` 和 `iSubItem` 成员变量。最后将图标在图像列表的索引设置为 `iImage` 成员变量,并调用 `SetItem` 函数来设置该行的数据。 完整的示例代码如下: ```cpp // 在 OnInitDialog 函数添加以下代码 BOOL CMyDialog::OnInitDialog() { CDialogEx::OnInitDialog(); // 创建图像列表 m_imageList.Create(16, 16, ILC_COLOR, 2, 1); m_imageList.Add(AfxGetApp()->LoadIcon(IDI_ICON1)); m_imageList.Add(AfxGetApp()->LoadIcon(IDI_ICON2)); // 关联图像列表到 ListCtrl m_listCtrl.SetImageList(&m_imageList, LVSIL_SMALL); // 在第一行第二列显示第二个图标 LVITEM lvItem; lvItem.mask = LVIF_IMAGE; lvItem.iItem = 0; lvItem.iSubItem = 1; lvItem.iImage = 1; m_listCtrl.SetItem(&lvItem); return TRUE; } ``` 这里在对话框的 OnInitDialog 函数创建了一个图像列表,并将其关联到 ListCtrl。然后在第一行第二列显示了第二个图标。你可以根据需要修改行号、列号和图标索引。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值