我尝试在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) //消息是调整窗口的List控件头的宽度等等
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("终于映射上了");
}
WIN2K使用Wide Char,就是常说的UNICODE,在WIN2K下消息对应着WM_XXXXW
而早期WIN9X使用ASCII,消息为WM_XXXXA。
要想使用某些控件的WM_NOTIFY消息就必须自己做类似上面的处理……

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/123664.html