昨天晚上和舍友聊天,彼此聊着自己的前女友,聊到最后,我们同时对彼此说了一句,你真贱。。。

----  网易云热评

一、消息映射机制的使用

不重写WindowProc,但也能处理消息

1、类必须派生自CCmdTarget,直接或间接都可以

CObject---CCmdTarget--CWnd--CFrameWnd--CMyFrameWnd--pFrame

CObject--CCmdTarget--CWinThread--CWinApp--CMyWinApp--theApp

2、类内必须添加声明宏 DECLARE_MESSAGE_MAP()

3、类外必须添加实现宏

BEGIN_MESSAGE_MAP(CMyFrameWnd,CFrameWnd)

END_MESSAGE_MAP()

4、宏展开各部分的作用

GetThisMessageMap() - 静态函数

定义一个静态数组 _messageEntries[]-保存了消息ID和处理消息函数

 定义一个静态变量 messageMap - 获取父类静态变量地址(连接链表),获取相应的静态数组首地址

返回静态变量的地址

GetMessageMap - 成员虚函数

返回 静态函数(GetThisMessageMap)返回的值(链表头节点)

 

二、框架代码编写

#include <afxwin.h>
//创建自己的框架类
class CMyFrameWnd:public CFrameWnd //CCmdTarget是CFramWnd的子类
{
DECLARE_MESSAGE_MAP()
};
BEGIN_MESSAGE_MAP(CMyFrameWnd,CFrameWnd)
END_MESSAGE_MAP()
//创建自己的应用程序类
class CMywinApp:public CWinApp
{
public:
virtual BOOL InitInstance();
};
CMywinApp theApp;
BOOL CMywinApp::InitInstance()
{
CMyFrameWnd* pFrame = new CMyFrameWnd;
pFrame->Create(NULL, "aiyou");
m_pMainWnd = pFrame;
pFrame->ShowWindow(SW_SHOW);
pFrame->UpdateData();
return TRUE;
}

 

三、处理创建窗口函数

1、在begin和end之间添加一个宏ON_MESSAGE(WM_CREATE,aiyou),参数是要处理窗口的ID,用哪个函数树立

2、类里面声明函数

class CMyFrameWnd:public CFrameWnd  //CCmdTarget是CFramWnd的子类
{
DECLARE_MESSAGE_MAP()
public:
LRESULT aiyou(WPARAM wParam,LPARAM lParam);
};

3、实现函数,也可以在上面的类里面实现

LRESULT CMyFrameWnd::aiyou(WPARAM wParam, LPARAM lParam) {
AfxMessageBox("WM_CREAT消息被处理");
return 0;
}

 

四、处理画图函数

1、添加宏

ON_MESSAGE(WM_PAINT, bucuo)

2、添加声明函数

LRESULT bucuo(WPARAM wParam, LPARAM lParam);

3、实现函数

LRESULT CMyFrameWnd::bucuo(WPARAM wParam, LPARAM lParam) {
PAINTSTRUCT ps = { 0 };
HDC hdc = ::BeginPaint(m_hWnd, &ps);
::TextOut(hdc, 100, 100, "hello", 5);
::EndPaint(m_hWnd, &ps);
return 0;
}

4、运行效果

MFC消息映射机制_MFC

 

欢迎关注公众号:顺便编点程

MFC消息映射机制_消息映射_02

MFC消息映射机制_消息映射_03