天天看点

MFC消息响应

▲通过类向导给类添加一个消息响应函数时(如在CMainFrame类中添加WM_CLOSE消息响应),会增加以下3代码段:

1.头文件CMainFrame.h类的定义中

//{{AFX_MSG(CMainFrame)      //注释宏

afx_msg void OnClose();          //添加的消息响应函数原型声明

//}}AFX_MSG                            //注释宏

afx_msg也是一个宏,表示后面的函数原型为消息响应函数原型。 

2.源文件MainFrame.cpp中

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)

//{{AFX_MSG_MAP(CMainFrame)

ON_WM_CLOSE()                              //添加的宏

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

ON_WM_CLOSE()宏将消息WM_CLOSE与消息响应函数OnClose()关联起来。

3.源文件MainFrame.cpp中

void CMainFrame::OnClose()

{

 // 响应消息时的处理代码写在此处

CFrameWnd::OnClose();

}

▲MFC的消息处理是靠调用OnWndMsg()来处理的,其过程是先检查有没有消息响应函数原型声明(1中所述),再检查有无消息响应函数关联宏(2中所述),若检查通过则用3中所述的函数响应指定消息,否则使用默认消息处理函数。

▲通过代码添加的控件,若要添加消息响应函数,可以按照1,2,3的步骤手动写代码。但在2中,由于注释宏之间的宏由类向导管理,因此,对于手动添加的代码应写在注释宏之外。

▲从CCmdTarget派生的类可以接受WM_COMMAND消息,但不能接受标准消息

从CWnd派生的类可以接受标准消息和WM_COMMAND消息

▲WM_COMMAND消息首先发送给框架类,框架类再交给子窗口(视类),视类检查是否有响应函数,有则处理返回,无则将消息交给文档类,文档类检查是否有响应函数,有则处理返回,无则将消息交还给视类,视类又将消息交还给框架类,框架类检查是否有响应函数,有则处理返回,无则将消息交给应用类,应用类完成消息的处理或返回。

继续阅读