MFC CLISTCRL右键单击标题

MFC CLISTCRL右键单击标题,mfc,clistctrl,Mfc,Clistctrl,我有一个用VisualStudio6编写的MFC应用程序,我正在为它添加一些新功能。我希望能够在用户右键单击属性页中列表控件的标题列时显示上下文菜单。CListCtrl类已添加到查看类向导中 通过属性页的ClassWizard,我为右键单击listctrl添加了一个处理程序。这确实会被调用,我添加了以下代码,以确定rclick是否在header部分上,如果是,则是哪个header项。像这样 POINT Point; GetCursorPos (&Point); ScreenToClien

我有一个用VisualStudio6编写的MFC应用程序,我正在为它添加一些新功能。我希望能够在用户右键单击属性页中列表控件的标题列时显示上下文菜单。CListCtrl类已添加到查看类向导中

通过属性页的ClassWizard,我为右键单击listctrl添加了一个处理程序。这确实会被调用,我添加了以下代码,以确定rclick是否在header部分上,如果是,则是哪个header项。像这样

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

我只是尝试通过处理属性页中header控件的HDN_ItemClick消息来单击鼠标左键。这都是在类向导中完成的,所以我希望能够在这里处理此通知。然而,根据我到目前为止的研究,MFC中可能存在一个bug,ClassWizard会将此代码放入您的代码中,但此通知永远不会到达列表控件的父控件。是这样吗


最好的方法是什么?我更喜欢右键单击,但如果有必要,左键单击就可以了。

我已经设法解决了这个问题,我想我会添加答案,以防其他人遇到同样的问题。我最初发布的代码是好的,但是需要进入来自CListCtrl的类的OnNotify处理程序。ClassWizard允许您向列表控件的父控件添加一个反射处理程序,但消息从来没有这么远。

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

您无法在对话框中尝试处理列表标题中的消息,也无法在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类型。

您无法在对话框中尝试处理来自列表标题的消息,也无法在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类型。

请尝试处理WM_CONTEXTMENU。似乎不是CListCtrl的选项。这似乎不是正确的做法。当然,有一种简单的方法可以检测某人右键单击列表控件的标题?请尝试处理WM_CONTEXTMENU。似乎不是CListCtrl的选项。这似乎不是正确的做法。当某人右键单击列表控件的标题时,肯定有一种简单的检测方法吗?