控件的WM_NOTIFY消息映射

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

控件的WM_NOTIFY消息映射

前几天,我尝试在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消息就必须自己做类似上面的处理……

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航