2014-06-18 24 views
1

我有一個從CWnd派生的自定義類,我想從工作線程發佈消息。我正在使用PostMessage函數來實現這一點。 PostMessage的第一個參數是我的類的HWND類型句柄,接下來是我想要處理的消息。對於第一個參數,我使用GetSafeHwnd()函數爲我的類生成句柄,對於第二個參數,我使用WM_USER + 3。另外,我在我的類頭文件中聲明瞭一個消息映射,並在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP塊內爲消息處理程序添加一個條目。但是,我的處理程序沒有被調用。我也檢查了PostMessage函數的返回值,它是1,這意味着成功。MFC - 不能將消息發送到從CWnd派生的自定義類

這裏是我的代碼:

內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(); 
} 

內部工作線程

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

我的問題是,什麼是可能的reaso ns用於OnMessageReceived處理程序不被調用。

P.S.

我注意調用對象調用InitHandle()函數。

我試過與我的程序的View類(從CView派生)相同的技術,它在那裏工作,但在這裏失敗。

+1

不要使用'WM_USER',請使用'WM_APP'。某些標準控件也使用了'WM_USER'範圍 - 您可能會註冊兩次相同的消息。 –

+0

@MarkRansom,我試過WM_APP,它仍然沒有工作。另外,如果我將處理程序添加到我的程序的View類,我的代碼就可以工作,但如果添加到我的自定義類中,它不起作用。 – user2654449

+0

下面是另一個有趣的事情:從類Explorer中,我右鍵單擊CMyClass,並打開屬性框。我在CMyClass的消息列表中看不到我的消息。 – user2654449

回答

1

如果尚未創建,則無法發佈到窗口。如果你沒有用你的類實際創建一個窗口,GetSafeHwnd()將返回NULL。

+0

我檢查了一下,確實發生了什麼事情。 – user2654449

+0

你能否給我提示如何爲CMyClass創建一個窗口?對於CMyClass,我不需要GUI,所以我希望窗口保持隱形。 – user2654449

+1

調用它的CreateWindow。 –