当前位置:C++技术网 > 精选软件 > 图解子窗口控件和父窗口是如何通信的:2 父窗口向子窗口控件发送消息

图解子窗口控件和父窗口是如何通信的:2 父窗口向子窗口控件发送消息

更新时间:2016-02-03 22:41:26浏览次数:1+次

    在文章《图解子窗口控件和父窗口是如何通信的1:子窗口控件向父窗口发送消息》中,我们已经介绍了子窗口控件如何向父窗口发送消息以及相关的背景知识。
    当子窗口控件向父窗口发送了WM_COMMAND消息之后,父窗口就可以知道其子窗口的动态。是哪个子窗口控件发生了事情,发生了什么事情,子窗口控件窗口句柄是什么,就都在WM_COMMAND消息的参数中了。
    接下来,就该父窗口做出响应了。那么父窗口是如何响应的呢?请听我详细道来。
    先上图:

   
        【父窗口与子窗口控件的通信方法】
    图中有一个大箭头,由父窗口指向各种按钮控件,表示由父窗口向子窗口发送的各种消息流。而在这个消息流中,各种消息错综复杂。而子窗口控件向父窗口发送消息则只有一个WM_COMMAND消息,就非常简单明了。父窗口发送给子窗口控件的消息不仅有WM_开头的标准消息,还会有各种控件单独定制的消息。
    为什么会这样呢?因为子窗口控件是用系统窗口类创建的,所以,内部的消息处理都是系统定制好了的。所以,无法给你提供个性化的消息,所以提供统一的WM_COMMAND消息。而不同的情形,就用参数来分辨。
    到了父窗口这边,则是由程序员来把控。所以,就可以放开心来让程序员来处理。所以,父窗口可以给子窗口控件提供各种消息类型,可以方便的处理。
    因为子窗口控件也是一种窗口,所以标准的消息是可以的有用的。控件内部的窗口过程都会对标准的消息做标准的处理。同时,因为各种控件都为各种特定的应用场景创造的,所以,就提供了定制的消息。如按钮的BM_开头的消息、滚动条的SM_开头的消息等。
    最原始的标准消息都是WM_开头的。如果不是公共控件,则只有标准消息。当然,如果增加了各种窗口功能,如对话框、控件,就对标准窗口的扩展,就需要有额外的消息方便处理。扩展之后,标准的窗口自然是不能满足的,所以就定制了很多不同的消息。
    有了这些消息,就大大方便功能实现。比如BM_CLICK,按钮控件接受到这个消息之后,就马上知道了自己被单击了。然后按钮控件就马上给父窗口发送WM_COMMAND消息。
    如果没有这个特别定制的消息,而使用通用的消息,则需要携带各种参数来区分,这样也就让编程变得麻烦。
    我们在图中标注的“特别消息”,就是为这些控件定制的特别消息。我在图中用箭头标向了对应的控件类型。通过控件特别定制的缩写,第一个字母代表控件类型,第二个字母一般是M,代码Message消息,有个别的如LB_XXX,则用了LB缩写,没有用M字母。不过熟悉之后,也没有关系了。这一段只是为了促使理解而已。
    明白了这两种消息类型,也就让你可以在用这些消息的时候,更加清晰明了,不会在有任何迷糊,底气十足。当然,具体的控件消息使用和相关分析,我会在后面的详细分析的。