当前位置:C++技术网 > 精选软件 > Win32消息处理后必须返回0,窗口过程中必须有默认消息处理函数

Win32消息处理后必须返回0,窗口过程中必须有默认消息处理函数

更新时间:2015-12-06 14:58:21浏览次数:1+次

    在《Windows零基础入门:4.5 获取窗口类ID与注册窗口类返回的ID相互验证》因为我开始将窗口过程只写了一句话:
return 0;
    然后发现创建窗口失败了。所以,我们知道,最简写的窗口过程就是简单的调用一下默认窗口过程函数DefWindowProc即可。
    然而,我们可能还是会忽略一个细节-消息处理完最好返回0。这个到底是什么意思呢?
    通过查询MSDN我们得到了答案。你可以查看任何消息的解释,都会显示窗口过程的解释,然后表明,窗口过程返回值0表示程序已经自己处理了这个消息。这样系统就得知你已经处理了这个消息就不再做进一步的处理。而有些消息你可能并不关注,但是对于一个窗口的基本功能非常重要,比如双击标题栏最大化这些,都在默认处理里。而如果你全部返回0,则表示所有的消息你都处理了,而实际上,你又没有做任何处理,就导致系统也不给我们窗口做一些基础处理,最后窗口创建都会失败,或者其他功能不能正常使用,比如不能拖动窗口等。
    窗口的消息有很多,有的你还没有见过,而它却默默的在工作,没有它窗口不能正常使用,比如说WM_NCPAINT,如果你直接返回0,表示你已经处理过了。然而你并没有写功能代码,然后系统也不管了。所以最后显示出来的窗口是这样的:
    Win32消息处理完后必须返回0且窗口过程中必须有默认消息处理函数
    因为我在注册窗口类时背景画刷设置为了灰色,所以客户区是灰色的。而非客户区的标题栏、边框等都默认使用背景画刷刷了,而你有没有处理,系统也没有处理,就是这样的白色的。
    所以说,在一个消息真正被处理后,你才需要返回0,否则直接不处理,留给默认处理函数DefWindowProc来处理,这样就可以使用系统默认的处理了。因此,在编程中,请养好一个习惯,就是处理完消息后,请返回0。不管是在case后返回0,还是break后最后统一返回0,只要保证消息处理完后返回0就可以了。这个是一个规范的写法,一些消息忽略这个地方也不会有什么问题,有些消息则影响比较大,比如标题栏搞成全部是白色,连关闭按钮都没有的时候,还怎么好好玩耍了。
    以上是处理完消息要返回0,一定要是0而不是其他值,因为0代表的是你自己处理完了,是告诉系统你已经做了处理,不需要它再处理了。这样就直接从窗口过程函数回到了系统调用窗口过程函数的地方继续往下执行。
    如果你不处理的消息,你就不用管,但是你一定要交给DefWindowProc处理。也就是说,这个函数要在你不处理消息时处理消息,这个是窗口过程必备的,不要大意而忽略。有默认消息处理函数还不够,在你的消息处理逻辑中,所有没有处理的消息,都要进入默认消息处理函数处理,而不只是有这么一个函数就可以了。放错了位置和没有放差不多的效果。
    这两个是细节地方,也是容易被忽略的地方,我在自己写代码不看其他标准的格式的基础上写的,然后就发现这两个地方很容易就漏掉或者忽视了,从而带来了很多问题,还不容易被发现。所以就总结出来,供大家学习参考。
    至于窗口过程最后返回非0值代表什么意义,系统又是如何根据返回值做对应的处理,我暂时也不清楚。不过我研究清楚后再总结分享出来。如果你知道,请一定要告诉我哦,一起学习哈。