Winapi 当用户在控件上单击鼠标按钮时,消息如何到达该控件?

Winapi 当用户在控件上单击鼠标按钮时,消息如何到达该控件?,winapi,Winapi,我是WINAPI的初学者,一直在尝试理解Windows消息传递系统 虽然我了解到WinMain中的GetMessage函数接收发送到程序的所有消息,但我无法理解API如何将消息发送到用户单击的控件(比如按钮)?我已经浏览了大量页面,无法找到消息的确切顺序,从应用程序线程的消息队列到按钮控件 我希望这个问题不是太“愚蠢”,不值得回答。相信我,我已经浏览了很多网页,包括MSDN,但我没有找到一个简单的答案。如果有人能给我指出正确的方向,我将不胜感激。当鼠标事件发生时,Windows会搜索桌面上的所有

我是WINAPI的初学者,一直在尝试理解Windows消息传递系统

虽然我了解到WinMain中的GetMessage函数接收发送到程序的所有消息,但我无法理解API如何将消息发送到用户单击的控件(比如按钮)?我已经浏览了大量页面,无法找到消息的确切顺序,从应用程序线程的消息队列到按钮控件


我希望这个问题不是太“愚蠢”,不值得回答。相信我,我已经浏览了很多网页,包括MSDN,但我没有找到一个简单的答案。如果有人能给我指出正确的方向,我将不胜感激。

当鼠标事件发生时,Windows会搜索桌面上的所有窗口,以找到当前光标下的窗口。如果光标下有多个重叠窗口,它将拾取最上面的窗口。子窗口通常位于其父窗口的顶部,因此此搜索首选子窗口而不是其父窗口。Windows然后将鼠标事件消息发布到找到的窗口的消息队列中

创建窗口的程序应该在创建窗口的线程中运行某种消息循环。此循环通常调用
GetMessage
,将消息逐个从队列中拉出。这些消息依次传递到
DispatchMessage
,后者查看消息,找出应该发送到哪个窗口。然后,它通过调用窗口过程将消息传递给窗口

因此,当您单击一个按钮控件时,鼠标事件被分派到该控件的windows过程。控件的父窗口不会被通知,至少不会直接通知。该按钮将生成大量消息,其中一些发送给自身,一些发送给其父级。值得注意的是,它将发送一条
WM_命令
消息,让其父级知道其已被单击

单击顶级对话框中的按钮时发生的特定消息序列如下所示:

  • WM_LBUTTONDOWN
    :当鼠标单击按钮时,Windows将其张贴到按钮上。
    • BM_SETSTATE
      :由按钮发送,告知自身在按下状态下绘制自身。这样子类控件就有机会自己绘制图形。
      • WM_CTLCOLORBTN
        :通过按钮发送给其父级,以确定应使用何种画笔绘制,然后忽略该画笔。但是,此消息允许父级在绘制消息之前更改消息的文本
  • WM_LBUTTONUP
    :释放鼠标按钮时,Windows将其张贴到按钮上。
    • BM_SETSTATE
      :由按钮发送,告知自身在未按下状态下绘制自身。
      • WM_CTLCOLORBTN
        :如前所述发送并忽略
    • WM_CAPTURECHANGED
      :由Windows发送到按钮,告知其不再捕获鼠标。按钮在接收到鼠标按钮按下消息时捕获鼠标,因此即使指针不再位于按钮上方,也会收到释放按钮的通知
    • WM_命令
      :发送给父级,通知其已单击按钮

缩进指示响应消息发送消息的位置。已发布的消息在被分派到处理它们的窗口过程之前,先经过消息队列。已发送的消息将直接发送到windows过程,该过程无需经过队列即可处理这些消息。

当鼠标事件发生时,windows将搜索桌面上的所有窗口,以查找当前位于光标下的窗口。如果光标下有多个重叠窗口,它将拾取最上面的窗口。子窗口通常位于其父窗口的顶部,因此此搜索首选子窗口而不是其父窗口。Windows然后将鼠标事件消息发布到找到的窗口的消息队列中

创建窗口的程序应该在创建窗口的线程中运行某种消息循环。此循环通常调用
GetMessage
,将消息逐个从队列中拉出。这些消息依次传递到
DispatchMessage
,后者查看消息,找出应该发送到哪个窗口。然后,它通过调用窗口过程将消息传递给窗口

因此,当您单击一个按钮控件时,鼠标事件被分派到该控件的windows过程。控件的父窗口不会被通知,至少不会直接通知。该按钮将生成大量消息,其中一些发送给自身,一些发送给其父级。值得注意的是,它将发送一条
WM_命令
消息,让其父级知道其已被单击

单击顶级对话框中的按钮时发生的特定消息序列如下所示:

  • WM_LBUTTONDOWN
    :当鼠标单击按钮时,Windows将其张贴到按钮上。
    • BM_SETSTATE
      :由按钮发送,告知自身在按下状态下绘制自身。这样子类控件就有机会自己绘制图形。
      • WM_CTLCOLORBTN
        :通过按钮发送给其父级,以确定应使用何种画笔绘制,然后忽略该画笔。但是,此消息允许父级在绘制消息之前更改消息的文本
  • WM_LBUTTONUP
    :释放鼠标按钮时,Windows将其张贴到按钮上。
    • BM_SETSTATE
      :由按钮发送,告知自身在未按下状态下绘制自身。
      • WM\u C