1

我有一个用 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 将此代码放入您的代码中,但此通知永远不会到达您的列表控件的父级。是这样吗?

最好的方法是什么?我更喜欢右键单击,但如有必要,左键单击会这样做。

4

2 回答 2

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 类型。

于 2012-06-13T21:27:58.803 回答
0

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

于 2012-06-13T12:43:15.313 回答