2

虽然我有丰富的软件经验,但我没有做过大量的 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 所说的here。

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)

谁能让我知道问题是什么?

谢谢阅读。

保罗

4

3 回答 3

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()有关更多信息,请参阅文档。

于 2013-03-18T10:30:31.627 回答
0

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

于 2013-03-18T10:20:48.800 回答
-1

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

使 CMyApp 类扩展 CWnd 类:

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

编辑

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

于 2013-03-18T10:23:52.277 回答