控件的WM_NOTIFY消息映射

类别:VC语言 点击:0 评论:0 推荐:

前几天,我尝试在CListCtrl中映射HDN_BEGINTRACK这个WM_NOTIFY消息。

轻松的用ClassWizard建立了消息映射,几秒中完成了所有工作之后发生的事情却让我很长时间轻松不起来了。

消息根本映射不上!!

BEGIN_MESSAGE_MAP(CPrevList, CListCtrl)
 //{{AFX_MSG_MAP(CPrevList)
 ON_NOTIFY_REFLECT(HDN_BEGINTRACK, OnBegintrack)
  //}}AFX_MSG_MAP
END_MESSAGE_MAP()

void CPrevList::OnBegintrack(NMHDR* pNMHDR, LRESULT* pResult)
{
 HD_NOTIFY *phdn = (HD_NOTIFY *) pNMHDR;
 // TODO: Add your control notification handler code here
 AfxMessageBox("总算映射上了!");//程序始终执行不到这个位置
 *pResult = 0;
}

此后我在这个问题上苦恼了很久,最后发现了两种解决办法

1,对消息映射两次,分别是XXXXW和XXXXA

BEGIN_MESSAGE_MAP(CPrevList, CListCtrl)
//{{AFX_MSG_MAP(CAdvHeaderCtrl)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
ON_NOTIFY_REFLECT(HDN_BEGINTRACKW, OnBeginTrack)
ON_NOTIFY_REFLECT(HDN_BEGINTRACKA, OnBeginTrack)
END_MESSAGE_MAP()

2,重载CWnd::OnNotify虚函数在其中对XXXXW和XXXXA分别处理

BOOL CPrevList::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
 switch (((NMHDR*)lParam)->code)
 {
 case HDN_BEGINTRACKW:
 case HDN_BEGINTRACKA:

   AfxMessageBox("终于映射上了");

  }

  return CListCtrl::OnNotify(wParam, lParam, pResult);
}

反观问题的产生完全是操作系统惹的祸,我的操作系统是WIN2K(VC6无SP)

WIN2K使用Wide Char,就是常说的UNICODE,在WIN2K下消息对应着WM_XXXXW

而早期WIN9X使用ASCII,消息为WM_XXXXA。

要想使用某些控件的WM_NOTIFY消息就必须自己做类似上面的处理……

本文地址:http://com.8s8s.com/it/it2854.htm