小技巧:借助boost库实现Windows自定义消息的自动化定义

小技巧:借助boost库实现Windows自定义消息的自动化定义

作者:BlogUpdater |  时间:2017-07-17 |  浏览:716 |  评论已关闭 条评论

在开发Windows桌面程序,经常会碰到需要使用自定义消息来实现某种功能。通常我们会这样定义一个Windows消息:

#define	WM_CUSTOM_JOB_DONE	(WM_APP + 100)

这里,我们定义了一个自定义消息WM_CUSTOM_JOB_DONE,该消息用于通知指定的窗口工作已经完成。
有朋友可能会问了,为什么不是使用WM_USER呢?
我们先来看看WM_USER和WM_APP的区别:
WM_USER:Used to define private messages for use by private window classes.
WM_APP: Used to define private messages.

好像区别还是不明显。但是,MSDN中有这样一句话:
Message numbers in the second range (WM_USER through 0x7FFF) can be defined and used by an application to send messages within a private window class. These values cannot be used to define messages that are meaningful throughout an application because some predefined window classes already define values in this range.For example, predefined control classes such as BUTTON, EDIT, LISTBOX, and COMBOBOX may use these values.
也即,虽然可以使用WM_USER定义消息,但是只能用于私有的窗口,而不可以使用它在整个应用程序范围下定义具有明确含义(比如系统已经预定义的)的消息。因为一些系统控件会使用它定义它们需要的一些消息。

而WM_APP呢,此消息就是用来区分应用程序消息和系统消息的,使用WM_APP可以确保定义的消息不会和系统消息冲突。所以,以上的WM_CUSTOM_JOB_DONE定义中,我们使用了WM_APP。

接下来,第二个问题:我们可能会定义很多自定义消息,比如:

#define	WM_CUSTOM_JOB_DONE         (WM_APP + 100)
#define	WM_CUSTOM_EVENT_BEGIN      (WM_APP + 101)
#define	WM_CUSTOM_EVENT_END        (WM_APP + 102)
#define	WM_CUSTOM_ERROR_OCCUR      (WM_APP + 103)
#define	WM_CUSTOM_READ_FAILED      (WM_APP + 104)

我们需要手动的对新定义消息自增1,有没有一种自动化的方法呢?有!

感谢强大的boost preprocessor库为我们提供了一个自增宏BOOST_PP_COUNTER。我们可以像如下的方式将消息定义自动化起来:

#include "counter_include.hpp"

#define	MSG_CUSTOM_BASE	(WM_APP + 100)

#include BOOST_PP_UPDATE_COUNTER()
const UINT WM_CUSTOM_JOB_DONE = (MSG_CUSTOM_BASE + BOOST_PP_COUNTER);

#include BOOST_PP_UPDATE_COUNTER()
const WM_CUSTOM_EVENT_BEGIN = (MSG_CUSTOM_BASE + BOOST_PP_COUNTER);

#include BOOST_PP_UPDATE_COUNTER()
const WM_CUSTOM_EVENT_END = (MSG_CUSTOM_BASE + BOOST_PP_COUNTER);

#include BOOST_PP_UPDATE_COUNTER()
const WM_CUSTOM_ERROR_OCCUR = (MSG_CUSTOM_BASE + BOOST_PP_COUNTER);

#include BOOST_PP_UPDATE_COUNTER()
const WM_CUSTOM_READ_FAILED = (MSG_CUSTOM_BASE + BOOST_PP_COUNTER);

这样,我们每次新增一个新消息,只需要复制2行,然后修改消息名称就可以了,不再需要对每个消息手动自增1了。
另外请注意,使用以上方法定义消息,需要添加对boost库的counter_include.hpp头文件的引用。

再次感谢boost!终于可以愉快的定义Windows消息了。

标签:

评论已关闭。