关于控件的消息有两种


  一种是由父窗口给控件发送的消息,即父窗口用于控制控件(这些控件是父窗口的子窗口),所以JamesJiang(欢乐英雄)   所说得是错误的,子窗口当然有接收消息的能力,“所有的消息都是只到达线程的消息队列”这个说法更是错误的,消息分为入队列消息和不入队列消息,他所说的只是入队列消息。而所有SendMessage发送的消息都是不入队列的,直接发送到窗口函数(即处理函数的地方),所有控件的窗口函数都是window本身自带的(分别放在comctl32.dll和user32.dll中,可能还有更多,当有消息发送到这些控件中,就会调用相应dll中的消息处理函数),这些不入队列的消息在run和PreTranslateMessage里根本是接收不到的,run里的getmessage只是从消息队列中去取一个消息,所以不能接收不入队列的消息。这些父窗口发给子窗口的控制消息我记得是不入队列的,具体你可以自己测试一下。  
   
  还有一类消息就是子窗口发给父窗口的notification消息,也就是现在在讨论的消息。这类消息其实也分两种,1类是原先win3.1系列就有有的控件,如edit,combo,list,button控件等,他发送的虽然是notification消息,但消息的形式是wm_command消息,比如单击按钮消息BN_CLICKED,其实父窗口接收的到是wm_command消息,不过其中WPARAM参数指出了是BN_CLICKED消息。第2类是通用控件消息,即后来的list-view,image   list,ip   address,tree   view,toolbar等等控件,他们发送到的都是notification消息。而无论哪类都是由sendmessage发送的,所以都是不入队列的,在run和pretranlatemessage根本接收不到的。  
   
  注:我上面所指的是控件消息,其他类型的消息不包括在内,控件是子窗口,他的notification消息只会发给父窗口进行处理(父窗口可以通过消息反射的技术把他返回给子窗口)。而mfc的消息传递机制其实是在消息队列中抓消息,并按一定的规则将他发送的相应的窗口函数进行处理,而这些控件消息(notification)根本不入消息队列,所以根本不会按mfc规定的路线进行,一般情况下就是父窗口处理了。  
   
  mfc的消息映射机制可参考《深入浅出MFC》,记住,消息映射的消息传递,发送,接收都无关,他只是简化了窗口函数的编写。  
   
  Chiun(灯芯草雀:沿途把那风景赏)   “消息的最终接受者依赖于事件发生的时间,地点亦可称为现场”的观点其实是说windows消息的接收者,当我们击键和进行鼠标操作的接收者是谁,这和window当前的窗口状态和位置有关,已不是问题所问的控件消息的问题了(大多数的windows消息是入队列的)。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值