一、消息映射机制的使用
不重写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、运行效果