1 消息映射
MFC的消息映射就是类似Qt的事件触发的信号和槽。例如左键被按下事件,触发了cliked按下信号,从而调用相应的槽函数。而MFC也一样,当消息发生,就会调用对应的回调函数。
处理一个消息映射的过程:
- 1)在要使用消息映射的类中声明消息映射宏DECLARE_MESSAGE_MAP()。
- 2)在上面类的.cpp文件定义该消息映射宏。
//分界宏
BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)
/*中间为将要注册的回调函数*/
ON_WM_LBUTTONDOWN() //鼠标左键按下
END_MESSAGE_MAP()
- 3)回调函数的声明,各种消息事件的回调函数需要查看msdn帮助文档。
- 4)在上面的分界宏中定义该回调函数。即这四步简记就是两声明两定义。
注意:除了第一步,其余三步的函数名字或者宏注册一般都需要参考帮助文档,因为记不住。
2 案例
下面我们利用消息映射实现鼠标左键被按下,然后执行回调函数,从而实现自己的逻辑。
mfc.h
#pragma once
#include <afxwin.h>
class MyAPP :public CWinApp {
public:
/* 重写程序入口函数,不需要利用构造调用该函数,该函数自动调用,类似main */
virtual BOOL InitInstance();
};
class MyFrameWnd :public CFrameWnd {
public:
MyFrameWnd();
~MyFrameWnd();
//声明宏 提供消息映射机制
DECLARE_MESSAGE_MAP();
//左键按下回调函数声明
afx_msg void OnLButtonDown(UINT, CPoint);
};
mfc.cpp
#include "mfc.h"
//有且只有一个应用程序app类对象
MyAPP myapp;
BOOL MyAPP::InitInstance()
{
// 1 创建窗口类对象(包括newMyFrameWnd对象和调用Create)
MyFrameWnd *frame = new MyFrameWnd;
// 2 显示和更新
frame->ShowWindow(SW_SHOWNORMAL);
frame->UpdateWindow();
//3 保存指向应用程序的主窗口的指针
m_pMainWnd = frame;
return TRUE;
}
MyFrameWnd::MyFrameWnd()
{
Create(NULL, TEXT("MFC"));
}
MyFrameWnd::~MyFrameWnd()
{
}
//分界宏
BEGIN_MESSAGE_MAP(MyFrameWnd, CFrameWnd)/* 参1边为派生类,参2为基类*/
ON_WM_LBUTTONDOWN() //鼠标左键按下
END_MESSAGE_MAP()
void MyFrameWnd::OnLButtonDown(UINT, CPoint point)
{
MessageBox(TEXT("左键被按下"));
}
结果: