1

我正在编写一个 MFC 应用程序,其中我在报表视图中有一个带有多个 CListCtrls 的对话框。我希望其中一个是可排序的。所以我处理了 HDM_ITEMCLICK 事件,一切正常……除了如果我单击另一个 CListCtrl 的标题,它确实对 OTHER CListCtrl 进行排序,这看起来有点愚蠢。

这显然是由于标头的 ID 为 0,这使得消息映射中的条目如下所示:

ON_NOTIFY(HDN_ITEMCLICK, 0, &Ccreationprogramme::OnHdnItemclickList5)

但是由于所有标题的 id 都为零,显然我的对话框的每个标题都会发送消息。

有没有解决这个问题的简单方法?

编辑:也许我不清楚,但我确实检查了 NMHDR 结构内的值。HwndFrom 指针根据单击的标题而有所不同,这对我没有多大帮助,因为它的值在每个运行时明显不同。由于我上面解释的原因,idFrom 值为 0,因为这是每个标头的 id。谢谢

EDIT2:hwnd 指针值也不对应于 CListCtrl,可能是因为它完全来自不同的对象。

4

3 回答 3

3

好的,我找到了一个解决方案,虽然我觉得它有点脏,但它可以工作,所以我会发布它以供将来参考。

可以通过CListCtrl 的GetHeaderCtrl 成员函数获取Header。然后,您可以通过 m_hWnd 获取它的处理程序。因此,您要做的就是测试该处理程序是否与 NMHDR 结构中的处理程序相同,因此代码如下所示:

void Ccreationprogramme::OnHdnItemclickList5(NMHDR *pNMHDR, LRESULT *pResult)
{  
  if (pNMHDR->hwndFrom == LC_gen_schedules.GetHeaderCtrl()->mhWnd)
  {
    // Code goes here
  }
    *pResult = 0;
}

谢谢大家的帮助

于 2010-04-08T16:55:49.287 回答
3

检查 NMHDR 结构的值。
http://msdn.microsoft.com/en-us/library/bb775514%28VS.85%29.aspx

于 2010-04-08T16:11:48.673 回答
2

传递给您的LPARAM消息处理程序实际上是一个指向结构的指针,该NMHEADER结构包含一个NMHDR结构,该结构又包含HWND发送消息的控件的控件 ID。您可以将其与列表控件进行比较,HWND以确定单击了哪个窗口的标题控件。

或者,您可以从 CListCtrl 派生一个类并将 HDN_ITEMCLICK 消息反映回列表控件。这样,每个列表控件对象都会处理自己的标头通知。

于 2010-04-08T16:10:11.247 回答