MFC/C++学习系列之简单记录8——消息映射
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语言进行了对比。