使用MFC创建WM_USER处理程序

时间:2013-03-18 10:19:04

标签: c++ windows mfc

虽然我有很多软件经验,但我没有做过大量的Windows编程。我试图从一个线程发布WM_USER消息,以便它在主UI线程中被拾取,但我遇到了一些麻烦。这是使用VS2010和MFC的C ++。

我已经创建了一个消息映射,

#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)

任何人都可以告诉我这是什么问题吗?

感谢阅读。

3 个答案:

答案 0 :(得分:5)

CMyApp继承自CWinApp,后者继承自CWinThread。 CWinThread用户定义的消息在其消息映射中采用特殊的宏来表示您想要执行的操作:

改变这个:

ON_MESSAGE(WM_AVATAR_SCALE_MSG, DoSomething)

对此:

ON_THREAD_MESSAGE(WM_AVATAR_SCALE_MSG, DoSomething)

假设DoSomething()是您CMyApp班的成员。

有关详细信息,请参阅ON_THREAD_MESSAGE()上的文档。

答案 1 :(得分:0)

问题在于消息映射需要CWnd上的函数,而您的类显然不是CWnd,无论是实际上是这样还是从CWnd继承。

答案 2 :(得分:-1)

该函数希望您传递一个带有WPARAM和LPARAM的CWnd方法,但是您传递的是CMyApp函数。

使CMyApp类扩展到CWnd类:

class CMyApp : public CWnd {
    // members here
};

修改

如果这是不可能的,那么你将不得不找到一种方法来传递CWnd的函数或者使用正确的参数和返回类型扩展CWnd的类的任何其他函数。