关于MFC消息响应的一点注意事项


       在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。











你可能感兴趣的:(关于MFC消息响应的一点注意事项)