最近读到windows核心编程 作者制作的chHANDLE_DLGMSG 对话框消息处理宏
这个宏直接调用的windowsx.h里的另一个宏:
可以看到,如果消息是以上列出的消息之一,这些是对话框需要特定返回值的消息,则直接返回"result" 的结果,
如果是其他消息,则返回TRUE表示已经处理过此消息,返回FALSE表示没有处理,没有处理的消息将交由系统的"对话框管理器处理"
从第二个宏可以看到,如果是其他消息,则必然返回TRUE
既然返回了TRUE,那为什么还要在返回之前调用SetWindowLongPtr函数呢.
原来是这样:
对话框回调函数的返回值跟消息的返回值是两码事,
对话框消息函数的返回值 是BOOL值 表示 是否处理了这条消息. TRUE表示已经处理
而消息的返回值是指处理的结果,一般用0表示处理成功
比如在窗口处理WM_CREATE消息的时候,申请内存失败,就有可能返回-1,windows就不会继续窗口的创建过程.
由第一个宏所知 result 其实就是 HANDLE_WM_**** 一系列宏,这些宏都是返回0.
因此,这里调用SetWindowLongPtr的目的是表示该消息处理成功.