获取鼠标单击MFC CListBox项的相对X/Y

获取鼠标单击MFC CListBox项的相对X/Y,mfc,Mfc,我有一个使用自定义绘图的CListBox,需要检测每个项目中的鼠标点击以执行操作 我可以听鼠标在主控件上的点击,然后将坐标转换到鼠标下项目的RECT的本地空间。但是,是否可以为单击单个列表项注册消息处理程序。。。有相关信息吗?我不确定我是否理解为什么需要在Clistbox的每个项目中使用XY坐标 反正, 好的,单个项目不是CWnd派生对象 您可以使用OnLButtonDown(或up)在控件中获取鼠标位置,它返回一个CPoint 之后,使用CListBox::GetItemRect获取当前选定项

我有一个使用自定义绘图的CListBox,需要检测每个项目中的鼠标点击以执行操作


我可以听鼠标在主控件上的点击,然后将坐标转换到鼠标下项目的RECT的本地空间。但是,是否可以为单击单个列表项注册消息处理程序。。。有相关信息吗?

我不确定我是否理解为什么需要在Clistbox的每个项目中使用XY坐标

反正, 好的,单个项目不是CWnd派生对象

您可以使用OnLButtonDown(或up)在控件中获取鼠标位置,它返回一个CPoint

之后,使用CListBox::GetItemRect获取当前选定项的rect,进行一些像素计算,您应该能够获取选定项的rect内的XY


最多。

您可以使用该消息找出单击了哪个项目。

您只需收听LBN\u SELCHANGE通知即可。这将在用户每次单击新项目时触发。但是,如果已选择的项目已被选中,则它将不会激活。这可能是个问题,也可能不是

除此之外,我非常确定您需要截取WM_LBUTTONUP消息并将它们转换到列表框的客户机空间

或者您可以只使用一个关闭了标题的单列CListCtrl(ListView)类(LVS_NOCOLUMNHEADER)。然后可以捕获NM_单击消息。就个人而言,我非常喜欢CListCtrl而不是CListBox。它有点复杂,但功能更强大:)


编辑:或者您可以尝试使用

使用DPtoLP功能将设备坐标转换为逻辑坐标。

>我不确定我是否理解为什么需要将XY坐标放在Clistbox的每个项目中?因为自定义项允许用户交互;我们正在模拟MFC支持控件作为列表项时的情况。LVM消息用于列表视图或CListCtrl类。