MFC CListCtrl右键单击标题

时间:2012-06-12 15:03:08

标签: mfc clistctrl

我有一个用Visual Studio 6编写的MFC应用程序,我正在添加一些新功能。我想要做的是当用户右键单击属性页面中列表控件上的标题列时显示上下文菜单。添加了CListCtrl类,查看了类向导。

通过属性页面的ClassWizard,我在listctrl上右键单击添加了一个处理程序。这会被调用,我添加了以下代码,以确定rclick是否在标题部分以及如果是哪个标题项。喜欢这个

POINT Point;
GetCursorPos (&Point);
ScreenToClient(&Point);

HDHITTESTINFO HitTest;

//Offset of right scrolling  
HitTest.pt.x = Point.x+ m_ctrlRecordList.GetScrollPos(SB_HORZ); //Offset of right scrolling
HitTest.pt.y = Point.y;

//Send the Hit Test Message
m_ctrlRecordList.GetHeaderCtrl()->SendMessage(HDM_HITTEST,0,(LPARAM)&HitTest);

    // Check hit test result.

*pResult = 0;

然而,命中测试总是返回-1。

我只是在左键单击时尝试通过处理属性页中标题控件的HDN_ItemClick消息。这一切都在ClassWizard中完成,所以我希望能够在这里处理这个通知。但是,根据我到目前为止所研究的内容,MFC中可能存在一个错误,其中ClassWizard将此代码放入您的代码中,但此通知永远不会达到列表控件的父级。是这种情况吗?

最好的方法是什么?我希望点击右键,但如果有必要,可以点击左键。

2 个答案:

答案 0 :(得分:1)

您无法尝试在对话框中处理列表标题中的消息,也无法在CListCtrl派生类中执行此操作。

MFC正在对某些控件使用消息反射,仅针对某些消息/通知代码。

很可能你是在列表控件上传递鼠标点击的坐标,因此命中测试失败。 试试这个:

添加从CHeaderCtrl派生的类。在对话框中声明派生类的成员变量。 我假设你已经有子类(由向导插入变量)列表控件。 在 OnInitDialog 中编写以下内容:

// m_List is the dialog’s member of the subclassed list control, 
// m_header is a member variable of your new header class:
// insert this code after list control is already 
// initialized and all columns are added.
CHeaderCtrl* pHeaeder = m_List.GetHeaderCtrl();

m_Header.SubclassWindow(pHeaeder->m_hWnd);

在派生类和弹出菜单中插入WM_CONTEXTMENU或WM_LBUTTONUP的处理程序。您将收到点击位置的CPoint类型。

答案 1 :(得分:0)

我已经设法解决了这个问题并且认为我会添加答案以防其他人因为同样的问题而偶然发现这个问题。我最初发布的代码很好,但它需要进入从CListCtrl派生的类的OnNotify处理程序。 ClassWizard允许您向列表控件的父级添加一个反射处理程序,但消息永远不会那么远。