2012-10-01 59 views
0

我想知道windows消息循環的正確返回值是什麼。到目前爲止,我已經使用了以下情況:win32消息循環 - 我應該打破還是返回?

case WM_LBUTTONDOWN: // left mouse button pressed. 
    if (condition == true) 
    { 
     do_something(); 
    } 
break; 

,但我也看到了諸如:

if (IDC_BUTTON == LOWORD(wParam) && BN_CLICKED == HIWORD(wParam)) 
{ 
    do_something(); 
    return true; 
} 
break; 

哪一個是正確的?我應該return true?或者我應該break?重要嗎?

編輯這取決於我是否正在按按鈕或鼠標移動?

+0

他們是完全不同的:取決於上下文。 –

+0

@LuchianGrigore它取決於消息嗎?有什麼區別?我應該什麼時候使用哪個? – memyself

+2

這不是一個消息循環,這是一個窗口過程。它很大程度上取決於它是如何編程的,特別是在調用DefWindowProc()的時候會發生什麼。返回值是LRESULT,返回* true *幾乎從不正確。但很少被注意到。它也可能是一個對話框過程,return * true *仍然是錯誤的,但更正確一點。 –

回答

4

返回值在MSDN上記錄,作爲每條消息文檔的一部分。例如,WM_LBUTTONDOWN的文檔聲明

如果應用程序處理此消息,它應返回零。

對於其他消息,返回值可能更有意義。你應該總是閱讀文檔,從不猜測。

+0

這個。您需要了解正在處理的消息。有些消息是有意義的,但要繼續將它們傳遞給其他窗口過程以進一步處理。有些人想說「我已經處理好了,我們在這裏完成了。」還有一些你想說的是,「我將在每條消息中做一些額外的處理,然後指出這條消息是否應該被視爲已完成。」 – Mordachai

1

如果使用break,則執行保留在當前函數中。它允許您設置結果變量並在返回之前一致地執行一些操作。但是如果你返回,你的執行將會到達調用函數,並且不會繼續執行你在當前函數中進一步執行的任何操作。所以沒有正確的變體 - 取決於你決定使用什麼:breakreturn。這取決於你自己的設計。

例如:

bool result; 

switch(msg) 
{ 
case WM_LBUTTONDOWN: 
    //do smth... 
    result=true; 
    break;//execution goes to (3) 
case WM_MOUSEMOVE: 
    //actions... 
    result=true; 
    break;//execution goes to (3) 
case WM_RBUTTONDOWN: 
    //some code... 
    //no break here! execution continues to the next event 
case WM_MWHEELUP: 
    //if WM_RBUTTONDOWN occured, execution continues to here and goes on 
    result=false;//maybe you need false here, I dont know 
    break;//processing WM_RBUTTONDOWN will stop only here, as well as processing WM_MWHEELUP 
case WM_USER1: 
    //lines of code.... 
    return true;//do not perform final actions starting from (3), but end up with this function immideately 
default: 
    result=false;  
} 

// (3) 
//perform some final actions... 

return result; 

它不依賴於什麼事件,你與互動。

2

無論您是break還是return都取決於上下文 - 即您希望在處理此消息後之後。如果你沒有什麼可以做的 - 你可能會立即返回。

,但當你從你的消息循環返回 - 確保你return 0;
根據MSDNIf an application processes this message, it should return zero