从不通知 CListCtrl 的 CHeaderCtrl 的 HDN_TRACK 消息
Never notify HDN_TRACK message of CListCtrl's CHeaderCtrl
我想捕获来自 listCtrl 的 header 的 HDN_TRACK
消息,但它从未收到通知。
我测试了 HDN_BEGINTRACK
和 HDN_ENDTRACK
,它们运行良好。
我还将消息映射的控制 ID 更改为 IDC_TEST_LIST
和 0
,没有区别 - 它仍然无法正常工作。
我搜索了很多论坛,但我找不到任何解决方案。
这是我的测试代码。
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);
}
我附上我访问过的一些论坛:
- https://forums.codeguru.com/showthread.php?314900-HOW-detect-the-column-is-resize-in-CListCtrl
- http://rsdn.org/forum/mfc/1081554.all
接下来我可以尝试什么?
首先尝试 HDN_TRACKA
或 HDN_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
我想捕获来自 listCtrl 的 header 的 HDN_TRACK
消息,但它从未收到通知。
我测试了 HDN_BEGINTRACK
和 HDN_ENDTRACK
,它们运行良好。
我还将消息映射的控制 ID 更改为 IDC_TEST_LIST
和 0
,没有区别 - 它仍然无法正常工作。
我搜索了很多论坛,但我找不到任何解决方案。
这是我的测试代码。
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);
}
我附上我访问过的一些论坛:
- https://forums.codeguru.com/showthread.php?314900-HOW-detect-the-column-is-resize-in-CListCtrl
- http://rsdn.org/forum/mfc/1081554.all
接下来我可以尝试什么?
首先尝试 HDN_TRACKA
或 HDN_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