MFC/C++学习系列之简单记录8——消息映射

发布于:2024-12-22 ⋅ 阅读:(41) ⋅ 点赞:(0)

MFC/C++学习系列之简单记录8——消息映射

  • 前言
  • 消息映射机制
    • DoDataExchange 函数
    • BEGIN_MESSAGE_MAP 和 END_MESSAGE_MAP 宏
    • 与WPF对比
  • 总结


前言

每天学习一点MFC的小知识!


消息映射机制

说起来很高大上,其实就是前端界面控件和后台代码命名的绑定。当前端控件执行某些操作时,需要把这个事件或消息映射到MFC的成员类上。通过这种方式让后台代码可以响应前端事件和消息,完成指定操作。

具体代码是什么呢?

在这里插入图片描述
首先,我在界面上放置了一个按钮和Tab控件。后端如何知道前端控件的呢?

DoDataExchange 函数

用于在对话框控件和对应的变量之间进行数据交换的函数。

void CMFCtest1Dlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_TAB1, Tab1);
	DDX_Control(pDX, IDC_BUTTON1, m_Btn1);
}
  • DDX_Control 宏用于将对话框中的控件与类中的控件变量进行关联。
  • IDC_TAB1 控件与 Tab1 成员变量关联
  • IDC_BUTTON1 控件与 m_Btn1 成员变量关联。
    这里通过DoDataExchange函数,利用DDX_Control 宏将按钮与成员变量关联。在界面前端,放置控件时,需要添加变量,才能有变量关联操作!
    在这里插入图片描述

BEGIN_MESSAGE_MAP 和 END_MESSAGE_MAP 宏

BEGIN_MESSAGE_MAP(CMFCtest1Dlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON1, &CMFCtest1Dlg::OnBnClickedButton1)
	ON_NOTIFY(TCN_SELCHANGE, IDC_TAB1, &CMFCtest1Dlg::OnTcnSelchangeTab1)
END_MESSAGE_MAP()
  • 用于将Windows消息和控件通知映射到类的成员函数。
  • ON_WM_SYSCOMMAND() 映射系统命令消息到 OnSysCommand 函数。
  • ON_WM_PAINT() 映射绘画消息到 OnPaint 函数。
  • ON_WM_QUERYDRAGICON() 映射查询拖动图标的消息到 OnQueryDragIcon 函数。
  • ON_BN_CLICKED与ON_NOTIFY就是我们自己定义的事件处理程序的映射。这里的按钮映射了一个点击事件,这里的Tab映射了一个选择切换事件。
    在这里插入图片描述
    这里要注意类列表的选择,如果Btn控件在Dlg1中的控件选择了Dlg2的类列表,会出现Dlg2中无Btn1控件而报错!

与WPF对比

在WPF中,.xaml文件中定义控件名称,并在后面直接可以添加事件或双击控件添加。这时,界面前端的代码中会具体显示事件函数名称,而后端会主动生成对应的函数。

//前端
<Button x:Name="button" Content="Button" HorizontalAlignment="Left" Margin="112,187,0,0" VerticalAlignment="Top" Width="75" Click="button_Click"/>
//后端
 private void button_Click(object sender, RoutedEventArgs e)
{

}

相对于MFC的添加事件,在使用上来说,WPF的事件生成更容易,上手更简单!


总结

本文介绍了MFC的消息映射,并举例说明,同时也与WPF语言进行了对比。