HWND变为NULL

时间:2019-01-26 01:00:45

标签: c++ windows

我正在运行的代码:

#include <Windows.h>

int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    const auto pClassName = "direct3D";

    //register window class
    WNDCLASSEX wc = { 0 };
    wc.cbSize = sizeof(wc);
    wc.style = CS_OWNDC;
    wc.lpfnWndProc = DefWindowProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = nullptr;
    wc.hCursor = nullptr;
    wc.hbrBackground = nullptr;
    wc.lpszMenuName = pClassName;
    wc.hIconSm = nullptr;        
    RegisterClassEx(&wc);

    //create instance of window
    HWND hwnd = CreateWindowEx(
        0,
        pClassName, 
        "Direct3D", 
        WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU, 
        0, 0, 640, 480, 
        nullptr, nullptr, hInstance, nullptr 
    );
    ShowWindow(hwnd, SW_SHOW);


    //message pump

    MSG msg;
    int test = GetMessage(&msg, nullptr, 0, 0);
    while (GetMessage(&msg, nullptr, 0, 0) > 0) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }


    return 0;
}

预期输出: 我可以拖动,最小化或关闭的简单窗口。

错误: 没有错误被打印。 但是逐步执行可以显示hwnd:hwnd coming up NULL and a read error的值。我猜这与此有关。我浏览了有关该错误的MSDN文档,但没有帮助。我正在关注YouTube上Directx3d的教程。

1 个答案:

答案 0 :(得分:8)

您没有给Window类命名,即成员lpszClassName。相反,您设置的lpszMenuName肯定不是您想要的。

PS:您说:“没有打印错误” 。实际上,Win32不会打印错误,您有责任始终检查Win32函数调用的返回值(错误时{RegisterClassEx()返回0)。然后,如果失败,请致电GetLastError()以获取原因。您可以获取可用原因列表here。而且,如果需要,您现在可以在调试窗口stderr,您的日志文件中打印错误消息(请参见FormatMessage())。

您可能已经注意到,Internet上的教程通常会忽略错误处理,因为它很无聊,并且给他们想教的东西增加了噪音。但是在现实世界中,正确的错误检查始终是最好的主意。