四、消息映射机制
4.1 消息映射的声明宏(DECLARE_MESSAGE_MAP())—写到.h文件中
4.2 消息映射的分界宏(BEGIN_MESSAGE_MAP()、 END_MESSAGE_MAP())—写到.cpp文件中
4.3 找消息处理函数的映射入口—写到 分界宏 中间
4.4 把消息处理函数的函数原型的声明—写到.h文件中
4.5 把消息处理函数的函数原型的实现—写到.cpp文件中
4.1 消息映射的声明宏(DECLARE_MESSAGE_MAP())—写到.h文件中
4.2 消息映射的分界宏(BEGIN_MESSAGE_MAP()、 END_MESSAGE_MAP())—写到.cpp文件中
4.3 找消息处理函数的映射入口—写到 分界宏 中间
4.4 把消息处理函数的函数原型的声明—写到.h文件中
4.5 把消息处理函数的函数原型的实现—写到.cpp文件中
比如:键盘消息处理函数的映射入口为ON_WM_CHAR();
键盘消息处理函数的函数原型为afx_msg void OnChar(UINT, UINT, UINT);
还有鼠标按下消息ON_WM_LBUTTONDOWN(),绘图消息ON_WM_PAINT()等
示例如下:
1、mfc.h代码如下:
#include <afxwin.h> //mfc的头文件
//类1
class MyApp :public CWinApp //CWinApp应用程序类
{
public:
//程序入口
virtual BOOL InitInstance();
};
//类2
class MyFrame:public CFrameWnd //窗口框架类
{
public:
MyFrame();
/*
为了支持消息映射,MFC提供了下列宏:
消息映射的声明宏:
DECLARE_MESSAGE_MAP 声明将在一个类中使用消息映射,把消息映射到函数(必须用在类声明中)
消息映射的分界宏:
BEGIN_MESSAGE_MAP 开始消息映射的定义(必须用在类实现中)
END_MESSAGE_MAP 结束消息映射的定义(必须用在类实现中)
*/
DECLARE_MESSAGE_MAP() //在窗口框架类的声明中:写消息映射的声明宏
//函数原型
afx_msg void OnLButtonDown(UINT, CPoint);
afx_msg void OnChar(UINT, UINT, UINT);
afx_msg void OnPaint();
};
2、mfc.cpp中的代码如下:
/*
函数实现
*/
#include "mfc.h"
MyApp app; //全局应用程序对象,有且仅有一个
BOOL MyApp::InitInstance() //实现类1中的虚函数
{
/*
分两步构造一个CFrameWnd对象。
首先,调用构造函数来构造CFrameWnd对象;
然后,调用Create来构造Windows框架窗口并把它附加给CFrameWnd对象;
Create初始化窗口的类名、窗口名,登记它的风格、父窗口和相关菜单的缺省值。
*/
//1.创建窗口对象
MyFrame* frame = new MyFrame;
//2.显示和更新
frame->ShowWindow(SW_SHOWNORMAL);
frame->UpdateWindow();
//3.保存指向应用程序的主窗口的指针
m_pMainWnd = frame;
return TRUE; //返回正常的初始化
}
/*
为了支持消息映射,MFC提供了下列宏:
声明宏:
DECLARE_MESSAGE_MAP 声明将在一个类中使用消息映射,把消息映射到函数(必须用在类声明中)
分界宏:
BEGIN_MESSAGE_MAP 开始消息映射的定义(必须用在类实现中)
END_MESSAGE_MAP 结束消息映射的定义(必须用在类实现中)
*/
//分界宏
BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)
//将消息映射入口 写到分界宏之间
ON_WM_LBUTTONDOWN() //鼠标左键按下消息
ON_WM_CHAR() //键盘
ON_WM_PAINT() //绘图
END_MESSAGE_MAP()
MyFrame::MyFrame() //实现类2中的虚函数
{
Create(NULL, TEXT("mfc"));
}
//1.鼠标
void MyFrame::OnLButtonDown(UINT, CPoint point)
{
/*方法1:
TCHAR buf[1024];
wsprintf(buf, TEXT("x=%d,y=%d"), point.x, point.y);
MessageBox(buf);*/
//方法2.字符串格式化:mfc中的字符串 CString
CString str;
str.Format(TEXT("x=%d;y=%d"), point.x, point.y);
MessageBox(str);
}
//2.键盘
void MyFrame::OnChar(UINT key, UINT, UINT)
{
CString str;
str.Format(TEXT("按下了%c键"), key);
MessageBox(str);
}
//3.绘图
void MyFrame::OnPaint()
{
CPaintDC dc(this);
//书写文字
dc.TextOutW(100, 100, TEXT("你好"));
//画椭圆
dc.Ellipse(150, 150, 250, 250);
}