0

我想知道 Windows 消息循环的正确返回值是什么。到目前为止,我已经使用了以下内容:

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?有关系吗?

编辑这是否取决于我是在与按钮按下还是鼠标移动进行交互?

4

3 回答 3

4

返回值记录在 MSDN 上,作为每条消息的文档的一部分。例如,WM_LBUTTONDOWN的文档指出

如果应用程序处理此消息,它应该返回零。

对于其他消息,返回值可能更有意义。您应该始终阅读文档,永远不要猜测。

于 2012-10-01T18:12:31.863 回答
2

是您break还是return取决于上下文 - 即您在处理此消息后希望做什么。如果您无事可做 - 您可以立即返回。

但是,当您确实从消息循环中返回时 - 请确保您return 0;
根据MSDNIf an application processes this message, it should return zero

于 2012-10-01T18:35:26.660 回答
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;

它不取决于您正在与之交互的事件。

于 2012-10-01T18:12:04.047 回答