首页 > 其他分享 >如何使MFC的消息映射支持lambda

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

时间:2023-04-27 10:16:23浏览次数:36  
标签:... MFC 映射 arg lambda Lambda

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

 

标签:...,MFC,映射,arg,lambda,Lambda
From: https://www.cnblogs.com/Super-biscuits/p/17358123.html

相关文章

  • 康托展开 全排列与其字典序的双映射转换
    对于给定的序列123,其全排列有6种,按照字典序从小到大即为01  23451,2,31,3,22,1,32,3,13,1,23,2,1可以看出,每个全排列序列都唯一对应一个字典序数(从0开始),那么,有什么方法可以根据序列求出其对应的字典序或者根据字典序来推断其对应序列呢一个朴素的思想,我们使用深搜......
  • MFC-TextOut绘制文本
     HDChdc=::GetDC(m_hWnd);LOGFONTlf={0};lf.lfWeight=16;//平均宽度lf.lfHeight=40;//字体高度lf.lfCharSet=GB2312_CHARSET;//字符集lstrcpy(lf.lfFaceName,_T("宋体"));HFONThfont=::CreateFontIndirect(&lf)......
  • Java Lambda Stream
    ::方法使用条件:lambada表达式的主体仅包含一个表达式,且lambada表达式只调用一个已经存在的方法;被引用的方法的参数列表与lambada表达式的输入输出一致以下是Java8中方法引用的一些语法:静态方法引用(staticmethod)语法:classname::methodname例如:Person::getAge对象的实例方......
  • 对数据库中存储的程序进行现代化改造,以使用 Amazon Aurora PostgreSQL 联合查询、pg_c
    作为数据库迁移和现代化的一部分,您可以继续使用存储的程序和调度作业,将远程实例中的数据整合到集中式数据存储中。 AmazonSchemaConversionTool(AmazonSCT)可帮助您将传统的Oracle和SQLServer函数转换为其等效的开源函数。但是,如何继续使用存储的程序从远程数据库中提取数......
  • (转载)MFC下一个类调用另一个类中变量的解决方法
    https://blog.csdn.net/xiaqunfeng123/article/details/39207517/ 假如有类A,类B两个类。如果想在B中调用A的成员函数,该怎么办呢?方法一:在类B的cpp文件中包含A类的头文件,然后在B的需要调用A的函数的函数中,添加#include"A.h"B::funcB(){Aa;a.funcA();}由于类A的funcA不是静态(st......
  • MFC-GetBkMode获取指定DC的背景混合模式
     HDChdc=::GetDC(m_hWnd);LOGFONTlf={0};lf.lfWeight=16;//平均宽度lf.lfHeight=40;//字体高度lf.lfCharSet=GB2312_CHARSET;//字符集lstrcpy(lf.lfFaceName,_T("宋体"));HFONThfont=::CreateFontIndirect(&lf)......
  • MFC-SetBkMode设置指定DC的背景混合模式
     HDChdc=::GetDC(m_hWnd);LOGFONTlf={0};lf.lfWeight=16;//平均宽度lf.lfHeight=40;//字体高度lf.lfCharSet=GB2312_CHARSET;//字符集lstrcpy(lf.lfFaceName,_T("宋体"));HFONThfont=::CreateFontIndirect(&lf)......
  • MFC-SetTextColor设置指定DC中的文字颜色
     HDChdc=::GetDC(m_hWnd);LOGFONTlf={0};lf.lfWeight=16;//平均宽度lf.lfHeight=40;//字体高度lf.lfCharSet=GB2312_CHARSET;//字符集lstrcpy(lf.lfFaceName,_T("宋体"));HFONThfont=::CreateFontIndirect(&lf);//创建......
  • Java8 Lambda表达式教程
    1.什么是λ表达式 λ表达式本质上是一个匿名方法。让我们来看下面这个例子:   publicintadd(intx,inty){       returnx+y;   }转成λ表达式后是这个样子:       (intx,inty)->x+y;参数类型也可以省略,Java编译器会根据上下文推断出来:  ......
  • MFC-SetWindowPos改变窗口的尺寸,位置和Z序
     HWNDhWnd=::FindWindow(_T("Notepad"),NULL);//获取记事本窗口if(!hWnd){AfxMessageBox(_T("请打开记事本"));ExitProcess(0);}BOOLb=::SetWindowPos(hWnd,HWND_TOP,100,100,500,400,SWP_SHOWWINDOW);//改......