2013-03-25 54 views
0

我想在MFC中有一個消息處理程序,它接受我在消息映射中定義的任何參數。mfc - 帶自定義參數的sendmessage/postmessage

例如,

static UINT UWM_STATUS_MSG = RegisterWindowMessage("Status message"); 
static UINT UWM_GOT_RESULT= RegisterWindowMessage("Result has been obtained"); 

//{{AFX_MSG(MyClass) 
    afx_msg void OnCustomStringMessage(LPCTSTR); 
    afx_msg void OnStatusMessage(); 
//}}AFX_MSG 


BEGIN_MESSAGE_MAP(MyClass, CDialog) 
    //{{AFX_MSG_MAP(MyClass) 
     ON_REGISTERED_MESSAGE(UWM_STATUS_MSG, OnStatusMessage) 
     ON_REGISTERED_MESSAGE(UWM_GOT_RESULT, OnCustomStringMessage) 
    //}}AFX_MSG_MAP 
END_MESSAGE_MAP() 

void MyClass::OnCustomStringMessage(LPCTSTR result) 
{ 
    m_result.SetWindowText(result); 
} 

void MyClass::OnStatusMessage() 
{ 
    // Do something 
} 

DWORD WINAPI MyClass::thread(LPVOID lParam) 
{ 
    char result[256] = { 0 }; 
    SendMessage(UWM_STATUS_MSG); 

    // Do some stuff and store the result 

    PostMessage(UWM_GOT_RESULT, result); 
} 

這種事可能嗎?

回答

1

,其經由ON_MESSAGE調用或ON_REGISTERED_MESSAGE必須的成員函數的簽名:

AFX_MSG LRESULT OnMyFunction(WPARAM P1,P2 LPARAM);

你必須使用演員操作符處理。

因此,你應該這樣寫:

... 
afx_msg LRESULT OnCustomStringMessage(WPARAM p1, LPARAM p2); 
... 

LRESULT MyClass::OnCustomStringMessage(WPARAM p1, LPARAM p2) 
{ 
    LPCTSTR result = (LPCTSTR)p1 ; 
    m_result.SetWindowText(result); 
} 

DWORD WINAPI MyClass::thread(LPVOID lParam) 
{ 
    static char result[256] = { 0 }; // we need a static here 
             // (see explanations from previous answers) 
    SendMessage(UWM_STATUS_MSG); 

    // Do some stuff and store the result 

    PostMessage(UWM_GOT_RESULT, (WPARAM)result); 
} 

如果MyClass的::線程是指從幾個不同的線程調用,你需要在一個更compilcated方式,只是宣稱它來對付結果陣列靜態,例如在MyClass :: thread中分配數組,並按照user2173190的答案所建議的方式將其刪除到OnCustomStringMessage中。

+0

所以沒有辦法繞過'WPARAM'和'LPARAM'變量作爲參數?我只是認爲所有這些鑄造和額外的變數都是不必要的。我想知道是否有一些更適合我的任務的其他消息處理方法。因此,這個問題。謝謝你的回答! – 2013-03-25 10:10:23

+0

另外,關於「結果」,是的。但這只是我想要的一些小示範。我會照顧這一切的。謝謝:) – 2013-03-25 10:11:04

+0

不,你不能將其他類型的參數傳遞給這樣的成員函數。如果您擔心額外的變量,您也可以編寫「m_result.SetWindowText((LPCTSTR)p1)」。 – 2013-03-25 12:37:42

0

嘗試使用WM_USER消息作爲自定義消息,並通過覆蓋它來在OnMessage方法中處理它。要了解WM_USER消息,請參閱here

+0

ON_MESSAGE會有同樣的問題。它期望消息處理程序接受「WPARAM」和「LPARAM」類型參數。 – 2013-03-25 10:00:27

0

如果將WM_USER下面的範圍內的消息發送到異步消息函數(PostMessage,SendNotifyMessage和SendMessageCallback),則其消息參數不能包含指針。否則,操作將失敗。這些函數將在接收線程有機會處理消息之前返回,發送者在使用之前釋放內存。

PostMessage的消息參數可以包含指針 您可以包含指針作爲參數。將它們作爲整數進行投射,並且不會將它們釋放或釋放到觸發PostMessage的線程或函數上,而是將它們處理或釋放到接收線程或函數中。 只要確保在使用指針時,對一條消息只使用一種指針類型,請勿將指針混合到具有相同消息的不同對象。

http://msdn.microsoft.com/zh-cn/library/windows/desktop/ms644944(v=vs.85).aspx

+0

我可以通過指針,正確。但是,如果我想傳遞物體或什麼都不傳遞呢?這是不可能的。 – 2013-03-25 09:59:40