MFC的消息映射目前原生不支持lambda的方式来写入,我们可以利用编译器来实现lambda的支持,因为lambda是一个静态类型,所以这里实现非常的简单,
MFC的消息映射要求是一个成员函数,并且保证函数的类型。
我这里也是实现一个成员函数,这是一个模板函数:
template<auto Fun, typename... Args> afx_msg auto Lambda(Args... arg) -> decltype(Fun(arg...)) { if constexpr (std::is_same_v<decltype(Fun(arg...)), void>) { Fun(arg...); } else { return Fun(arg...); } }
这里通过模板参数传递一个lambda,和采用可变长类型参数来实现。
示例:
对于普通的消息采用的void(CCmdTarget::*)()的一种约定方式
ON_COMMAND(23456,Lambda<[](){}>)
对于携带消息的:
ON_MESSAGE(34567, (Lambda < [](WPARAM a, LPARAM b) {return LRESULT(1); }, WPARAM,LPARAM >) )
这里要注意一点,就是在lambda实现的时候,出现逗号会影响ON_MESSAGE的参数隔断,所以这里整个Lmbda模板函数加一对小括号,来表示一个整体。