如何使MFC的消息映射支持lambda

发布时间 2023-04-27 10:06:44作者: 饼干`

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模板函数加一对小括号,来表示一个整体。