C++ CreateWindowEx() 无法创建 window

C++ CreateWindowEx() fails to create window

我已经开始观看手工制作的英雄视频,我正在尝试制作 win32 window,但 CreateWindowEx() 函数一直失败。

我检查了错误代码,我得到了 1407。

代码如下。

提前致谢。

    #include <Windows.h>

LRESULT CALLBACK WindowProcedure(
    HWND hwnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam
    )
{
    LRESULT result;

    switch (uMsg)
    {
    case WM_ACTIVATEAPP:
        {
            OutputDebugStringA("The window is now active");

            break;
        }

    case WM_SIZE:
        {
            OutputDebugStringA("The window is now being resized");

            break;
        }

    case WM_CREATE:
        {
            OutputDebugStringA("The window has been created");

            break;
        }

    default:
        {
            result = DefWindowProc(hwnd, uMsg, wParam, lParam);

            break;
        }
    }

    return result;
};

int CALLBACK WinMain(
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow
    )
{
    WNDCLASS GameWindow;

    GameWindow.style = CS_OWNDC|CS_HREDRAW|CS_VREDRAW;
    GameWindow.lpfnWndProc = WindowProcedure;
    GameWindow.hInstance = hInstance;
//      HICON     hIcon;
    GameWindow.lpszClassName = "HandmadeHeroWindowClass";

    RegisterClass(&GameWindow);

    if (HWND GameWindowHandle = CreateWindowEx(
        0,
        GameWindow.lpszClassName,
        "Handmade Hero",
        WS_OVERLAPPEDWINDOW | WS_VISIBLE,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        0,
        0,
        hInstance,
        0
        ))
    {

        for (;;)
        {
            MSG message;
            BOOL messageResult = GetMessage(&message, GameWindowHandle, 0, 0);
            if (messageResult != 0)
            {
                DispatchMessage(&message);
            }
            else if (messageResult == 0)
            {
                break;
            }
            else
            {
                // ERROR
            }
        }

    }
    else
    {
        OutputDebugStringA("Couldn't create window");
    }

    DWORD error = GetLastError();

    return 0;
};

您的 window 过程 returns 除了 default: 之外的每个路径中都有一个未初始化的变量,这是未定义的行为并且 window 创建失败是完全可能的。

对于 WM_CREATE,文档说:

If an application processes this message, it should return zero to continue creation of the window.


正如迈克尔在评论中指出的那样,RegisterClass 失败了。同一类错误,您传递的 WNDCLASS 结构使大多数成员未初始化。

感谢 Remy Lebeau 的回答,问题是我的 WNDCLASS 对除我更改的字段之外的所有字段都有未初始化的值,这导致 RegisterClass() 失败,因此 CreateWindowEx() 失败。

我将 WNDCLASS 声明更改为:

WNDCLASS GameWindow = {0};

感谢所有帮助过的人。