MFC CListCtrl 右键单击​​标题

Posted

技术标签:

【中文标题】MFC CListCtrl 右键单击​​标题【英文标题】:MFC CListCtrl Right Click On Header 【发布时间】:2012-06-12 15:03:07 【问题描述】:

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

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

【问题讨论】:

尝试处理 WM_CONTEXTMENU。 似乎不是 CListCtrl 的选项。似乎不是这样做的正确方法。肯定有一种简单的方法可以检测某人何时右键单击列表控件的标题? 【参考方案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 类型。

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于MFC CListCtrl 右键单击​​标题的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MFC CListCtrl 中实现“点击并按住”行为?

CListCtrl (MFC) 选择点击通过控制UNDERNEATH列表

使用 MFC 的 YouTube 下载器

如何处理 CListCtrl 中的属性键?

如何在 SDI 中使用 MFC CListCtrl

MFC 如何列表一选就选中整行(CListCtrl)