为什么在此功能中使用LRESULT CALLBACK?

时间:2014-05-06 19:42:32

标签: c++ c

最近,我开始学习DX11,我试图在WinAPI中创建消息循环。我在教程中看到了一个我以前没见过的LRESULT CALLBACK函数。它在Window Procedure函数中调用。这是WndProc函数和MessageHandler函数(我正在谈论的函数)。

的WndProc:

LRESULT CALLBACK WndProc(HWND hwnd, UINT umessage, WPARAM wparam, LPARAM lparam)
{
switch(umessage)
{
    // Check if the window is being destroyed.
    case WM_DESTROY:
    {
        PostQuitMessage(0);
        return 0;
    }

    // Check if the window is being closed.
    case WM_CLOSE:
    {
        PostQuitMessage(0);     
        return 0;
    }

    // All other messages pass to the message handler in the system class.
    default:
    {
        return ApplicationHandle->MessageHandler(hwnd, umessage, wparam, lparam);
    }
}
}

的MessageHandler:

LRESULT CALLBACK SystemClass::MessageHandler(HWND hwnd, UINT umsg, WPARAM wparam, LPARAM lparam)
{
switch(umsg)
{
    // Check if a key has been pressed on the keyboard.
    case WM_KEYDOWN:
    {
        // If a key is pressed send it to the input object so it can record that state.
        m_Input->KeyDown((unsigned int)wparam);
        return 0;
    }

    // Check if a key has been released on the keyboard.
    case WM_KEYUP:
    {
        // If a key is released then send it to the input object so it can unset the state for that key.
        m_Input->KeyUp((unsigned int)wparam);
        return 0;
    }

    // Any other messages send to the default message handler as our application won't make use of them.
    default:
    {
        return DefWindowProc(hwnd, umsg, wparam, lparam);
    }
}
}

我不明白的是,为什么我们在MessageHandler函数中添加了“LRESULT CALLBACK”部分?我知道,我们必须将它添加到WndProc函数中,但我没有明白创建一个新函数并添加一个调用约定。如果我们不向MessageHandler函数添加任何调用约定怎么办?如果我们没有创建MessageHandler函数并将KEY_DOWN侦听器写入WndProc的switch-case语句会怎么样?

这些代码在一个类中,ApplicationHandler指针指向“this”。

2 个答案:

答案 0 :(得分:4)

没有明显的理由将SystemClass::MessageHandler声明为CALLBACK,因为它不能用作Windows的消息处理程序,因为它不是static。 {/ 1}}没有理由在您显示的代码中声明为SystemClass::MessageHandler

答案 1 :(得分:3)

关于CALLBACK__stdcall):
从“Windows内”调用的函数必须是stdcall,因为Windows开发人员决定编写/编译它调用stdcall函数的Windows。从理论上讲,可以使用任何CC,但Windows和您的代码必须具有相同的功能 如果您只在自己的程序代码中使用它,那么您自己的功能将不再需要它。

LRESULT(某些int /指针式的东西)只是返回类型 不只是写int(或类似的东西)的原因是LRESULT是一个具有一定长度等的int,如果MS因某种原因决定改变它,他们只需要改变{的定义{1}},但不是每个具有LRESULT返回类型的函数。