从不通知 CListCtrl 的 CHeaderCtrl 的 HDN_TRACK 消息

Never notify HDN_TRACK message of CListCtrl's CHeaderCtrl

我想捕获来自 listCtrl 的 header 的 HDN_TRACK 消息,但它从未收到通知。

我测试了 HDN_BEGINTRACKHDN_ENDTRACK,它们运行良好。

我还将消息映射的控制 ID 更改为 IDC_TEST_LIST0,没有区别 - 它仍然无法正常工作。

我搜索了很多论坛,但我找不到任何解决方案。

这是我的测试代码。


BEGIN_MESSAGE_MAP(CDlgTest, CDialogEx)
    //ON_NOTIFY(HDN_BEGINTRACK, 0, &CDlgTest::OnTrackListTest) // WORKING!!
    //ON_NOTIFY(HDN_ENDTRACK, 0, &CDlgTest::OnTrackListTest) // WORKING!!
    //ON_NOTIFY(HDN_TRACK, IDC_TEST_LIST, &CDlgTest::OnTrackListTest) // NOT WORKING
    ON_NOTIFY(HDN_TRACK, 0, &CDlgTest::OnTrackListTest)   // NOT WORKING
END_MESSAGE_MAP()


void CDlgTest::OnTrackListLog(NMHDR* pNMHDR, LRESULT* pResult)
{
    LPNMHEADER phdr = reinterpret_cast<LPNMHEADER>(pNMHDR);
    // TODO: Add your control notification handler code here

    AfxMessageBox(L"Hello!!!");     // >>>>>>>>>>> NOT showing up

    *pResult = 0;
}


class CDlgTest : public CDialogEx {
    
public:
    afx_msg void OnTrackListLog(NMHDR* pNMHDR, LRESULT* pResult);
}

我附上我访问过的一些论坛:

接下来我可以尝试什么?

首先尝试 HDN_TRACKAHDN_TRACKW 而不是 HDN_TRACK,看看这些是否有效。根据您的项目设置,通常 HDN_TRACK 被正确定义为两者之一,但最好同时尝试。

此外,在 i-net 和 found 上搜索了一下,具有 HDS_FULLDRAG 样式集的列表控件发送 HDN_ITEMCHANGING 而不是 HDN_TRACK 通知。这篇文章可以追溯到 2004 年!...

因此,您可以尝试删除该样式(如果您愿意),或者改为捕获 HDN_ITEMCHANGING 通知。如果以编程方式创建,则可以通过更改初始创建样式标志来设置或删除样式,如果它是使用对话框资源创建的,则可以通过更改资源文件(或使用 属性 编辑器),或者通过调用 [=创建后18=]/SetWindowLong().

这是 header 控件的奇怪行为,在 HDN_TRACK and HDS_FULLDRAG @Constantine

也发布了

您必须从 OnInitDialog 中的 header 控件中删除 HDS_FULLDRAG 样式:

m_list.GetHeaderCtrl()->ModifyStyle(HDS_FULLDRAG, 0);

那么您应该会收到 HDN_TRACK 消息

void CDlgTest::OnTrack(NMHDR* pNMHDR, LRESULT* pResult)
{
    TRACE(L"OnTrack\n");
    *pResult = 0;
}

ON_NOTIFY(HDN_TRACK, 0, OnTrack)

但是你现在没有HDS_FULLDRAG风格!如果需要 HDS_FULLDRAG 标志,则不要在 OnInitDialog 中更改。相反,您可以 enable/disable HDS_FULLDRAG 响应 HDN_BEGINTRACK/HDN_ENDTRACK