虽然我有丰富的软件经验,但我没有做过很多Windows编程。我试图从线程发布WM_USER消息,以便在主UI线程中拾取,但我遇到了一些麻烦。这是在c++中使用VS2010和MFC。
我这样创建了一个消息映射,
#define WM_MYMSG (WM_USER + 77)
BEGIN_MESSAGE_MAP(CMyApp, CWinApp)
ON_MESSAGE(WM_MYMSG, DoSomething)
END_MESSAGE_MAP()
按如下方式声明处理程序函数,
afx_msg LRESULT DoSomething(WPARAM wParam, LPARAM lParam);
并将函数体写成
LRESULT CMyApp::DoSomething( WPARAM wParam, LPARAM lParam )
{
UNREFERENCED_PARAMETER(wParam);
UNREFERENCED_PARAMETER(lParam);
CallSomeFunction();
return 0L;
}
据我所知,这与MSDN所说的完全一致。
http://msdn.microsoft.com/en-gb/library/k35k2bfs (v = vs.100) . aspx
然而我得到了一个
error C2440: 'static_cast' : cannot convert from 'LRESULT (__cdecl CMyApp::*)(WPARAM,LPARAM)' to 'LRESULT (__cdecl CWnd::* )(WPARAM,LPARAM)'
与
行相关的ON_MESSAGE(WM_AVATAR_SCALE_MSG, DoSomething)
谁能告诉我是什么问题?感谢您的阅读。
保罗CMyApp继承自CWinApp, CWinApp继承自CWinThread。CWinThread用户定义的消息在它们的消息映射中使用一个特殊的宏来完成你想做的事情:
改变:
ON_MESSAGE(WM_AVATAR_SCALE_MSG, DoSomething)
:
ON_THREAD_MESSAGE(WM_AVATAR_SCALE_MSG, DoSomething)
假设DoSomething()
是CMyApp
类的成员。
查看ON_THREAD_MESSAGE()
的文档获取更多信息
问题是消息映射期望在CWnd上有一个函数,而您的类显然不是CWnd,要么实际上是CWnd,要么继承了CWnd。
该函数期望您传递一个CWnd方法,该方法接受一个WPARAM和一个LPARAM,但您传递的是CMyApp的一个函数。
让CMyApp类从CWnd类扩展出来:
class CMyApp : public CWnd {
// members here
};
编辑
如果这是不可能的,那么您将不得不找到一种方法来传递CWnd的函数或从CWnd扩展的类的任何其他函数,并使用正确的参数和返回类型。