CListCtrl--NM_CLICK
void CCListCtrlDlg::OnNMClickList4(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
//NM_CLICK 这个是鼠标左键点击CListCtrl控件客户区时激发的消息
int han = pNMItemActivate->iItem; //获取行号
str.Format(_T("han=%d\r\n"), han);
OutputDebugString(str);
*pResult = 0;
}
我的问题:int han = pNMItemActivate->iItem; //获取行号 只有单击第0列的行头才有效 其它都返回-1 根据您提供的信息,可以确定iItem的值只有在单击行头时有效。如果要获得在CListCtrl控件中单击的子项的行和列的编号,可以使用以下代码:
int nRow, nCol;
CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST4); // IDC_LIST4 是 CListCtrl 控件的 ID。
CPoint ptClicked = pNMItemActivate->ptAction; // 获取鼠标单击位置
pListCtrl->ScreenToClient(&ptClicked); // 将客户端坐标转换为屏幕坐标
nRow = pListCtrl->HitTest(ptClicked); // 获取鼠标位置所在的行
nCol = pNMItemActivate->iSubItem; // 获取鼠标位置所在的列
请注意,HitTest函数将返回与给定点最接近的子项的行号,如果没有找到则返回-1。 您可以尝试使用 GetFirstSelectedItemPosition 和 GetNextSelectedItem 方法来获取选中项目的位置。下面是一个示例代码:
void CCListCtrlDlg::OnNMClickList4(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// 获取选中项目的位置
POSITION pos = m_list.GetFirstSelectedItemPosition();
// 如果有选中项目,获取项目的行号并输出
if (pos != NULL)
{
int nItem = m_list.GetNextSelectedItem(pos);
str.Format(_T("han=%d\r\n"), nItem);
OutputDebugString(str);
}
*pResult = 0;
}
这里 m_list 是您的 CListCtrl 对象。 感谢二楼 但是我在学习 NM_CLICK消息 感谢三楼 但是我在学习pNMItemActivate 的属性 OK了需要LVS_EX_FULLROWSELECT
页:
[1]