lm68140318 发表于 2023-5-2 11:06:45

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

陶远航 发表于 2023-5-2 11:07:53

根据您提供的信息,可以确定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。

Anonymous 发表于 2023-5-2 11:08:01

您可以尝试使用 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 对象。

lm68140318 发表于 2023-5-2 11:09:45

感谢二楼   但是我在学习 NM_CLICK消息

lm68140318 发表于 2023-5-2 11:11:53

感谢三楼   但是我在学习pNMItemActivate 的属性

lm68140318 发表于 2023-5-2 11:15:23

OK了需要LVS_EX_FULLROWSELECT
页: [1]
查看完整版本: CListCtrl--NM_CLICK