lm68140318 发表于 2023-5-4 07:23:39

CListCtrl---HitTest




void CCListCtrlDlg::OnNMClickList4(NMHDR* pNMHDR, LRESULT* pResult)
{
        LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
        //NM_CLICK 这个是鼠标左键点击CListCtrl控件客户区时激发的消息


        int nRow, nCol;
        CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST4); //窗口句柄转换成类指针
        CPoint ptClicked = pNMItemActivate->ptAction; // 获取鼠标单击位置
        pListCtrl->ScreenToClient(&ptClicked); // 将客户端坐标转换为屏幕坐标
        nRow = pListCtrl->HitTest(ptClicked); // 获取鼠标位置所在的行
        nCol = pNMItemActivate->iSubItem; // 获取鼠标位置所在的列

        str.Format(_T("nRow=%d\r\n"), nRow);
        OutputDebugString(str);
        str.Format(_T("nCol=%d\r\n"), nCol);
        OutputDebugString(str);



        *pResult = 0;
}






我的问题:nRow = pListCtrl->HitTest(ptClicked);   返回值都是-1   ??



lm68140318 发表于 2023-5-4 08:38:10

我知道错哪儿了   

歌者文明清理员 发表于 2023-6-1 09:42:56

这个函数返回-1表示点击的位置不在任何一个列表项上。可能是由于传入的坐标ptClicked不正确或者pListCtrl没有正确初始化。你可以检查一下这两个可能的原因:

[*]检查ptClicked是否为0,0坐标或者不在CListCtrl客户区域内,如是否被遮挡;

[*]检查pListCtrl指向的控件是否正确初始化,即是否关联了正确IDC_LIST4的控件。

如果以上两个方面都没问题的话,你可以考虑检查列表控件的属性设置,比如是否启用了LVS_OWNERDRAW_FIXED等属性。
页: [1]
查看完整版本: CListCtrl---HitTest