我正试图加入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
函数时,会发生同样的事情。任何建议将不胜感激。感谢。
答案 0 :(得分:2)
将处理程序移出应用程序类并进入窗口或框架类。
这些消息应在窗口类(源自CWnd
)中处理,而不是在您的应用类(源自CWinApp
)中处理。
答案 1 :(得分:0)
我认为您的CMFCTest1App必须从CWnd继承。 无论如何,如果使用向导创建消息映射,则会更容易。
答案 2 :(得分:0)
您的CMFCTest1App
课程不必继承CWnd
。它的方式很好。此外,您可以将ID_FILE_OPEN
等命令处理程序保留在该类中。这对初学者来说有点混乱,但它确实有意义。
OnSysCommand()
消息处理程序不是这些异常之一。正如其他人已经提到的那样,它属于某个窗口。 WM_SYSCOMMAND doc. explains in detail它的作用。
所以,将命令处理程序移动到它所属的窗口,你很好。