鼠标移动事件在MFC中的对话框的列表视图上

时间:2011-07-13 11:02:37

标签: c++ mfc

我创建了一个对话框。我在其上创建了两个列表视图。 我为列表视图创建了一个子类。 我想知道鼠标在哪里,我的意思是哪个列表视图。 之后,我将使用CListCtrl :: HitTest()找到列表视图的索引。

现在我使用HitTest获取索引,但鼠标移动对于列表视图都很常见。 所以我如何区分鼠标移动事件中的列表视图。

最后,我将根据列表视图和列表视图的索引创建工具提示。

2 个答案:

答案 0 :(得分:0)

CListCtrl继承了CWnd表单。您可以获得实现CWnd::OnMouseMove的鼠标指针坐标。您主要有两个选择:

  • 要么是CListCtrl的子类,要么在派生类
  • 中实现OnMouseMove
  • 在父窗口(对话框窗口)中实现OnMouseMove,并根据两个列表控件的坐标测试鼠标的坐标。

无论你选择什么解决方案,请记住OnMouseMove经常被调用,并且函数的实现必须非常轻,否则它将加载计算机资源,应用程序将会滞后。

HTH, JP。

答案 1 :(得分:0)

如果您真正想要的只是当鼠标悬停在您拥有的某个控制器上时显示工具提示,则无需通过命中测试,鼠标坐标等将您的手弄脏。只需使用Windows内置的机制。

假设您的对话框类是两个列表视图的父级:

  • 从对话框OnCreate()调用EnableToolTips()

  • 在消息映射中添加处理程序,例如:ON_NOTIFY_EX(TTN_NEEDTEXT, 0, OnTtnNeedText)

  • 在对话框类中实现OnTtnNeedText()。示例:

    BOOL CMyDialog::OnTtnNeedText(UINT id, NMHDR *pNMHDR, LRESULT *pResult)
    {    
        TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR;  
        pTTT->hinst = AfxGetResourceHandle();  
        switch ( pNMHDR->idFrom )  
        {
            case IDC_LV_LEFT:
                pTTT->lpszText = "I'm lefty!";
                break;
            case IDC_LV_RIGHT:
                pTTT->lpszText = "I'm righty!";
                break;
        }
        return TRUE;
    }
    

这或多或少都是如此。有关详细信息,请参阅此处:article