MFC CListCtrl中右键单击标题(MFC CListCtrl Right Click On

2019-09-26 11:10发布

我有一个MFC应用程序写在Visual Studio 6中,我加入了一些新功能。 我希望能够做的是显示上下文菜单,当用户上的属性页中的列表控件标题栏右侧点击。 中加入的CListCtrl类查看类向导。

通过类向导的属性页,我添加了一个处理程序上的listctrl点击右键。 这不被调用,并添加以下代码摸出如果R单击置于标题部分,如果是的话,其标题项目。 像这样

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消息。 这是在类向导全部完成,所以我希望能够在这里处理此通知。 然而,从我迄今的研究,有可能是在MFC中的臭虫类向导把这个代码到你对你的代码,但这个通知将永远是多远的列表控件的父。 这样的话?

什么是做到这一点的最好方法是什么? 我宁愿上点击右键,但左击,如果必要会做。

Answer 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处理在派生类和弹出菜单。 您将收到的点击位置口岸系统类型。



Answer 2:

我设法排序了这一点,我想我会用同样的问题,在此添加万一别人绊倒了答案。 我最初发布的代码是好的,但它需要从CListCtrl的派生类的OnNotify处理程序中去。 类向导允许您将反映处理程序添加到列表控件的父,但该消息从未得到那么远。



文章来源: MFC CListCtrl Right Click On Header
标签: mfc clistctrl