C ++ CreateWindowEx()无法创建窗口

时间:2015-04-05 17:01:36

标签: winapi

我开始观看手工制作的英雄视频,我试图创建一个win32窗口,但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;
};

2 个答案:

答案 0 :(得分:1)

您的窗口过程在除default:之外的每个路径中返回一个未初始化的变量,这是未定义的行为,并且完全可以创建窗口失败。

对于WM_CREATE,文档说:

  

如果应用程序处理此消息,则应返回零以继续创建窗口。


迈克尔在评论中指出,RegisterClass失败了。同样的错误,您通过了WNDCLASS结构,大多数成员都未初始化。

答案 1 :(得分:1)

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

我将WNDCLASS声明更改为:

WNDCLASS GameWindow = {0};

感谢所有帮助过的人。