在vc6.0中我们新建一个多文档应用程序,如果我们为应用程序类添加ON_FILE_NEW消息响应,响应的消息响应函数为OnFileNew(),当我们单击“文件-新建”菜单时,就会调用该函数,不会调用基类的函数CWinApp::OnFileNew()。
但是在VS2008中,我们进行同样的操作时,跟踪调试发现引用程序仍会调用CWinApp::OnFileNew(),而且不会调用子类的OnFileNew函数,这是什么原因呢?
原因在与消息映射,我们对比一下VC60和VS2008中应用程序中的消息映射:
vc6.0中如下:
BEGIN_MESSAGE_MAP(CDipApp, CWinApp)
//{{AFX_MSG_MAP(CDipApp)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
ON_COMMAND(ID_FILE_NEW, OnFileNew)
ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
//}}AFX_MSG_MAP
// Standard file based document commands
ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
// Standard print setup command
ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
END_MESSAGE_MAP()
在VS2008中
BEGIN_MESSAGE_MAP(CImageProcessApp, CWinApp)
ON_COMMAND(ID_APP_ABOUT, &CImageProcessApp::OnAppAbout)
// 基于文件的标准文档命令
ON_COMMAND(ID_FILE_NEW, &CWinApp::OnFileNew)
ON_COMMAND(ID_FILE_OPEN, &CWinApp::OnFileOpen)
// 标准打印设置命令
ON_COMMAND(ID_FILE_PRINT_SETUP, &CWinApp::OnFilePrintSetup)
ON_COMMAND(ID_FILE_OPEN, &CImageProcessApp::OnFileOpen)
ON_COMMAND(ID_FILE_NEW, &CImageProcessApp::OnFileNew)
END_MESSAGE_MAP()
通过对比我们发现是因为映射宏顺序不同的原因:在VS2008中,ON_COMMAND(ID_FILE_NEW, &CWinApp::OnFileNew)在前,所以执行的时候调用了CWinApp::OnFileNew,不在调用子类的OnFileNew,如果将ON_COMMAND(ID_FILE_NEW, &CImageProcessApp::OnFileNew)写在ON_COMMAND(ID_FILE_NEW, &CWinApp::OnFileNew)前,就会调用子类的OnFileNew,不会调用基类的OnFileNew。