• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

控件的WM_NOTIFY消息映射

发布: 2007-7-01 20:40 | 作者: admin | 来源: | 查看: 13次 | 进入软件测试论坛讨论

领测软件测试网

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


延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备2023014753号-2
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网