windows是怎么知道消息应该发给谁的(200分)

  • 主题发起人 主题发起人 寻路
  • 开始时间 开始时间

寻路

Unregistered / Unconfirmed
GUEST, unregistred user!
比如我的界面上平均分布了20个控件,当鼠标移动到其中一个上面的时候,这个控件会触发对应的鼠标事件,请问,windows如何知道要发送鼠标消息到鼠标当前对应的控件上面,而不是别的控件呢?
 
每个控件都有一个handle, Windows消息根据它来确定消息的来源
 
李维的VCL中有介绍
 
帮忙顶……
 
1、消息的组成:一个消息由一个消息名称(UINT),和两个参数(WPARAM,LPARAM)。当用户进行了输入或是窗口的状态发生改变时系统都会发送消息到某一个窗口。例如当菜单转中之后会有WM_COMMAND消息发送,WPARAM的高字中(HIWORD(wParam))是命令的ID号,对菜单来讲就是菜单ID。当然用户也可以定义自己的消息名称,也可以利用自定义消息来发送通知和传送数据。

  2、谁将收到消息:一个消息必须由一个窗口接收。在窗口的过程(WNDPROC)中可以对消息进行分析,对自己感兴趣的消息进行处理。例如你希望对菜单选择进行处理那么你可以定义对WM_COMMAND进行处理的代码,如果希望在窗口中进行图形输出就必须对WM_PAINT进行处理。

  3、未处理的消息到那里去了:M$为窗口编写了默认的窗口过程,这个窗口过程将负责处理那些你不处理消息。正因为有了这个默认窗口过程我们才可以利用Windows的窗口进行开发而不必过多关注窗口各种消息的处理。例如窗口在被拖动时会有很多消息发送,而我们都可以不予理睬让系统自己去处理。

  4、窗口句柄:说到消息就不能不说窗口句柄,系统通过窗口句柄来在整个系统中唯一标识一个窗口,发送一个消息时必须指定一个窗口句柄表明该消息由那个窗口接收。而每个窗口都会有自己的窗口过程,所以用户的输入就会被正确的处理。例如有两个窗口共用一个窗口过程代码,你在窗口一上按下鼠标时消息就会通过窗口一的句柄被发送到窗口一而不是窗口二。
 
5、消息机制:系统将会维护一个或多个消息队列,所有产生的消息都回被放入或是插入队列中。系统会在队列中取出每一条消息,根据消息的接收句柄而将该消息发送给拥有该窗口的程序的消息循环。每一个运行的程序都有自己的消息循环,在循环中得到属于自己的消息并根据接收窗口的句柄调用相应的窗口过程。而在没有消息时消息循环就将控制权交给系统所以Windows可以同时进行多个任务。
 
确切的说
windows只负责把消息给应用程序的回调,具体的分发由应用程序管辖,就像邮局发信。
具体看李维的Inside VCL
 
查看TMessage的定义就是了
 
非常感谢各位的回答,但事实上问题并不是这么简单,大家说的,我跟大家一样,都了解了的内容.下面我来说说我真正需要知道的东西:
界面上有100个窗口(控件也是窗口),我的鼠标移动了一下,这时候,windows是怎么找到要触发鼠标移动消息的窗口的呢,我猜测一下(只考虑当前进程的主线程的消息队列):遍历所有窗口,根据窗口的left,top,width,height来判断当前鼠标是不是在此窗口当中,如果是,投放相关信息到对应的消息队列,生成一笔消息.
如果是这样,那么问题就来了:
1.遍历所有窗口,找到鼠标点在其区域之内的窗口,这样效率是不是太低了,windows是不是有更好的处理方法呢,毕竟上面只是我的理解.
2.如果windows是通过left,top,width,height来判断当前鼠标是不是在此窗口当中的,那么如果是不规则的窗口,是不是投放的消息队列会产生问题呢.比如,我有一个对象,是一根斜线,大家想想,它触发鼠标移动消息,应该是鼠标落在线条上面的时候,但是,我们通常做的是自己在WM_MOUSEMOVE里面去做判断,也就是说,其实WM_MOUSEMOVE已经触发了,windows还是按照对象的矩形区域来产生的WM_MOUSEMOVE消息,那么我们有没有更好的处理方式,就是说,改变对象的区域,让windows产生WM_MOUSEMOVE能够精确到我们想要的区域呢.

也不知道大家理解了没有,姑且说之!
 
后退
顶部