MFC - 无法将消息发布到从CWnd派生的自定义类

时间:2014-06-18 22:29:27

标签: c++ winapi visual-c++ mfc message-queue

我有一个从CWnd派生的自定义类,我想从工作线程发布消息。我正在使用PostMessage函数来实现这一目标。 PostMessage的第一个参数是我的类的HWND类型句柄,接下来是我想要处理的消息。对于第一个参数,我使用GetSafeHwnd()函数生成我的类的句柄,对于第二个参数,我使用WM_USER + 3。另外,我在类头文件中声明了一个消息映射,并在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP块中添加了一个消息处理程序的条目。但是,我的处理程序没有被调用。我还检查了PostMessage函数的返回值,它是1,表示成功。

这是我的代码:

在MyClass.h内部

class CMyClass : CWnd
{
....
.... 
public:
void InitHandle();

protected:
afx_msg LRESULT OnMessageReceived(WPARAM wParam, LPARAM lParam);
DECLARE_MESSAGE_MAP()
} 

在MyClass.cpp内部

#define WM_MY_MESSAGE WM_USER+3

HWND handleToMyClassWindow;

BEGIN_MESSAGE_MAP(CMyClass, CWnd)
    ON_MESSAGE(WM_MY_MESSAGE, OnMessageReceived)
END_MESSAGE_MAP()

LRESULT CMyClass::OnMessageReceived(WPARAM wParam, LPARAM lParam)
{ .... }

void CMyClass::InitHandle()
{ 
    handleToMyClassWindow = GetSafeHwnd();
}

Inside Worker线程

UINT WorkerThreadFunction(LPVOID pParam )
{ 
....
PostMessage(handleToMyClassWindow, WM_MY_MESSAGE, NULL, NULL);
....
}

我的问题是,没有调用OnMessageReceived处理程序的可能原因是什么。

P.S。

我注意调用对象调用InitHandle()函数。

我尝试使用与我的程序的View类(从CView派生)相同的技术,它在那里工作,但在这里失败。

1 个答案:

答案 0 :(得分:1)

如果尚未创建,则无法发布到窗口。如果你没有使用你的类实际创建一个窗口,GetSafeHwnd()将返回NULL。