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