鱼C论坛

 找回密码
 立即注册
查看: 806|回复: 5

[已解决]CListCtrl--NM_CLICK

[复制链接]
发表于 2023-5-2 11:06:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

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

  5.         int han = pNMItemActivate->iItem; //获取行号

  6.         str.Format(_T("han=%d\r\n"), han);
  7.         OutputDebugString(str);




  8.         *pResult = 0;
  9. }
复制代码



我的问题:int han = pNMItemActivate->iItem; //获取行号       只有单击第0列的行头才有效   其它都返回-1
最佳答案
2023-5-2 11:07:53
根据您提供的信息,可以确定iItem的值只有在单击行头时有效。如果要获得在CListCtrl控件中单击的子项的行和列的编号,可以使用以下代码:
  1. int nRow, nCol;
  2. CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST4); // IDC_LIST4 是 CListCtrl 控件的 ID。
  3. CPoint ptClicked = pNMItemActivate->ptAction; // 获取鼠标单击位置
  4. pListCtrl->ScreenToClient(&ptClicked); // 将客户端坐标转换为屏幕坐标
  5. nRow = pListCtrl->HitTest(ptClicked); // 获取鼠标位置所在的行
  6. nCol = pNMItemActivate->iSubItem; // 获取鼠标位置所在的列
复制代码

请注意,HitTest函数将返回与给定点最接近的子项的行号,如果没有找到则返回-1。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-5-2 11:07:53 | 显示全部楼层    本楼为最佳答案   
根据您提供的信息,可以确定iItem的值只有在单击行头时有效。如果要获得在CListCtrl控件中单击的子项的行和列的编号,可以使用以下代码:
  1. int nRow, nCol;
  2. CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST4); // IDC_LIST4 是 CListCtrl 控件的 ID。
  3. CPoint ptClicked = pNMItemActivate->ptAction; // 获取鼠标单击位置
  4. pListCtrl->ScreenToClient(&ptClicked); // 将客户端坐标转换为屏幕坐标
  5. nRow = pListCtrl->HitTest(ptClicked); // 获取鼠标位置所在的行
  6. nCol = pNMItemActivate->iSubItem; // 获取鼠标位置所在的列
复制代码

请注意,HitTest函数将返回与给定点最接近的子项的行号,如果没有找到则返回-1。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

匿名鱼油
匿名鱼油  发表于 2023-5-2 11:08:01
您可以尝试使用 GetFirstSelectedItemPosition 和 GetNextSelectedItem 方法来获取选中项目的位置。下面是一个示例代码:

  1. void CCListCtrlDlg::OnNMClickList4(NMHDR* pNMHDR, LRESULT* pResult)
  2. {
  3.     LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);

  4.     // 获取选中项目的位置
  5.     POSITION pos = m_list.GetFirstSelectedItemPosition();

  6.     // 如果有选中项目,获取项目的行号并输出
  7.     if (pos != NULL)
  8.     {
  9.         int nItem = m_list.GetNextSelectedItem(pos);
  10.         str.Format(_T("han=%d\r\n"), nItem);
  11.         OutputDebugString(str);
  12.     }

  13.     *pResult = 0;
  14. }
复制代码


这里 m_list 是您的 CListCtrl 对象。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-2 11:09:45 | 显示全部楼层
感谢二楼   但是我在学习 NM_CLICK  消息
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-2 11:11:53 | 显示全部楼层
感谢三楼   但是我在学习pNMItemActivate 的属性
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-2 11:15:23 | 显示全部楼层
OK了  需要  LVS_EX_FULLROWSELECT
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-12 23:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表