四、消息映射机制
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); }