无法在BEGIN_MESSAGE_MAP中链接afx_msg

时间:2010-09-20 07:26:11

标签: c++ mfc windows-7

我正试图加入OnSysCommand函数,但是我遇到了一个令人困惑的错误。

在标题中,我声明了如下函数:

afx_msg void OnSysCommand(UINT nID, LPARAM lParam );

在cpp中,代码是:

BEGIN_MESSAGE_MAP(CMFCTest1App, CWinAppEx)
 ON_COMMAND(ID_APP_ABOUT, &CMFCTest1App::OnAppAbout)
 // Standard file based document commands
 ON_COMMAND(ID_FILE_NEW, &CWinAppEx::OnFileNew)
 ON_COMMAND(ID_FILE_OPEN, &CWinAppEx::OnFileOpen)
 ON_WM_SYSCOMMAND()
END_MESSAGE_MAP()

void CMFCTest1App::OnSysCommand(UINT nID, LPARAM lParam )
{
 AfxMessageBox(L"System command recieved");
}

编译时,我收到以下错误消息:

1>  MFCTest1.cpp
1>c:\users\dell3\documents\visual studio 2010\projects\mfctest1\mfctest1\mfctest1.cpp(43): error C2440: 'static_cast' : cannot convert from 'void (__thiscall CMFCTest1App::* )(UINT,LPARAM)' to 'void (__thiscall CWnd::* )(UINT,LPARAM)'
1>          Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>
1>Build FAILED.

当我尝试挂钩OnClose函数时,会发生同样的事情。任何建议将不胜感激。感谢。

3 个答案:

答案 0 :(得分:2)

将处理程序移出应用程序类并进入窗口或框架类。

这些消息应在窗口类(源自CWnd)中处理,而不是在您的应用类(源自CWinApp)中处理。

答案 1 :(得分:0)

我认为您的CMFCTest1App必须从CWnd继承。 无论如何,如果使用向导创建消息映射,则会更容易。

答案 2 :(得分:0)

您的CMFCTest1App课程不必继承CWnd。它的方式很好。此外,您可以将ID_FILE_OPEN等命令处理程序保留在该类中。这对初学者来说有点混乱,但它确实有意义。

OnSysCommand()消息处理程序不是这些异常之一。正如其他人已经提到的那样,它属于某个窗口。 WM_SYSCOMMAND doc. explains in detail它的作用。

所以,将命令处理程序移动到它所属的窗口,你很好。